Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

Space2回でfzfを呼び出すzsh script

fzf、使っていますか?ぼくはそこそこ使ってはいるのですが、どうしてもC-tを押すのが面倒くさく感じてしまいます。そこで、$ vim<space><space>のようにspaceを2回続けて入力するとfzfが起動するようにしてみました。

(わかりづらいですがspaceを2回押してfzfを起動しているんです、信じてください)

コード

zsh で連続したスペースにキーバインドを割り当てる - Qiita

この記事を参考にして実装しました。

function _double_space_to_fzf() {
    if [[ "${LBUFFER}" =~ " $" ]]; then
        LBUFFER="${LBUFFER}$(__fsel)"
        local ret=$?
        zle redisplay
        return $ret
    else
        zle self-insert
    fi
}
zle -N _double_space_to_fzf
bindkey ' ' _double_space_to_fzf

カンタンにいうと

  1. spaceに_double_space_to_fzfというZLEウィジェットを登録します
  2. 直前がspaceならばspaceを入力せず、fzfを起動します
  3. 直前の文字がspaceでなければ、spaceをそのまま入力します

なぜfzf-file-widgetを使わないのか?

fzfはfzf-file-widgetというZLEウィジェットをC-tにバインドしています。そのため、fzf-file-widgetをそのまま使えばいいのではないか、と思うかもしれません。実際、上のコードのthen節はほとんどfzf-file-widgetそのままです。

function _double_space_to_fzf() {
    if [[ "${BUFFER}" =~ " $" ]]; then
        fzf-file-widget
    else
        zle self-insert
    fi
}
zle -N _double_space_to_fzf
bindkey ' ' _double_space_to_fzf

しかし、これだとzsh-autosuggestionsと競合してしまい表示がおかしくなってしまいます。fzf-file-widgetの typeset -f zle-line-init >/dev/null && zle zle-line-initという部分が原因のようなので、そこを除いて書き直しました。