aboutsummaryrefslogtreecommitdiff
path: root/fzf_key_bindings.zsh
diff options
context:
space:
mode:
Diffstat (limited to 'fzf_key_bindings.zsh')
-rw-r--r--fzf_key_bindings.zsh127
1 files changed, 127 insertions, 0 deletions
diff --git a/fzf_key_bindings.zsh b/fzf_key_bindings.zsh
new file mode 100644
index 0000000..6330614
--- /dev/null
+++ b/fzf_key_bindings.zsh
@@ -0,0 +1,127 @@
+# ____ ____
+# / __/___ / __/
+# / /_/_ / / /_
+# / __/ / /_/ __/
+# /_/ /___/_/ 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
+ eval "$cmd" | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $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 '^T' fzf-file-widget
+
+# Ensure precmds are run after cd
+fzf-redraw-prompt() {
+ local precmd
+ for precmd in $precmd_functions; do
+ $precmd
+ done
+ zle reset-prompt
+}
+zle -N fzf-redraw-prompt
+
+# 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 $FZF_DEFAULT_OPTS $FZF_ALT_C_OPTS" $(__fzfcmd) +m)"
+ if [[ -z "$dir" ]]; then
+ zle redisplay
+ return 0
+ fi
+ if [ -z "$BUFFER" ]; then
+ BUFFER="cd ${(q)dir}"
+ zle accept-line
+ else
+ print -sr "cd ${(q)dir}"
+ cd "$dir"
+ fi
+ local ret=$?
+ unset dir # ensure this doesn't end up appearing in prompt expansion
+ zle fzf-redraw-prompt
+ return $ret
+}
+zle -N fzf-cd-widget
+bindkey '\ec' fzf-cd-widget
+
+# CTRL-R - Paste the selected command from history into the command line
+fzf-history-widget() {
+ local selected num
+ setopt localoptions noglobsubst noposixbuiltins pipefail no_aliases 2> /dev/null
+ selected=( $(fc -rl 1 | perl -ne 'print if !$seen{(/^\s*[0-9]+\**\s+(.*)/, $1)}++' |
+ FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} $FZF_DEFAULT_OPTS -n2..,.. --tiebreak=index --bind=ctrl-r:toggle-sort $FZF_CTRL_R_OPTS --query=${(qqq)LBUFFER} +m" $(__fzfcmd)) )
+ local ret=$?
+ if [ -n "$selected" ]; then
+ num=$selected[1]
+ if [ -n "$num" ]; then
+ zle vi-fetch-history -n $num
+ fi
+ fi
+ zle reset-prompt
+ return $ret
+}
+zle -N fzf-history-widget
+bindkey '^R' fzf-history-widget
+
+} always {
+ eval $__fzf_key_bindings_options
+ 'unset' '__fzf_key_bindings_options'
+}