Khi nào chính xác <afile> khác với <amatch>?


7

Các tài liệu nói:

<afile>    When executing autocommands, is replaced with the file name
           for a file read or write.
<abuf>     When executing autocommands, is replaced with the currently
           effective buffer number (for ":r file" and ":so file" it is
           the current buffer, the file being read/sourced is not in a
           buffer).
<amatch>   When executing autocommands, is replaced with the match for
           which this autocommand was executed.  It differs from
           <afile> only when the file name isn't used to match with
           (for FileType, Syntax and SpellFileMissing events).

Tuy nhiên, nếu tôi có điều này autocmd:

autocmd BufNewFile * echo expand('<amatch>') expand('<afile>')

Và mở ra, nói .zshrctrong /tmp( cd /tmp; vim .zshrc), tôi nhận được:

/tmp/.zshrc .zshrc

Chúng không giống nhau. Chuyện gì đang xảy ra vậy?

%trung thành với những gì tôi thực sự gõ. vim ./.zshrcvới expand('%')thêm vào ở trên autocmdcho tôi:

/tmp/.zshrc .zshrc ./.zshrc

Bạn có nghĩ rằng sự khác biệt có thể <afile>chỉ là tên tệp trong khi đó <amatch>là đường dẫn đầy đủ cho tệp không?
nobe4

@ Nobe4 vâng, đó luôn là cách nó diễn ra. %, tuy nhiên, trung thành với bất cứ điều gì tôi thực sự đề cập. Nhưng tôi không chắc mình có thể tin tưởng %ở đây. : /
muru

Nếu bạn gõ vim /tmp/.zshrcchúng là cùng một chuỗi. Nếu cwd của bạn là /tmpbạn sẽ có một đường dẫn tuyệt đối và một đường dẫn tương đối, và trong khi chúng không phải là cùng một chuỗi, chúng là các đường dẫn giống nhau.
Martin Tournoij

@Carpetsmoker Tôi chỉ gõ đơn giảnvim .zshrc
muru

Trong bản mở rộng, bạn có thể có: expand('<amatch>') == expand('%:p')expand('<afile>') == expand('%'). Bạn nghĩ sao ? Chỉnh sửa: Chỉ cần xem phiên bản của bạn, expand('<afile>') == expand('%')không áp dụng nữa
nobe4

Câu trả lời:


8

<amatch>là chính xác những gì phù hợp với autocmdmô hình. Đối autocmdvới tên trùng khớp, các liên kết tượng trưng được giải quyết, kết quả được hợp quy hóa và đường dẫn đầy đủ được trả về.

<afile>là đường dẫn đầy đủ chính tắc như trên, nhưng kết quả cũng được rút ngắn, về cơ bản giống như fnamemodify(file, ':.')(chi tiết chính xác có liên quan nhiều hơn, nhưng mô tả trước là chính xác cho tất cả các trường hợp "bình thường").

Do đó, nói chung expand('<afile>') == expand('<amatch>:.')( chỉnh sửa: tất nhiên, được cung cấp rằng họ đề cập đến cùng một điều).


Đó dường như là hành vi, vâng. Nhưng bạn có bất cứ điều gì để hỗ trợ câu trả lời này?
muru

3
@muru: Ý bạn là, ngoài vẻ ngoài điển trai và nụ cười hoàn hảo của tôi? ;) Vâng, tôi nghĩ rằng tôi làm: <afile><amatch> nguồn.
Sato Katsura

Nói chung, afile không giống như amatch, vì nó hoàn toàn có thể khác nhau tùy thuộc vào sự kiện autocommand.
Christian Brabandt

2
@ChristianBrabandt Có. Điểm quan trọng của câu hỏi là, chúng vẫn có thể khác nhau đối với autocmds ở đâu <afile><amatch> liên quan đến cùng một thứ (cụ thể là với một tệp), trái với những gì hướng dẫn sử dụng ngụ ý. Câu trả lời của tôi giải thích làm thế nào và tại sao chúng khác nhau trong trường hợp cụ thể đó. Tốt hơn rồi? :)
Sato Katsura
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.