😼

ターミナルエミュレータkittyの出力結果をVimで開く方法

2021/12/11に公開

ターミナルで出力された結果をスクロールしたり、コピーしたりするとき、どうやっているでしょうか。
筆者は長いことマウスでスクロールしたり選択したりしていました。
しかし、こういった作業も基本的にキーボードで行いたい(あくまで好み)と考えていたので、別の方法を探していました。

ターミナルエミュレータアプリ、kittyのscrollback bufferという機能を使えば、出力結果を任意のページャで開くことができます。

https://sw.kovidgoyal.net/kitty/overview/#the-scrollback-buffer

今回はこれを使って出力結果をVimに渡す設定を紹介します。

scrollback bufferの設定

kittyの設定はconfigファイル(デフォルトは~/.config/kitty/kitty.conf)に記述します。

サンプルは公式サイトのconfigurationページからダウンロードできます。

https://sw.kovidgoyal.net/kitty/conf/#sample-kitty-conf

起動キーの設定

show_scrollbackというマッピングで起動キーを設定できます。デフォルトではkitty_mod+hで起動します。
筆者はこれは変更していません。

kitty.conf
# default
# map kitty_mod+h show_scrollback

ページャの設定

今回の本題です。
scrollback bufferを開くアプリケーションは、scrollback_pagerという項目で指定します。デフォルトではlessになっているので、これをVim(筆者の場合はNeovim)に設定します。

kitty.conf
# default
# scrollback_pager less --chop-long-lines --RAW-CONTROL-CHARS +INPUT_LINE_NUMBER

scrollback_pager nvim --noplugin -u ~/dotfiles/.config/nvim/min-edit.vim -c "setlocal autowriteall" -c "autocmd TermOpen * normal G" -c "silent write! /tmp/kitty_scrollback_buffer | te cat /tmp/kitty_scrollback_buffer - "

普段使用しているinit.vimにはプラグインやlspなどの設定が入っているのですが、scrollback_pagerとしては不要なものがほとんどです。
そこで、キーマップなどに限定したミニマルな設定ファイルを作成し、-uオプションで呼び出しています。

https://github.com/kawarimidoll/dotfiles/blob/master/.config/nvim/min-edit.vim

setlocal autowriteallをしているのは終了時に保存確認の警告が出るのが煩わしいため、autocmd TermOpen * normal Gをしているのはバッファの最新行へ移動するためです。

良いところ

scroll bufferの良いところは、「Vim移動モード」とかではなく 本当にVimで開いている ところです。
当然、Vimの機能はすべて使えますし、必要ならば各種プラグインの追加も可能です。



curlの出力結果の一部をコピーするサンプル

筆者はVimのキーマップを少し変更している(Hで行頭、Lで行末に移動 など)ので、他のターミナルに組み込まれている「Vimモード」だと微妙にミスマッチがあり、かえって操作がしづらいと感じていました。
しかし、kittyならば「そのままVimで開く」というソリューションにより、自分好みの環境で使用できます。

おわりに

kittyのscroll buffer機能の紹介でした。
kittyでVimを使っている方は試してみてはいかがでしょうか。

また、他のターミナルでも同様の機能があったらコメントに情報をいただけると嬉しいです。

参考

こちらのissueのコメントが元ネタです。

https://github.com/kovidgoyal/kitty/issues/719#issuecomment-708874700

issue内の他のコメントで、いくつか別のコマンド例も提示されているので、興味のある方はご覧ください。

Discussion