Neovim + oil.nvim + Weztermで頑張って画像を表示する
TLDR
oil.nvimで画像を選択し、Weztermで画像を表示。 画像はこちらから
- Neovimで画像と向き合う方法を紹介
- Quicklookを呼び出す方法は簡単
- 今回はWeztermとoil.nvimをフル活用して、Terminal上で画像を表示する方法を紹介をメインに紹介
はじめに
Vimmerたるもの、普段はTerminalに引きこもっているものです。
特にVim(Neovim)上で作業をすることが多いはず。
しかし、Terminalが苦手なファイルも存在します。
ご存じ、画像ファイルです。
これまで、自分は画像ファイルを見たいときは
-
open
コマンドで画像を開く(MacならPreviewで開く) -
open .
でFinderを開いて画像を見る
としてきましたが、やはり画像を見たいためだけにFinderを立ち上げたりアプリを起動、終了するのは面倒です。
そこで、これらを改善することにしました。
本記事では、ファイラとしてoil.nvim
を使った例を紹介しますが、他のファイラでも同様のことができるはずです。
また、設定はluaで書かれています。
Step 1: Quicklookを使う
macOS には標準でQuicklookという機能があります。
みなさん、一度はお世話になったことのある、Finderでファイルを選択してスペースキーを押すと、ファイルの中身をプレビューできるあれです。
実は、TerminalからもQuicklookを使うことができます。
qlmanage -p hoge.png
つまり、これをVim(Neovim)から呼び出せば、画像をプレビューできるはずです。
これで、oil.nvimで画像を選択し、Quicklookを呼び出すことができますね。
oil.nvimで画像を選択し、Quicklookを呼び出す
Step 2: Weztermを分割&画像表示
さて、Quicklookの方法にもまだ改善点があります。
- いちいちEscキーを押してQuicklookを閉じるのは面倒
- QuicklookにFocusが当たってしまうので、他のファイルを選択できない
というわけで、本命択はTerminal上で画像を表示したいわけです。
これまで、Vim/Neovimで画像を表示する試みはいくつかありました。
しかし、先の記事にも触れられているように、いくつか課題があります。
- 画像のサイズをいい感じに調整するのが難しい。
- gifをポンと渡しても再生されない。
そのため、今回はTerminalの機能を使って画像を表示することにしました。
自分の使用しているWeztermには、画像を表示する機能があります。
これにより、任意の画像をTerminal上で表示することができます。
またWeztermには wezterm cli
コマンドがあり、Weztermの動作をコマンドで制御することができます。
これらをフル活用して、次のような設定を行いました。
(以下、この機能のことをWezterm Previewと呼びます)
gp
を押すとWezterm Previewを起動
oil.nvimで
現在のNeovimが開かれているPane IDを取得
現在のPane IDを取得するには、環境変数 WEZTERM_PANE
を使います。
Weztermの画面を分割して、分割されたpaneのidを取得
Weztermで画面を分割するには、wezterm cli split-pane
コマンドを使います。
このコマンドの戻り値には、分割されたpaneのidが含まれています。
もしすでにpaneが分割されている場合は、そのpaneのidを取得します。
この時は wezterm cli list --format=json
コマンドを使います。
Neovimが開かれているPaneにFocusを戻す
oil.nvimでカーソルが動くたびに、Wezterm Previewを更新
まず、カーソルが選択しているファイルの情報を取得します。
そしてその情報を元に、もし新しいファイルであれば、WeztermのPreview用のPaneにコマンドを送って実行します。
この時
- ディレクトリであれば、
ls
コマンド - 画像ファイルであれば、
wezterm imgcat
コマンド - そのほかは
bat
コマンド
を実行するようにします。
Weztermでpaneにコマンドを送るには、 wezterm cli send-text
コマンドを使います。
oil.nvimが終了したら、Wezterm Previewを閉じる
oil.nvimの現在のバッファが閉じられたら、WeztermのPreview用のPaneも閉じるようにします。
コードの全体像
全体像
動作は冒頭のGIFをご覧ください。
まとめ
今回は、oil.nvimとWeztermを使って、Terminal上で画像を表示する方法を紹介しました。
まだプラグインとして公開してないのですが、要望があれば公開するかもしれません。
今回はWeztermの機能をフル活用しましたが、他のTerminal Emulatorでも同様のことができるはずです。
ぜひみなさんも、自分の環境に合わせて設定してみてください。
Discussion
めちゃくちゃ便利そうなので、ぜひpluginで公開して欲しいです!!
今更コメント見つけました!検討します!
ただし、年末には自分はweztermからghosttyに移行予定なので、また設定が変わりそうです。公開したらまた記事を書きますね