ทำไม: bd # ลบบัฟเฟอร์ปัจจุบันเมื่อไม่มีบัฟเฟอร์สำรองอยู่?


9

นี่คือวิธีที่ฉันทำซ้ำพฤติกรรมที่ฉันสังเกต

ก่อนอื่นฉันป้อนคำสั่งนี้:

echo aaaaa > a
vim a

ในกลุ่มฉันป้อนคำสั่งเหล่านี้:

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

นี่คือผลลัพธ์ของคำสั่งทั้งสามข้างต้น:

: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ฉันตรวจสอบ
klaus

@ LoneLearner ฉันไม่ได้ตอบคำถามนี้เพราะความโปรดปราน แต่ถ้าคุณจะเสนอให้มันจะดีถ้าคุณให้รางวัลกับคำตอบที่สมควร ... อนิจจาคุณยังไม่ได้เข้าสู่ระบบ สัปดาห์และระยะเวลาของรางวัลสิ้นสุดลง ...
B Layer

1
@BLayer ขออภัยฉันลืมมอบรางวัล คุณได้เขียนคำตอบที่ยอดเยี่ยม เมื่อฉันมีคะแนนเพียงพอในไซต์ Stack Exchange นี้ฉันจะเริ่มต้นเงินรางวัลอีกครั้งสำหรับคำถามนี้และมอบรางวัลให้คุณ ฉันหวังว่าจะแก้ไขข้อผิดพลาดของฉัน ขอบคุณสำหรับคำตอบที่ดีที่คุณเขียน
Lone Learner

@ LoneLearner เฮ้ยินดีต้อนรับคุณและไม่ต้องกังวล ฉันขอขอบคุณสำหรับความคิดเห็นของคุณ ไม่ต้องกังวลเรื่องเงินรางวัล อย่างที่ฉันบอกไปมันไม่เกี่ยวกับประเด็น ฉันแค่อยากให้คุณเป็นหัวหน้าในครั้งต่อไปที่คุณได้รับรางวัล ใส่คะแนนจากที่นี่ไปทางนั้น ไชโย!
B Layer

คำตอบ:


7

หลักฐาน

เนื่องจากไม่มีไฟล์อื่นที่คุณเพิ่งเรียกใช้ล้วน ol จริง ๆ 'การ:bdลบบัฟเฟอร์ปัจจุบัน ... ลองใช้โดยไม่ลองแล้ว#คุณจะเห็นผลลัพธ์เหมือนกัน สิ่งที่คล้ายกันเกิดขึ้นกับ:buffer, :sbufferและอย่างน้อยสองคำสั่งอื่น ๆ ที่รับ#เป็นอาร์กิวเมนต์: พวกเขาอย่างเงียบ ๆ ทำตัวราวกับว่าไม่มีข้อโต้แย้งได้ผ่าน

พร้อมสายเดียวกันถ้าคุณพยายามที่คุณจะได้รับข้อผิดพลาดนี้::bunload # E90: Cannot unload last bufferทำงาน:bunloadโดยไม่มีข้อโต้แย้งและคุณจะได้รับผลลัพธ์เหมือนเดิมอีกครั้ง

เอกสาร

ดังนั้นเราจึงมีหลักฐานที่#ถูกแทนที่ด้วย "ไม่มีอะไร" (อาจเป็นสตริงว่าง) เราไปจากที่นี่ที่ไหน ฉันแหย่ไปรอบ ๆ แฟ้มช่วยเหลือในขณะที่พยายามค้นหาการพูดถึงพฤติกรรมนี้ ไม่มีอะไรชัดเจน แต่:h cmdline-linesพูดว่า (เลื่อนหน้าลงหนึ่งหรือสองหน้า) ...

เมื่อใช้อักขระ '%' หรือ '#' ในกรณีที่คาดว่าชื่อไฟล์จะถูกขยายเป็นชื่อไฟล์ปัจจุบันและชื่ออื่น

ฉันอ่านว่าเป็นเสียงเรียก#ผ่านexpand()ฟังก์ชั่น (เช่นexpand('#')) หรืออย่างน้อยรหัสพื้นฐานเดียวกันที่ใช้มี

:h expand() พูดว่า:

