Từ trợ giúp :help backtick-expansion
:
On Unix and a few other systems you can also use backticks for the file name
argument, for example:
:next `find . -name ver\\*.c -print`
:view `ls -t *.patch \| head -n1`
The backslashes before the star are required to prevent the shell from
expanding "ver*.c" prior to execution of the find program. The backslash
before the shell pipe symbol "|" prevents Vim from parsing it as command
termination.
Nếu tôi gõ lệnh được lấy từ trợ giúp, tôi sẽ gặp lỗi:
:next `find . -name ver\\*.c -print
E79: Cannot expand wildcards
Tại sao ví dụ từ trợ giúp sử dụng hai dấu gạch chéo ngược thay vì một và tại sao nó không hoạt động?
Công việc sau:
Nếu tôi loại bỏ một trong hai dấu gạch chéo ngược để bảo vệ ngôi sao khỏi bị mở rộng bởi lớp vỏ trước
find
chương trình::next `find . -name ver\*.c -print`
Nếu tôi loại bỏ cả dấu gạch chéo ngược và đặt dấu ngoặc đơn xung quanh mẫu
ver*.c
::next `find . -name 'ver*.c' -print`
Cho đến thời điểm này, quy tắc dường như là:
nếu lệnh shell của bạn chứa một ngôi sao và bạn không muốn shell mở rộng nó trước lệnh, đặt một dấu gạch chéo ngược trước nó hoặc đặt dấu ngoặc đơn xung quanh mẫu .
Nhưng sự giúp đỡ đưa ra một ví dụ khác:
:view `ls -t *.patch \| head -n1`
Lệnh này hoạt động mà không cần sửa đổi, không cần trích dẫn đơn, không cần dấu gạch chéo ngược.
Tôi cho rằng lý do tại sao nó hoạt động là vì ls
lệnh (trái với -name
đối số của find
lệnh) chấp nhận nhiều đối số tệp và thấy không có vấn đề gì với việc mở rộng shell *.patch
.
Bây giờ, giả sử tôi muốn tìm tất cả các tệp có phần mở rộng .conf
bên trong /etc
thư mục và đặt đầu ra của find
để grep
chỉ nhận các kết quả khớp có chứa chuỗi input
.
Trong shell, từ bất kỳ thư mục làm việc, tôi sẽ gõ:
find /etc -name '*.conf' | grep input
Và nó sẽ làm việc.
Trong vim, tôi sẽ gõ cùng một lệnh đặt backticks xung quanh nó và dấu gạch chéo ngược phía trước biểu tượng đường ống để ngăn vim diễn giải nó như là chấm dứt lệnh:
:next `find /etc -name '*.conf' \| grep input`
Và nó hoạt động.
Bây giờ, nếu tôi gõ cùng một lệnh mà không có ống dẫn và grep input
, tôi gặp lỗi:
:next `find /etc -name '*.conf'`
E79: Cannot expand wildcards
Tại sao có lỗi trong trường hợp này mặc dù tôi đã bảo vệ ngôi sao bằng dấu ngoặc đơn?
Và tại sao bây giờ có lỗi, nhưng không chỉ trước đây với đường ống và grep input
?
Để thử hiểu, tôi đã đưa ra một lệnh đơn giản hơn:
find . -name '*.conf'
Nó tìm kiếm tất cả các tập tin với phần mở rộng .conf
trong thư mục làm việc. Lệnh hoạt động trong shell.
Để kiểm tra nó trong vim, tôi đã gõ: :next `find . -name '*.conf'`
Và nó hoạt động. Trong trường hợp này, dấu chấm là viết tắt của thư mục làm việc hiện tại của tôi như được hiển thị bởi lệnh Ex :pwd
là thư mục chính của /home/username
tôi kể từ khi tôi khởi chạy phiên vim từ nó.
Tại sao nó hoạt động khi tôi yêu cầu tìm kiếm trong thư mục làm việc hiện tại trong khi nó không hoạt động khi tôi yêu cầu tìm kiếm trong một thư mục tùy ý như /etc
?
Bây giờ, nếu tôi thay đổi thư mục làm việc của mình từ /home/username
sang /etc
bằng lệnh vim Ex :cd /etc
và thử lại lệnh tương tự như trước đây, một lần nữa nó lại lỗi:
:next `find . -name '*.conf'`
E79: Cannot expand wildcards
Tại sao cùng một lệnh hoạt động khi tôi trong thư mục nhà của tôi mà không phải khi tôi ở trong /etc
?
Tôi chắc chắn có một số logic, nhưng tôi không thể tìm thấy một.
Cú pháp chung và chính xác để điền vào danh sách đối số bằng lệnh shell tùy ý (chứa một ngôi sao, một đường ống, tìm kiếm trong bất kỳ thư mục nào từ bất kỳ thư mục làm việc nào)?
Tôi đang sử dụng phiên bản vim 7.4.942 và zsh là vỏ mặc định của tôi. Tôi đã thử nghiệm các lệnh này với tối thiểu các khởi tạo ( vim -u NORC -N
) từ bash cũng như từ zsh.
Tôi có cần cấu hình vim để gọi bash và không zsh không?
vim $(find . -name ver\*.c -print)
, vim $(ls -t *.patch | head -n1)
, vim $(find /etc -name '*.conf' | grep input)
, vim $(find /etc -name '*.conf')
,vim $(find . -name '*.conf')
--remote
, xem: vi.stackexchange.com/a/5618/4939 ) nhưng tôi tò mò muốn biết làm thế nào để làm điều đó trực tiếp từ phiên hiện tại. Nếu điều đó là không thể, điều đó tốt, nhưng sau khi đọc trợ giúp thì dường như điều đó có thể được thực hiện. Nếu có, tôi muốn hiểu tại sao vim phản ứng rất khác với các lệnh tương tự.
find /etc -name '*.conf'
không hoạt động, tôi nghĩ rằng một số tên vui nhộn xuất phát từ lệnh đó, và, đây có thể là lý do tại sao nó hoạt động khi được dẫn qua grep
.
vim $(find . -name ver*.c)