zshでミスってCtrl-Cをして、空っぽになった入力を取り戻す

作成日: 2022-12-08
この記事はKMCアドベントカレンダー2022の6日目の記事です。
枠が空いているので小ネタ回その2です。
ターミナルで作業しているときに、Ctrl-Cを間違って押して入力がキャンセルされてしまうことがあります。
$ git comit -m "good message" ← ここでうっかりC-c
$ ← 空になっちゃう
ターミナルの前回の入力をマウスで選択してコピペをするという、美しくないリカバリが求められます。
この問題についてSlackで聞いてみると、素晴らしい回答が得られました。
.zshrcに次を書きます。そうすると、Ctrl-Cのときに、入力がkillされるようになります。killされた文字列はCtrl-yで復元できます。やったね。
# Ctrl-cをCtrl-yで回復できるようにする
trapint() {
  if zle; then
    if [[ $BUFFER == "" ]]; then
      zle get-line
    else
      zle kill-whole-line
      zle yank
      zle send-break
    fi
    zle reset-prompt
  fi
}
trap trapint INT
$ git comit -m "good message" ← ここでうっかりCtrl-c
$ ← 空になってもCtrl-yで
$ git comit -m "good message" ← 戻る
Ctrl-CがzshにSIGINTを送っているということに気づくと、trapで制御できることがわかりました。zshのエディタ機能であるzleの拡張性もえらいですね。
なお、direnvを使っている場合はtrap INTを取り合います。direnvの設定より後に書いてください。
今後は、C-qでstackする機能と使い分けていきたいです。