# ____ ____ # / __/___ / __/ # / /_/_ / / /_ # / __/ / /_/ __/ # /_/ /___/_/ 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 'builtin' 'emulate' 'zsh' && 'builtin' 'setopt' 'no_aliases' { if [[ -o interactive ]]; then __fzf_defaults() { # $1: Prepend to FZF_DEFAULT_OPTS_FILE and FZF_DEFAULT_OPTS # $2: Append to FZF_DEFAULT_OPTS_FILE and FZF_DEFAULT_OPTS echo "--height ${FZF_TMUX_HEIGHT:-40%} --bind=ctrl-z:ignore $1" command cat "${FZF_DEFAULT_OPTS_FILE-}" 2> /dev/null echo "${FZF_DEFAULT_OPTS-} $2" } # CTRL-T - Paste the selected file path(s) into the command line __fzf_select() { setopt localoptions pipefail no_aliases 2> /dev/null local item FZF_DEFAULT_COMMAND=${FZF_CTRL_T_COMMAND:-} \ FZF_DEFAULT_OPTS=$(__fzf_defaults "--reverse --walker=file,dir,follow,hidden --scheme=path" "${FZF_CTRL_T_OPTS-} -m") \ FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd) "$@" < /dev/tty | while read -r item; do echo -n -E "${(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}$(__fzf_select)" local ret=$? zle reset-prompt return $ret } if [[ "${FZF_CTRL_T_COMMAND-x}" != "" ]]; then 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 fi # ALT-C - cd into the selected directory fzf-cd-widget() { setopt localoptions pipefail no_aliases 2> /dev/null local dir="$( FZF_DEFAULT_COMMAND=${FZF_ALT_C_COMMAND:-} \ FZF_DEFAULT_OPTS=$(__fzf_defaults "--reverse --walker=dir,follow,hidden --scheme=path" "${FZF_ALT_C_OPTS-} +m") \ FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd) < /dev/tty)" if [[ -z "$dir" ]]; then zle redisplay return 0 fi zle push-line # Clear buffer. Auto-restored on next prompt. BUFFER="builtin cd -- ${(q)dir:a}" zle accept-line local ret=$? unset dir # ensure this doesn't end up appearing in prompt expansion zle reset-prompt return $ret } if [[ "${FZF_ALT_C_COMMAND-x}" != "" ]]; then 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 fi # CTRL-R - Paste the selected command from history into the command line fzf-history-widget() { local selected setopt localoptions noglobsubst noposixbuiltins pipefail no_aliases noglob nobash_rematch 2> /dev/null # Ensure the module is loaded if not already, and the required features, such # as the associative 'history' array, which maps event numbers to full history # lines, are set. Also, make sure Perl is installed for multi-line output. if zmodload -F zsh/parameter p:{commands,history} 2>/dev/null && (( $+commands[perl] )); then # Import commands from other shells if SHARE_HISTORY is enabled, as the # 'history' array only updates after executing a non-empty command. selected="$( if [[ -o sharehistory ]]; then fc -RI fi printf '%s\t%s\000' "${(kv)history[@]}" | perl -0 -ne 'if (!$seen{(/^\s*[0-9]+\**\t(.*)/s, $1)}++) { s/\n/\n\t/g; print; }' | FZF_DEFAULT_OPTS=$(__fzf_defaults "" "-n2..,.. --scheme=history --bind=ctrl-r:toggle-sort --wrap-sign '\t↳ ' --highlight-line ${FZF_CTRL_R_OPTS-} --query=${(qqq)LBUFFER} +m --read0") \ FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd))" else selected="$(fc -rl 1 | awk '{ cmd=$0; sub(/^[ \t]*[0-9]+\**[ \t]+/, "", cmd); if (!seen[cmd]++) print $0 }' | FZF_DEFAULT_OPTS=$(__fzf_defaults "" "-n2..,.. --scheme=history --bind=ctrl-r:toggle-sort --wrap-sign '\t↳ ' --highlight-line ${FZF_CTRL_R_OPTS-} --query=${(qqq)LBUFFER} +m") \ FZF_DEFAULT_OPTS_FILE='' $(__fzfcmd))" fi local ret=$? if [ -n "$selected" ]; then if [[ $(awk '{print $1; exit}' <<< "$selected") =~ ^[1-9][0-9]* ]]; then zle vi-fetch-history -n $MATCH else # selected is a custom query, not from history LBUFFER="$selected" 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 fi } always { eval $__fzf_key_bindings_options 'unset' '__fzf_key_bindings_options' }