Neovim 0.13でq:のコマンドラインウィンドウが変わる
q:で開くコマンドラインウィンドウは、履歴を普通のバッファのように編集できる便利な機能です。ただ、あの中は独特の閉鎖空間でした。ウィンドウを分割しようとするとE11で断られ、別のファイルを開くこともできません。Neovim 0.13では、この特別扱いがやめになりました。中身は普通のバッファで、普通のコマンドが通ります。
検証環境:nightlyビルドのNVIM v0.13.0-dev-1336+g8c0bf18374と安定版のNVIM v0.12.4(macOS)で、CmdwinEnterのautocmdから同じコマンドを実行して結果を比べました。掲載しているバッファの属性と成否は実行結果です。0.13は開発中なので、リリースまでに細部が変わる可能性があります。
中で普通のコマンドが通る
コマンドラインウィンドウに入った直後に3つのコマンドを流してみました。0.12.4はすべて拒否し、0.13はすべて成功します。
コマンドラインウィンドウの中で実行
Neovim 0.12.4 Neovim 0.13
:split 失敗 成功
:edit ファイル 失敗 成功
:bnext 失敗 成功
0.12.4が返すのはE11: Invalid in command-line window; <CR> executes, CTRL-C quitsで、これはVimから受け継いだ制限です。コマンドラインウィンドウの中では実行と離脱しかできない、という設計でした。0.13ではこの制限が外れています。
バッファの属性も見えるようになりました。
| 項目 | Neovim 0.12.4 | Neovim 0.13 |
|---|---|---|
| バッファ名 | 空 | [Command Line] |
filetype | vim | vim |
buftype | nofile | nofile |
| 中で他のコマンド | E11で拒否 | 通る |
変わったのは名前と制限で、中身そのものは同じです。どちらのバージョンでも履歴の行が並んでいて、getcmdwintype()はコロンを返しました。名前が付いた効果は、バッファ一覧やステータスラインに何のウィンドウなのか出るようになる点にあります。これまでは名前が空だったので、画面上の手がかりが位置だけでした。
できるようになること
いちばん実用的なのは、履歴を見ながら別のバッファを行き来できることです。「あのファイルで打ったコマンドをもう一度」という場面で、ファイルを開いてから履歴を確認する、という順番の制約が消えます。
次に、コマンドラインウィンドウの中身をそのまま別のファイルへ書き出せます。長いコマンドを組み立てているうちに設定ファイルへ残したくなった、という場面で使えます。
" コマンドラインウィンドウの中身をファイルに残す
:w /tmp/history.vim
3つ目に、プラグインから扱いやすくなります。これまではコマンドラインウィンドウを検知したうえで、中では何もしないように書くのが定石でした。0.13ではバッファローカルのマッピングやautocmdを、他のバッファと同じ書き方で当てられます。
制限がなくなったわけではない
ヘルプには2つの変更が明記されています。ひとつは、コマンドラインの入れ子が1段までになったことです。コマンドラインウィンドウの中からさらにコマンドラインウィンドウを開く、という無限の再帰はできません。もうひとつは、式レジスタ(Ctrl-r=)の入力中にCtrl-fでコマンドラインウィンドウを開く経路が無くなったことです。どちらも実際に困る場面は少ないはずですが、あの入れ子で遊んでいた人には関係します。
もうひとつ、同じ流れで大きく変わったのがExモードです。gQで入っていた対話的なExモードは、コマンドラインウィンドウを常駐させたものとして作り直されました。入り方も1q:か:exmodeに変わり、gQは別の役割に回されています。Exモードを常用している人はほとんどいないはずですが、間違って入って抜けられなくなる事故のほうがむしろ減ります。
そもそもコマンドラインウィンドウとは
普段使っていない人向けに書いておくと、q:はコマンドの履歴をバッファとして開くものです。q/なら検索の履歴になります。長いコマンドを打ち間違えたとき、コマンドラインで矢印キーを押しながら直すのではなく、Vimの編集操作をそのまま使って直せるのが利点です。行の上でEnterを押すとその行が実行され、Ctrl-cで閉じます。
誤って開いてしまって戸惑う人が多い機能でもあります。:を押したあとにqを打ってしまうと出るので、「見慣れない小さいウィンドウが下に出た」という状態になります。閉じ方はCtrl-cか:qです。
検証していて意外だったのは、0.12.4でも履歴の中身自体は普通に読めたことです。てっきり全部が特別扱いだと思い込んでいたので、実際に違うのは「中で他のコマンドを打てるかどうか」と名前だけだと分かって、変更の範囲が想像より小さいことに気づきました。とはいえE11は地味に足を引っ張るエラーで、履歴を見ながら別のファイルを開こうとして断られた経験は何度もあります。日常の使い方が劇的に変わる類の話ではありませんが、あの行き止まりが消えるのは素直にうれしい変更です。
まとめ
Neovim 0.13のコマンドラインウィンドウは普通のバッファになり、:splitや:editや:bnextが中で通ります。0.12.4では同じ操作がE11で拒否されました。バッファに[Command Line]という名前が付いたので、一覧やステータスラインでも見分けが付きます。入れ子は1段までという制限と、式レジスタからのCtrl-fが無くなった点だけ押さえておけば、これまでどおりq:で開いてCtrl-cで閉じる使い方は変わりません。新しいテキストオブジェクトと同じく、0.13は細かい引っかかりを取り除く更新が続いています。