ขยาย .. คำหลักพิเศษ .. เมื่อใช้ '%' หรือ '#' และไม่ได้กำหนดชื่อไฟล์ปัจจุบันหรือชื่อสำรองจะใช้สตริงว่าง

เสียงที่คุ้นเคย.

รหัส

ตอนนี้ไม่มีข้อสรุปใดที่ชัดเจนหรือให้เงื่อนงำว่าทำไม? ดังนั้นฉันจึงใช้เวลาขุดอีก ... คราวนี้เป็นรหัส ฉันซีเป็นสนิมมากและฉันไม่ได้มีเครื่องมือที่ดีที่ติดตั้ง แต่ฉันจัดการเพื่อหาฟังก์ชั่นที่ไม่ติดตั้งบางอย่างสำหรับเรียกว่า:bdelete do_bufdel()นี้จะส่งอาร์กิวเมนต์บรรทัดคำสั่งผ่านbuflist_findpat()ซึ่งถ้าพบให้ผลตอบแทนคุ้มค่า# curwin->w_alt_fnumนั่นคือ "หมายเลขบัฟเฟอร์" ของบัฟเฟอร์สำรอง ... ซึ่งไม่สามารถเป็นค่าบวกในสถานการณ์ของเรา (ไม่มีการตรวจสอบว่าไฟล์ alt ถูกต้อง / มีอยู่ก่อนที่จะเลือกค่าส่งคืนนั้น)

การย้อนกลับในdo_bufdel()การตรวจสอบจะทำกับค่าส่งคืนสำหรับหมายเลขบัฟเฟอร์ที่น้อยกว่า 0 ซึ่งในกรณีนี้การประมวลผลการวนรอบพารามิเตอร์จะแยกออก นั่นจะส่งผลให้ไม่มีพารามิเตอร์ที่นำเสนอใน:bdeleteรหัสหลัก... ซึ่งเหมาะสมกับสัญชาติญาณก่อนหน้าของฉัน

อะไรต่อไป?

ดูเหมือนว่าจะทำงานได้ตามที่ได้รับการออกแบบมาโดยที่ฉันไม่เห็นอะไรเลยที่ดูเหมือนข้อผิดพลาดที่ชัดเจน อาจเป็นบาปของการละเว้นแม้ว่า ... กรณีมุมที่ถูกมองข้ามและจึงไม่มีการจัดการที่สง่างาม แต่มีเพียงนักพัฒนาที่เขียนสิ่งนี้รู้อย่างแน่นอน ดังนั้นขั้นตอนสุดท้ายคือพยายามป้อนข้อมูลของพวกเขา ดังที่Christian B. กล่าวว่าการถามรายการ vim-dev เป็นวิธีที่จะไป

(โปรดทราบว่าbuflist_findpat()เป็นฟังก์ชันยูทิลิตี้ดังนั้นจึงไม่จำเป็นต้องใช้จินตนาการในการคิด:bunloadเช่น:bufferนั้น ฯลฯ กำลังใช้มันเช่นกัน ... ที่จะอธิบายพฤติกรรมทั่วไปของพวกเขาด้วยความเคารพ#)


ฉันคิดว่าอีกฟังก์ชั่นเพิ่มเติมเพียงแค่ตรวจสอบว่าบัฟเฟอร์ที่ถูกขยายมีอยู่หรือไม่จะทำงาน คุณแน่ใจหรือว่านี่ควรจะเป็นการออกแบบ? ฉันคิดว่านี่ควรจะระบุว่าเป็นข้อผิดพลาด
klaus

ฉันคิดว่างานวิจัยของคุณถูกต้อง BTW: ฉันไม่คิดว่านี่เป็นข้อผิดพลาดจริงๆ
Christian Brabandt

ฉันเพิ่งจะสรุปข้อสรุปของฉันเล็กน้อย .... มันดูไม่เหมือนข้อผิดพลาดที่ยาก OTOH ถ้าใครคิดว่ามันจะสรุปได้ว่ามันต้องการการจัดการที่ดีกว่า อาจเป็นเพียงนักพัฒนาเท่านั้นที่รู้แน่
B Layer

ใช่ใครสามารถขอรายการ vim-dev เพื่อให้แน่ใจ
Christian Brabandt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.