証拠
実際には単純なol 'を実行しているだけの代替ファイルはないため:bd
、現在のバッファーを削除します...せずに試してみて#
ください。結果は同じです。同様のことが:buffer
、:sbuffer
および#
引数として受け入れる少なくともいくつかの他のコマンドでも発生します。これらのコマンドは、引数が渡されなかったかのように静かに動作します。
あなたがしようとした場合、同じラインに沿って、:bunload #
このエラーが発生します:E90: Cannot unload last buffer
。:bunload
引数なしで実行すると、同じ結果が得られます。
ドキュメント
したがって#
、「何もない」(おそらく空の文字列)に置き換えられている証拠があります。ここからどこにいきますか?私はしばらくの間、この動作についての言及を見つけようとしてヘルプファイルをあちこち調べました。明確なものは何もありませんでした:h cmdline-lines
(1、2ページ下にスクロール)...
ファイル名が予想される場所に文字「%」または「#」が使用されている場合、それらは現在の代替ファイル名に展開されます。
私はそれをVim #
がexpand()
関数(つまりexpand('#')
)、または少なくともそこで使用されている同じ基本的なコードを通過させると読んだ
:h expand()
言う:
..特別なキーワードを展開します。..「%」または「#」を使用していて、現在のファイル名または代替ファイル名が定義されていない場合、空の文字列が使用されます。
おなじみの音。
コード
今、上記のどれも決定的ではないか、なぜかについての手掛かりを与えますか?だから私はもう少し時間を費やしました...今回はコード内で。私のCは非常にさびだと私は何か良いツールがインストールされていませんが、私はいくつかのセットアップを行う機能見つけることができた:bdelete
と呼ばれるがdo_bufdel()
。これによりbuflist_findpat()
、コマンドライン引数が送信され、#
遭遇した場合はvalueが返されますcurwin->w_alt_fnum
。これは代替バッファの「バッファ番号」です...私たちのシナリオでは正の値にすることはできません。(その戻り値が選択される前に、altファイルが有効/存在するかどうかのチェックはありません。)
do_bufdel()
チェックのバックアウトは、0未満のバッファー番号の戻り値に対して行われます。この場合、パラメーター処理ループは中断されます。その結果、コア:bdelete
コードにパラメーターが表示されなくなります...これは、以前の直感と一致しています。
次は何ですか?
明確なバグのように見えるものは何も見られなかったので、設計どおりに機能しているようです。おそらく脱落の罪かもしれませんが...見過ごされてきたため、適切な処理が行われていないコーナーケース。しかし、これを書いた開発者だけが確実に知っています。したがって、最後のステップは、入力を取得することです。以下のようクリスチャンB.は、前記のvim-devのリストに尋ねる行く方法です。
(注buflist_findpat()
それはそれを想定して想像力のストレッチを必要としないので、ユーティリティ関数である:bunload
、:buffer
などに対する彼らの共通の動作を説明するだろうと...あまりにも、それを使用しています#
。)
NVIM v0.3.0-dev
ます。