zshで入力中のコマンドをすぐにNeovimで編集する方法
どうも。CX事業本部Delivery部のえーたん(@eetann092)です。
筆者はコマンド入力中に「長いコマンドをちょっと修正するためのカーソル移動が面倒だな」「Aは全部Bに置換したいな」と思うことがよくあります。
そんな時にZLE(Zsh Line Editor)のedit-command-line
が便利なので紹介します。
以下は、コマンド入力中にCtrl + o
を押してコマンドの文字列をNeovimで編集した例です。
コマンドの文字列を編集後、保存すると反映されます。実行まではされません。あくまでも文字列の編集です。
設定方法
以下が.zshrc
に書いた設定です。
autoload -Uz edit-command-line zle -N edit-command-line bindkey "^O" edit-command-line
1行ずつ説明します。
まず、autoload
を使って、関数edit-command-line
を読み込んでいます。
autoload -Uz edit-command-line
フラグU
で、自分の.zshrc
で設定したエイリアスを展開しないようにします。
フラグz
で、zshスタイルで読み込むように指定しています。フラグz
をつけず、オプションKSH_AUTOLOAD
やフラグk
のkshスタイルが指定されていると、読み込みたい関数にkshのautoloadの動作が追加されてしまうようです。
autoloadには他にもたくさんフラグがあるので、詳しくはman 1 zshbuiltins
のautoload
で確認してください。
次に、zle -N
で関数edit-command-line
をウィジェットとして割り当てています。
zle -N edit-command-line
最後に、bindkey
で登録したウィジェットedit-command-line
をCtrl + o
に割り当てています。
bindkey "^O" edit-command-line
どのキーバインドが余っているか知りたい場合は、bindkey
を引数無しで実行し、現在の割り当てを確認すると良いでしょう。
ちなみに筆者の環境では最初の2行を書かずにbindkey
の設定のみで動作しました。調べたところ、筆者が使っているプラグインOh My Zshによってすでに設定されていたためでした。Oh My Zshの実装を見ると、Ctrl + x
→Ctrl + e
にedit-command-line
を割り当てています。
Neovimでnowrapにしています
筆者は普段vim.opt.wrap = false
(折り返しなし)で生活しています。しかし、edit-command-line
で長いコマンドを編集する時は、全体をすぐに見渡せるように折り返しありにしています。
vim.api.nvim_create_autocmd({ "BufRead" }, { group = group_name, pattern = { "/tmp/*" }, callback = function() vim.opt_local.wrap = true end, })
おまけ。テトリスのウィジェットや関数がある
man 1 zshall
でマニュアルを漁っていたところ、テトリスを2つ発見しました。
以下のコマンドを実行すると、Ctrl + o
でテトリスができます。
autoload -U tetris zle -N tetris bindkey "^O" tetris
また、ウィジェットだけではなく、関数としても使えるようです。以下のコマンドを実行してもテトリスができます。
autoload -U tetriscurses tetriscurses
ウィジェット版は操作方法が書かれていますが、関数版にはありません。 逆に、関数版には次の形が表示されますが、ウィジェット版にはありません。