Panda Noir

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

コマンドラインの内容を vim で編集できるようにする

zsh で control-o を押すと vim が立ち上がってコマンドラインの内容を編集できる関数を(ChatGPTが)作ったので紹介します。

(要件を伝えたら ChatGPT が目当てのものを一発で生成したので、かなりビックリしました。すごい。)

デモ動画

youtu.be

デモ動画では、コマンドラインの「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
  1. control-O を押す
  2. エディタが立ち上がる
  3. 編集して保存する
  4. エディタを終了する
  5. 編集内容がコマンドラインに反映される

なお、エディタを正常に終了しないと変更内容は破棄されます。たとえば vim なら :cq で終了するとコマンドラインは変更されません。

これ、zsh の vim モードで良いのでは?とも思うんですが、zsh の vim モードは絶妙に使いづらいんですよね… デフォルトがインサートモードである、プラグインが使えないあたりが個人的に致命的でした。