📘
fishをemacs+vimバインドで使う
はじめに
fishをvimバインドで使うには $HOME/.config/fish/functions/fish_user_key_bindings.fish
で fish_vi_key_bindings
を呼び出せばいいんだけどinsert modeではemacsバインドも使いたいという贅沢な要望を叶えるための設定を紹介する。
defaultバインドの設定
insert, default, visual各モードのバインドをdefaultバインドで初期化しておく。
for mode in insert default visual
fish_default_key_bindings -M $mode
end
vimバインドの設定
上で設定したバインドを消さないように --no-erase
を付けてvimバインドを設定する。
fish_vi_key_bindings --no-erase
Starshipのprompt表示の設定
promptを華やかにするためにStarshipを使っているんだけれど、ここまでの設定だとmodeに応じたprompt characterの変更が機能しない。
--no-erase
を付けるとfishの変数 fish_key_bindings
が insert
に固定されてしまうことが原因の模様。
fish_key_bindings
呼び出し後に fish_key_bindings
を下記に変更する。
set fish_key_bindings fish_vi_key_bindings
まとめ
まとめた設定は下記。
- C-gでESCと同じ動作ができること
- fzf用の設定
も合わせて記載している。
$HOME/.config/fish/functions/fish_user_key_bindings.fish
function fish_user_key_bindings
for mode in insert default visual
fish_default_key_bindings -M $mode
end
fish_vi_key_bindings --no-erase
set fish_key_bindings fish_vi_key_bindings
bind -s --preset \cg cancel
bind -s --preset -M insert \cg "if commandline -P; commandline -f cancel; else; set fish_bind_mode default; commandline -f backward-char repaint-mode; end"
bind -s --preset -M visual -m default \cg end-selection repaint-mode
bind -s --preset -M replace_one -m default \cg cancel repaint-mode
bind -s --preset -M replace -m default \cg cancel repaint-mode
fzf_key_bindings
end
これでinsertモードではemacsバインド (C-n, C-p, etc.) が使えて、ESCでdefaultモード (vimのノーマルモード) に移ってB, Wなどで単語移動してテキストオブジェクトを活用した編集ができる。
おまけ
端末はこんな感じ。
Discussion