📘

fishをemacs+vimバインドで使う

2022/08/18に公開

はじめに

fishをvimバインドで使うには $HOME/.config/fish/functions/fish_user_key_bindings.fishfish_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_bindingsinsert に固定されてしまうことが原因の模様。
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