Neovim最先端のextuiでcool & smartなcmdlineを手に入れよう
Neovimの開発repoで、extuiという機能を導入するPRがマージされました。本記事執筆時点ではexperimentalで、stable release版には含まれていません。HEADビルドやnightly版(:version
でv0.12.0-nightly-xxxxxx
のような表示が出るもの)を使用する必要があります。
いくつかのPRはimplemented in #27855で閉じられています。複数の要望をextuiにまとめて実装したようです。
設定例
筆者はいまのところ以下のように設定しています。本体の部分は:h extui
のサンプルそのままですが、筆者は設定ファイルを複数の環境で共有しているため、バージョンが異なる環境でもエラーにならないようpcallで確認を挟んでいます。
local ok, extui = pcall(require, 'vim._extui')
if ok then
extui.enable({
enable = true, -- extuiを有効化
msg = {
pos = 'cmd', -- 'box'か'cmd'だがcmdheight=0だとどっちでも良い?(記事後述)
box = {
timeout = 5000, -- boxメッセージの表示時間 ミリ秒
},
},
})
end
extuiはcmdheight = 0
との相性がバツグンなので、あわせて設定することをおすすめします。
vim.opt.cmdheight = 0
以下のような機能があります。
コマンドラインのシンタックスハイライト
コマンドがハイライトされるようになります。色は使用しているカラースキームによります。
cmdlineのハイライト例
cmdheight=0状態でもコマンド入力の間はcmdheight=1になる
これまではcmdheight=0状態でコマンドラインに入ると、最下行がそのままコマンドラインになり、ステータスラインを隠してしまっていました。
以下の解説を書いた当時は、これを回避するためにCmdlineEnter
とCmdlineLeave
のautocmdを使って手動でcmdheightを更新していましたが、extuiを設定しておけばよくなりました。
echo表示位置の変更
pos = 'box'
を設定すると、表示が右下にフローティングウィンドウとして出るようになります。…が、どうやらcmdheight = 0
ではpos = 'cmd'
でもbox表示がされるようです。
:echo 'hello'
の結果 右下に注目
このミニウィンドウはbox = { timeout = 5000 }
の部分で設定した時間で勝手に消えるので、hit-enter-promptが出ません。以下の記事のようなテクニックが不要になります。
:message
のフローティングウィンドウ化
:message
で出るメッセージ一覧がウィンドウとなり、その中で出力をコピーできるようになります。
:message
の結果
これまではcapture.vimなどでコマンドの出力を一度バッファに書き出す操作が必要だったのですが、extuiにより本体だけでこれを行えるようになりました。
試した限りでは、以下のような一覧系コマンドがウィンドウ化されるようですが、ヘルプで詳細な説明がないため、他にも対象となるものがあるかもしれません。
:history
:oldfiles
:highlight
:command
-
:autocmd
/:augroup
-
:nmap
などmap系
また、このウィンドウはmsgmore
というファイルタイプが設定されています。これに関してもヘルプが未整備の状態です。
良さそう
これを有効にして数日使ってみましたが、表示がスマートになってとても良い感じのlook and feelです。
現状はexperimental featureなので、カバーされていない問題が残っていたり破壊的変更が入ったりする可能性はあります(おそらく正式版になったら_extui
ではなくextui
になるでしょう)。動向をウォッチしつつ使っていきたいと思います。
Discussion