Last active
January 15, 2024 09:22
-
-
Save Gronis/4a33dc01b4f91890db9df4d6ab1c2340 to your computer and use it in GitHub Desktop.
fzf zsh history search ctrl-r
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
########################################################################### | |
# Put config here | |
########################################################################### | |
# alias ssh="kitty +kitten ssh" | |
alias ssh="TERM=xterm-256color ssh" | |
########################################################################### | |
# This is fzf key bindings for zsh on ctrl-r | |
########################################################################### | |
# ____ ____ | |
# / __/___ / __/ | |
# / /_/_ / / /_ | |
# / __/ / /_/ __/ | |
# /_/ /___/_/ key-bindings.zsh | |
# | |
# - $FZF_TMUX_OPTS | |
# - $FZF_CTRL_T_COMMAND | |
# - $FZF_CTRL_T_OPTS | |
# - $FZF_CTRL_R_OPTS | |
# - $FZF_ALT_C_COMMAND | |
# - $FZF_ALT_C_OPTS | |
# Key bindings | |
# ------------ | |
# The code at the top and the bottom of this file is the same as in completion.zsh. | |
# Refer to that file for explanation. | |
if 'zmodload' 'zsh/parameter' 2>'/dev/null' && (( ${+options} )); then | |
__fzf_key_bindings_options="options=(${(j: :)${(kv)options[@]}})" | |
else | |
() { | |
__fzf_key_bindings_options="setopt" | |
'local' '__fzf_opt' | |
for __fzf_opt in "${(@)${(@f)$(set -o)}%% *}"; do | |
if [[ -o "$__fzf_opt" ]]; then | |
__fzf_key_bindings_options+=" -o $__fzf_opt" | |
else | |
__fzf_key_bindings_options+=" +o $__fzf_opt" | |
fi | |
done | |
} | |
fi | |
'emulate' 'zsh' '-o' 'no_aliases' | |
{ | |
[[ -o interactive ]] || return 0 | |
# CTRL-T - Paste the selected file path(s) into the command line | |
__fsel() { | |
local cmd="${FZF_CTRL_T_COMMAND:-"command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \ | |
-o -type f -print \ | |
-o -type d -print \ | |
-o -type l -print 2> /dev/null | cut -b3-"}" | |
setopt localoptions pipefail no_aliases 2> /dev/null | |
local item | |
eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse --bind=ctrl-z:ignore ${FZF_DEFAULT_OPTS-} ${FZF_CTRL_T_OPTS-}" $(__fzfcmd) -m "$@" | while read item; do | |
echo -n "${(q)item} " | |
done | |
local ret=$? | |
echo | |
return $ret | |
} | |
__fzfcmd() { | |
[ -n "${TMUX_PANE-}" ] && { [ "${FZF_TMUX:-0}" != 0 ] || [ -n "${FZF_TMUX_OPTS-}" ]; } && | |
echo "fzf-tmux ${FZF_TMUX_OPTS:--d${FZF_TMUX_HEIGHT:-40%}} -- " || echo "fzf" | |
} | |
fzf-file-widget() { | |
LBUFFER="${LBUFFER}$(__fsel)" | |
local ret=$? | |
zle reset-prompt | |
return $ret | |
} | |
zle -N fzf-file-widget | |
bindkey -M emacs '^T' fzf-file-widget | |
bindkey -M vicmd '^T' fzf-file-widget | |
bindkey -M viins '^T' fzf-file-widget | |
# ALT-C - cd into the selected directory | |
fzf-cd-widget() { | |
local cmd="${FZF_ALT_C_COMMAND:-"command find -L . -mindepth 1 \\( -path '*/\\.*' -o -fstype 'sysfs' -o -fstype 'devfs' -o -fstype 'devtmpfs' -o -fstype 'proc' \\) -prune \ | |
-o -type d -print 2> /dev/null | cut -b3-"}" | |
setopt localoptions pipefail no_aliases 2> /dev/null | |
local dir="$(eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse --bind=ctrl-z:ignore ${FZF_DEFAULT_OPTS-} ${FZF_ALT_C_OPTS-}" $(__fzfcmd) +m)" | |
if [[ -z "$dir" ]]; then | |
zle redisplay | |
return 0 | |
fi | |
zle push-line # Clear buffer. Auto-restored on next prompt. | |
BUFFER="builtin cd -- ${(q)dir}" | |
zle accept-line | |
local ret=$? | |
unset dir # ensure this doesn't end up appearing in prompt expansion | |
zle reset-prompt | |
return $ret | |
} | |
zle -N fzf-cd-widget | |
bindkey -M emacs '\ec' fzf-cd-widget | |
bindkey -M vicmd '\ec' fzf-cd-widget | |
bindkey -M viins '\ec' fzf-cd-widget | |
# Grab code from here https://github.com/junegunn/fzf/blob/master/shell/key-bindings.zsh | |
# Replace this function. This will hide the history numbers when fuzzy-finding. | |
fzf-history-widget() { | |
local selected num | |
setopt localoptions noglobsubst noposixbuiltins pipefail no_aliases 2> /dev/null | |
selected=$(fc -rl 1 | awk '{ cmd=$0; sub(/^[ \t]*[0-9]+\**[ \t]+/, "", cmd); if (!seen[cmd]++) print cmd }' | | |
FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-17} ${FZF_DEFAULT_OPTS-} -n2..,.. --scheme=history --bind=ctrl-r:toggle-sort,ctrl-z:ignore ${FZF_CTRL_R_OPTS-} --query=${(qqq)LBUFFER} +m" $(__fzfcmd)) | |
local ret=$? | |
local selected_line=($(fc -rl 1 | grep -F "$selected" | awk '(NR == 1 || length < length(shortest)) { shortest = $0 } END { print shortest }')) | |
if [ -n "$selected" ]; then | |
num=$selected_line[1] | |
if [ -n "$num" ]; then | |
zle vi-fetch-history -n $num | |
fi | |
fi | |
zle reset-prompt | |
return ret | |
} | |
zle -N fzf-history-widget | |
bindkey -M emacs '^R' fzf-history-widget | |
bindkey -M vicmd '^R' fzf-history-widget | |
bindkey -M viins '^R' fzf-history-widget | |
} always { | |
eval $__fzf_key_bindings_options | |
'unset' '__fzf_key_bindings_options' | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment