💘

Neovim最先端のextuiでcool & smartなcmdlineを手に入れよう

に公開

Neovimの開発repoで、extuiという機能を導入するPRがマージされました。本記事執筆時点ではexperimentalで、stable release版には含まれていません。HEADビルドやnightly版(:versionv0.12.0-nightly-xxxxxxのような表示が出るもの)を使用する必要があります。

https://github.com/neovim/neovim/pull/27855

いくつかのPRはimplemented in #27855で閉じられています。複数の要望をextuiにまとめて実装したようです。
https://github.com/neovim/neovim/pull/5189
https://github.com/neovim/neovim/pull/30406

設定例

筆者はいまのところ以下のように設定しています。本体の部分は:h extuiのサンプルそのままですが、筆者は設定ファイルを複数の環境で共有しているため、バージョンが異なる環境でもエラーにならないようpcallで確認を挟んでいます。

init.lua
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との相性がバツグンなので、あわせて設定することをおすすめします。

init.lua
vim.opt.cmdheight = 0

以下のような機能があります。

コマンドラインのシンタックスハイライト

コマンドがハイライトされるようになります。色は使用しているカラースキームによります。


cmdlineのハイライト例

cmdheight=0状態でもコマンド入力の間はcmdheight=1になる

これまではcmdheight=0状態でコマンドラインに入ると、最下行がそのままコマンドラインになり、ステータスラインを隠してしまっていました。
以下の解説を書いた当時は、これを回避するためにCmdlineEnterCmdlineLeaveのautocmdを使って手動でcmdheightを更新していましたが、extuiを設定しておけばよくなりました。

https://zenn.dev/kawarimidoll/books/6064bf6f193b51/viewer/602b98

echo表示位置の変更

pos = 'box'を設定すると、表示が右下にフローティングウィンドウとして出るようになります。…が、どうやらcmdheight = 0ではpos = 'cmd'でもbox表示がされるようです。


:echo 'hello'の結果 右下に注目

このミニウィンドウはbox = { timeout = 5000 }の部分で設定した時間で勝手に消えるので、hit-enter-promptが出ません。以下の記事のようなテクニックが不要になります。

https://zenn.dev/kawarimidoll/articles/68f5e8c362ee1c

:messageのフローティングウィンドウ化

:messageで出るメッセージ一覧がウィンドウとなり、その中で出力をコピーできるようになります。


:messageの結果

これまではcapture.vimなどでコマンドの出力を一度バッファに書き出す操作が必要だったのですが、extuiにより本体だけでこれを行えるようになりました。

https://github.com/tyru/capture.vim

試した限りでは、以下のような一覧系コマンドがウィンドウ化されるようですが、ヘルプで詳細な説明がないため、他にも対象となるものがあるかもしれません。

  • :history
  • :oldfiles
  • :highlight
  • :command
  • :autocmd / :augroup
  • :nmapなどmap系

また、このウィンドウはmsgmoreというファイルタイプが設定されています。これに関してもヘルプが未整備の状態です。

良さそう

これを有効にして数日使ってみましたが、表示がスマートになってとても良い感じのlook and feelです。
現状はexperimental featureなので、カバーされていない問題が残っていたり破壊的変更が入ったりする可能性はあります(おそらく正式版になったら_extuiではなくextuiになるでしょう)。動向をウォッチしつつ使っていきたいと思います。

Discussion