なぜ:bd#代替バッファが存在しないときに現在のバッファを削除するのですか?


9

これが私が観察している行動を再現する方法です。

まず、次のコマンドを入力します。

echo aaaaa > a
vim a

Vimでは、次のコマンドを入力します。

:ls
:e #
:echo bufname('#')

上記の3つのコマンドの出力を次に示します。

:ls
  1 %a   "a"                            line 1

:e #
E194: No alternate file name to substitute for '#'

:echo bufname('#')

bufname('#')コマンドは出力を生成しません。

今、私はこのコマンドを入力します:

:bd #

現在のバッファーは削除され、「[名前なし]」バッファーに置き換えられます。

:ls
  2 %a   "[No Name]"                    line 1

E194実行時にエラーが発生すると予想していました:bd #。代わりに現在のバッファを削除したのはなぜですか?

使用していVIM - Vi IMproved 8.0ます。


1
それは興味深い点です。あなたの質問で、これはの場合にも当てはまることを言及できNVIM v0.3.0-devます。
クラウス

@LoneLearnerバウンティがあるため、実際にはこれに答えませんでしたが、もしあなたがそれを提供するつもりなら、それに値する賞にそれを授与するといいでしょう... alas、あなたはほとんどログインしていません週とバウンティ期間が終了しました...
Bレイヤー

1
@BLayer申し訳ありませんが、賞金を授与するのを忘れていました。あなたは素晴らしい答えを書きました。このStack Exchangeサイトで十分なポイントが得られたら、この質問に対する別の賞金を開始し、その賞金をあなたに授与します。それで私の間違いが修正されるといいのですが。あなたが書いた素晴らしい答えをありがとう。
Lone Learner

@LoneLearnerおい、どういたしまして、心配はいりません。コメントありがとうございます。賞金を心配する必要はありません。私が言ったように、それはポイントについてではありませんでした。私はあなたが賞金を次にかけるときのためにあなたに頭を上げたかっただけです。ここからポイントに向けて。乾杯!
Bレイヤー

回答:


7

証拠

実際には単純な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などに対する彼らの共通の動作を説明するだろうと...あまりにも、それを使用しています#。)


拡張バッファが存在するかどうかを確認するためのもう1つの関数が機能するだろうと思います。これは仕様によるものでしたか?これはバグとしてリストされるべきだと思います。
クラウス

あなたの研究は正しいと思います。ところで:私はこれが実際にバグだとは思いません。
Christian Brabandt

私は私の結論を少し書き直しました...それは難しいバグのようには見えません。OTOH、それについて考えれば、より良い処理が必要であると結論付けることができます。おそらく、開発者だけが確実に知っています。
Bレイヤー

ええ、確認するためにvim-devリストで質問することができます。
Christian Brabandt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.