Neden: bd #, alternatif bir arabellek olmadığında geçerli arabelleği siler?


9

Gözlemlediğim davranışı şöyle yeniden üretiyorum.

İlk olarak, bu komutu giriyorum:

echo aaaaa > a
vim a

Vim'de şu komutları giriyorum:

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

Yukarıdaki üç komutun çıktısı:

:ls
  1 %a   "a"                            line 1

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

:echo bufname('#')

bufname('#')Komut hiçbir çıktı üretir.

Şimdi bu komutu giriyorum:

:bd #

Geçerli arabellek silinir ve yerine "[Adsız]" arabelleği konur:

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

Yürütme E194hatası almayı bekliyordum :bd #. Bunun yerine geçerli arabelleği neden sildi?

Kullanıyorum VIM - Vi IMproved 8.0.


1
Bu ilginç bir nokta. Sorunuzda bunun da söz konusu olduğunu belirtebilirsiniz NVIM v0.3.0-dev, kontrol ettim.
klaus

@LoneLearner Ödül nedeniyle buna gerçekten cevap vermedim, ancak bir teklif sunacak olursanız, hak eden bir cevaba vermeniz güzel olurdu ... ne yazık ki, neredeyse bir giriş yapmadınız hafta ve ödül dönemi sona erdi ...
B Layer

1
@BLayer Üzgünüm, ödül ödülünü vermeyi unuttum. Harika bir cevap yazdınız. Bu Stack Exchange sitesinde yeterli puanım olduğunda, bu soru için başka bir ödül kazanacağım ve ödülünüzü size vereceğim. Umarım bu benim hatamı düzeltir. Yazdığınız harika cevap için teşekkür ederim.
Yalnız Öğrenci

@LoneLearner Hey, rica ederim ve endişelenme. Yorumunuz için teşekkür ederim. Ödül hakkında endişelenme. Dediğim gibi, bu noktalar hakkında değildi. Bir dahaki sefere ödül vermen için sana bir kafa vermek istedim. Buradan noktaya doğru koy. Şerefe!
B Katmanı

Yanıtlar:


7

Kanıt

Aslında sadece düz ol 'çalıştırdığınız alternatif bir dosya olmadığından :bd, geçerli arabelleği silerek ... onsuz deneyin #ve sonucun aynı olduğunu göreceksiniz. Benzer bir şey ile olur :buffer, :sbufferve en azından kabul birkaç diğer komutlar #bir argüman olarak: onlar sessizce hiçbir argüman iletilmiş gibi davranır.

Aynı doğrultuda, Denersen :bunload #bu hatayı alıyorum: E90: Cannot unload last buffer. :bunloadBağımsız değişken olmadan çalıştırın ve bir kez daha aynı sonucu elde edersiniz.

Dokümanlar

Yani #"hiçbir şey" (muhtemelen boş bir dize) ile değiştirilen kanıtlarımız var . Buradan nereye gidiyoruz? Bu davranıştan bahsetmeye çalışırken bir süre yardım dosyalarının etrafında dolaştım. Açık bir şey yoktu ama :h cmdline-linesdiyor (bir veya iki sayfayı aşağı kaydır) ...

Bir dosya adının beklendiği yerde '%' veya '#' karakteri kullanıldığında, geçerli ve alternatif dosya adına genişletilir.

I um koyarak olarak okumak #yoluyla expand()işlev (yani, expand('#')aynı temel kod) ya da en azından yok kullanılır.

:h expand() diyor:

Genişlet ... özel anahtar kelimeler. .. '%' veya '#' kullanılırken geçerli veya alternatif dosya adı tanımlanmamışsa, boş bir dize kullanılır.

Tanıdık geliyor.

Kod

Şimdi yukarıdakilerin hiçbiri kesin değildir ya da Neden? bu yüzden kazmaya biraz daha zaman harcadım ... bu sefer kodda. Benim C çok paslı ve yüklü iyi bir araç yok ama :bdeletedenilen bazı kurulum yapan bir işlev bulmayı başardı do_bufdel(). Bu aracılığıyla komut satırı değişkenleri gönderir buflist_findpat()ise, bu #, döner bir değer karşılaşılmaktadır curwin->w_alt_fnum. Bu, alternatif arabelleğin "tampon numarası" ... bizim senaryomuzda pozitif bir değer olamaz. (Bu dönüş değeri seçilmeden önce alt dosyanın geçerli olup olmadığını kontrol etmez.)

İçinde geri do_bufdel()çek parametre işlenmesi döngü ayrılmış olup, bu durumda, 0 daha düşük bir tampon numarası için bu dönüş değeri karşı yapılır. Bu, çekirdek :bdeletekodda hiçbir parametrenin sunulmamasına yol açacaktır ... ki bu benim önceki sezgilerimle aynı doğrultuda.

Sıradaki ne?

Net bir hataya benzeyen hiçbir şey göremediğim için tasarlanmış gibi görünüyor. Muhtemelen ihmal günahı ... gözden kaçan ve bu nedenle zarif bir muamele olmayan bir köşe davası. Ancak sadece bunu yazan geliştiriciler kesin olarak biliyor. Bu yüzden son adım girdilerini almaya çalışmak olacaktır. Christian B.'nin dediği gibi vim-dev listesine sormanın yolu var.

(Not buflist_findpat()bu varsaymak hayal streç gerektirmeyen bu yüzden bir yardımcı fonksiyonudur :bunload, :buffergöre ortak davranışlarını açıklıyor vb bunu kullanıyor da ... #.)


Ben sadece genişletilmiş arabellek var mı yoksa değil mi kontrol etmek için bir fonksiyon daha düşünüyorum. Bunun tasarım gereği olduğundan emin misiniz? Bunun bir hata olarak listelenmesi gerektiğini düşünüyorum.
klaus

Bence araştırmanız doğru. BTW: Bunun aslında bir hata olduğunu düşünmüyorum.
Christian Brabandt

Ben sadece benim sonuç biraz reworded .... zor bir hata gibi görünmüyor. OTOH, biri hakkında düşünürse, daha iyi idare edilmesi gerektiği sonucuna varabilir. Muhtemelen sadece geliştirici bilir.
B Katmanı

Evet, emin olmak için vim-dev listesinden biri sorabilir.
Christian Brabandt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.