Tại sao: bd # xóa bộ đệm hiện tại khi không có bộ đệm thay thế tồn tại?


9

Đây là cách tôi tái tạo hành vi tôi đang quan sát.

Đầu tiên, tôi nhập lệnh này:

echo aaaaa > a
vim a

Trong Vim, tôi nhập các lệnh sau:

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

Đây là đầu ra của ba lệnh trên:

:ls
  1 %a   "a"                            line 1

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

:echo bufname('#')

Các bufname('#')lệnh sản xuất không có đầu ra.

Bây giờ tôi nhập lệnh này:

:bd #

Bộ đệm hiện tại bị xóa và nó được thay thế bằng bộ đệm "[Không Tên]":

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

Tôi đã mong đợi để có được E194lỗi khi thực hiện :bd #. Tại sao nó lại xóa bộ đệm hiện tại thay thế?

Tôi đang sử dụng VIM - Vi IMproved 8.0.


1
Đó là một điều thú vị. Bạn có thể đề cập trong câu hỏi của bạn rằng đây cũng là trường hợp NVIM v0.3.0-dev, tôi đã kiểm tra.
klaus ngày 3 tháng

@LoneLearner Tôi đã không thực sự trả lời câu hỏi này vì tiền thưởng nhưng nếu bạn sẽ cung cấp một câu trả lời thì thật tuyệt nếu bạn trao giải cho câu trả lời xứng đáng ... than ôi, bạn đã đăng nhập gần như một tuần và thời kỳ tiền thưởng đã kết thúc ...
Lớp B

1
@BLayer Xin lỗi, tôi đã quên trao tiền thưởng. Bạn đã viết một câu trả lời tuyệt vời. Khi tôi có đủ điểm trong trang web Stack Exchange này, tôi sẽ bắt đầu một tiền thưởng khác cho câu hỏi này và trao tiền thưởng cho bạn. Tôi hy vọng rằng sẽ sửa chữa sai lầm của tôi. Cảm ơn bạn đã trả lời tuyệt vời mà bạn đã viết.
Người học đơn độc

@LoneLearner Này, bạn được chào đón và không phải lo lắng. Tôi đánh giá cao nhận xét của bạn. Đừng lo lắng về tiền thưởng. Như tôi đã nói, đó không phải là về điểm. Tôi chỉ muốn cho bạn một cái đầu lên cho lần tiếp theo bạn đưa tiền thưởng. Đặt các điểm từ đây về phía đó. Chúc mừng!
Lớp B

Câu trả lời:


7

Chứng cớ

Vì không có tệp thay thế mà bạn thực sự chỉ đang chạy ol 'đơn giản :bd, nên xóa bộ đệm hiện tại ... hãy thử mà không có #và bạn sẽ thấy kết quả là như nhau. Một điều tương tự xảy ra với :buffer, :sbuffervà ít nhất một vài lệnh khác chấp nhận #như một đối số: chúng âm thầm hành xử như thể không có đối số nào được thông qua.

Dọc theo cùng một dòng, nếu bạn thử, :bunload #bạn sẽ gặp lỗi này : E90: Cannot unload last buffer. Chạy :bunloadkhông có đối số và, một lần nữa, bạn sẽ nhận được kết quả tương tự.

Tài liệu

Vì vậy, chúng tôi có bằng chứng #đang được thay thế bằng "không có gì" (có thể là một chuỗi trống). Chúng ta sẽ đi đâu từ đây? Tôi chọc vào các tập tin trợ giúp một lúc để cố gắng đề cập đến hành vi này. Không có gì rõ ràng nhưng :h cmdline-linesnói (cuộn xuống một hoặc hai trang) ...

Khi ký tự '%' hoặc '#' được sử dụng trong trường hợp tên tệp được mong đợi, chúng sẽ được mở rộng thành tên tệp hiện tại và thay thế.

Tôi đọc điều đó khi Vim đưa #vào expand()hàm (tức là expand('#')) hoặc ít nhất là cùng một mã cơ bản được sử dụng ở đó.

:h expand() nói:

Mở rộng .. từ khóa đặc biệt. .. Khi sử dụng '%' hoặc '#' và tên tệp hiện tại hoặc thay thế không được xác định, một chuỗi trống được sử dụng.

Âm thanh quen thuộc.

Mật mã

Bây giờ không có điều nào ở trên là dứt khoát hoặc đưa ra manh mối về Tại sao? vì vậy tôi đã dành thêm thời gian để đào ... lần này trong mã. My C rất hoen rỉ và tôi không cài đặt bất kỳ công cụ tốt nào nhưng tôi đã tìm được một chức năng thực hiện một số thiết lập để :bdeletegọi do_bufdel(). Điều này sẽ gửi các đối số dòng lệnh thông qua buflist_findpat()đó, nếu #gặp phải, trả về giá trị curwin->w_alt_fnum. Đó là "số bộ đệm" của bộ đệm thay thế ... không thể là giá trị dương trong kịch bản của chúng tôi. (Không có kiểm tra xem tệp alt có hợp lệ / tồn tại trước khi giá trị trả về đó được chọn hay không.)

Thoát ra trong do_bufdel()một kiểm tra được thực hiện đối với giá trị trả về đó cho số bộ đệm nhỏ hơn 0 trong trường hợp vòng xử lý tham số bị phá vỡ. Điều đó sẽ không dẫn đến việc các tham số được trình bày cho :bdeletemã lõi ... phù hợp với trực giác trước đây của tôi.

Cái gì tiếp theo?

Nó dường như đang hoạt động như được thiết kế ở chỗ tôi không thấy bất cứ thứ gì trông giống như một lỗi rõ ràng. Có thể tội lỗi của sự thiếu sót, mặc dù ... một trường hợp góc đã bị bỏ qua và do đó không có xử lý duyên dáng. Nhưng chỉ có các nhà phát triển đã viết điều này biết chắc chắn. Vì vậy, bước cuối cùng sẽ là cố gắng để có được đầu vào của họ. Như Christian B. đã nói hỏi trong danh sách vim-dev là con đường để đi.

(Lưu ý rằng buflist_findpat()là một chức năng tiện ích như vậy nó sẽ không đòi hỏi một căng của trí tưởng tượng cho rằng :bunload, :buffervv đang sử dụng nó, quá ... mà có thể giải thích hành vi phổ biến của họ đối với với #.)


Tôi nghĩ rằng một chức năng nữa chỉ để kiểm tra xem bộ đệm mở rộng có tồn tại hay không sẽ thực hiện công việc. Bạn có chắc chắn điều này được cho là do thiết kế? Tôi nghĩ rằng điều này nên được liệt kê như là một lỗi.
klaus

Tôi nghĩ rằng nghiên cứu của bạn là chính xác. BTW: Tôi không nghĩ đây thực sự là một lỗi.
Christian Brabandt

Tôi chỉ điều chỉnh lại kết luận của mình một chút .... nó không giống một lỗi cứng. OTOH, nếu người ta nghĩ về nó, người ta có thể kết luận rằng nó cần xử lý tốt hơn. Có lẽ chỉ có nhà phát triển biết chắc chắn.
Lớp B

Vâng, người ta có thể yêu cầu trong danh sách vim-dev để đảm bảo.
Christian Brabandt
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.