zsh で control-o を押すと vim が立ち上がってコマンドラインの内容を編集できる関数を(ChatGPTが)作ったので紹介します。
(要件を伝えたら ChatGPT が目当てのものを一発で生成したので、かなりビックリしました。すごい。)
デモ動画
デモ動画では、コマンドラインの「vim ~/.config/zsh/.zprofile.local」の .zprofile.local を .zshrc.local に変えています。僕は vimmer なので、emacs キーバインドを使うより格段に早く修正できています。
実際のスクリプト
実際のスクリプトがこちら↓
# コマンドラインをエディタで編集する関数 edit-command-line() { # 現在のコマンドラインを一時ファイルに書き出す local tmpfile=$(mktemp) print -rl -- $BUFFER > $tmpfile $EDITOR $tmpfile < /dev/tty # エディタが正常に終了した場合、一時ファイルの内容でコマンドラインを置き換え if [[ $? -eq 0 ]]; then BUFFER=$(<$tmpfile) zle reset-prompt fi rm -f $tmpfile } zle -N edit-command-line bindkey "^O" edit-command-line
- control-O を押す
- エディタが立ち上がる
- 編集して保存する
- エディタを終了する
- 編集内容がコマンドラインに反映される
なお、エディタを正常に終了しないと変更内容は破棄されます。たとえば vim なら :cq
で終了するとコマンドラインは変更されません。
これ、zsh の vim モードで良いのでは?とも思うんですが、zsh の vim モードは絶妙に使いづらいんですよね… デフォルトがインサートモードである、プラグインが使えないあたりが個人的に致命的でした。