81 lines
2.2 KiB
Fish
81 lines
2.2 KiB
Fish
# Key bindings
|
|
# ------------
|
|
function fzf_key_bindings
|
|
# Due to a bug of fish, we cannot use command substitution,
|
|
# so we use temporary file instead
|
|
if [ -z "$TMPDIR" ]
|
|
set -g TMPDIR /tmp
|
|
end
|
|
|
|
function __fzf_list
|
|
command find -L . \( -path '*/\.*' -o -fstype 'dev' -o -fstype 'proc' \) -prune \
|
|
-o -type f -print \
|
|
-o -type d -print \
|
|
-o -type l -print 2> /dev/null | sed 1d | cut -b3-
|
|
end
|
|
|
|
function __fzf_list_dir
|
|
command find -L . \( -path '*/\.*' -o -fstype 'dev' -o -fstype 'proc' \) \
|
|
-prune -o -type d -print 2> /dev/null | sed 1d | cut -b3-
|
|
end
|
|
|
|
function __fzf_escape
|
|
while read item
|
|
echo -n (echo -n "$item" | sed -E 's/([ "$~'\''([{<>})])/\\\\\\1/g')' '
|
|
end
|
|
end
|
|
|
|
function __fzf_ctrl_t
|
|
if [ -n "$TMUX_PANE" -a "$FZF_TMUX" != "0" ]
|
|
# FIXME need to handle directory with double-quotes
|
|
tmux split-window (__fzf_tmux_height) "cd \"$PWD\";fish -c 'fzf_key_bindings; __fzf_ctrl_t_tmux \\$TMUX_PANE'"
|
|
else
|
|
__fzf_list | fzf -m > $TMPDIR/fzf.result
|
|
and commandline -i (cat $TMPDIR/fzf.result | __fzf_escape)
|
|
commandline -f repaint
|
|
rm -f $TMPDIR/fzf.result
|
|
end
|
|
end
|
|
|
|
function __fzf_ctrl_t_tmux
|
|
__fzf_list | fzf -m > $TMPDIR/fzf.result
|
|
and tmux send-keys -t $argv[1] (cat $TMPDIR/fzf.result | __fzf_escape)
|
|
rm -f $TMPDIR/fzf.result
|
|
end
|
|
|
|
function __fzf_ctrl_r
|
|
history | fzf +s +m --tiebreak=index --toggle-sort=ctrl-r > $TMPDIR/fzf.result
|
|
and commandline (cat $TMPDIR/fzf.result)
|
|
commandline -f repaint
|
|
rm -f $TMPDIR/fzf.result
|
|
end
|
|
|
|
function __fzf_alt_c
|
|
# Fish hangs if the command before pipe redirects (2> /dev/null)
|
|
__fzf_list_dir | fzf +m > $TMPDIR/fzf.result
|
|
[ (cat $TMPDIR/fzf.result | wc -l) -gt 0 ]
|
|
and cd (cat $TMPDIR/fzf.result)
|
|
commandline -f repaint
|
|
rm -f $TMPDIR/fzf.result
|
|
end
|
|
|
|
function __fzf_tmux_height
|
|
if set -q FZF_TMUX_HEIGHT
|
|
set height $FZF_TMUX_HEIGHT
|
|
else
|
|
set height 40%
|
|
end
|
|
if echo $height | \grep -q -E '%$'
|
|
echo "-p "(echo $height | sed 's/%$//')
|
|
else
|
|
echo "-l $height"
|
|
end
|
|
set -e height
|
|
end
|
|
|
|
bind \ct '__fzf_ctrl_t'
|
|
bind \cr '__fzf_ctrl_r'
|
|
bind \ec '__fzf_alt_c'
|
|
end
|
|
|