Làm cách nào để mở nhiều tệp khớp với biểu thức ký tự đại diện?


10

Tôi muốn chỉnh sửa một số tệp phù hợp với biểu thức toàn cầu. Ví dụ: để chỉnh sửa tất cả các tệp cấu hình git trong các thư mục con, tôi có thể thực hiện việc này trong trình bao:

vim */.git/config

Tại :dòng lệnh Vim , tôi dự kiến ​​sẽ :find */.git/configlàm một cái gì đó tương tự (nghĩa là mở tất cả các tệp khớp với biểu thức toàn cầu), nhưng thay vào đó, nó phàn nàn E77: Too many file names.

Có lệnh Vim hoặc một lớp lót để mở nhiều tệp khớp với biểu thức ký tự đại diện / toàn cầu (không liên quan đến việc viết một hàm)?

Câu trả lời:


8

Bạn có thể sử dụng :args {glob}. Trong thế giới của bạn, **sẽ đi qua các thư mục đệ quy.

Điều này sẽ điền vào danh sách đối số, đó là cùng một danh sách được điền khi bạn bắt đầu Vim với một hoặc nhiều tên tệp làm đối số.

Khi danh sách đối số của bạn được điền, bạn có thể điều hướng qua nó bằng cách sử dụng :next:previous. Bạn cũng có thể chuyển đến mục đầu tiên và cuối cùng với các lệnh :first:last.


1
Nice :) :args */.git/configthực sự cũng điền vào danh sách bộ đệm, vì vậy :bnextcũng hoạt động. Điều đó có vẻ kỳ quặc? (Vim 7.4.52 và Neovim)
Justin M. Keyes

1
Cũng là một lời nhắc nhở cho người khác, hãy ]alập :argsdanh sách nếu github.com/tpope/vim-unimpaired được cài đặt.
Justin M. Keyes

Cũng :argadd file*có thể làm.
kenorb 18/03/2015

Để sử dụng mô hình toàn cầu ( **), bạn cần phải globstarthiết lập, xem: Khớp tất cả các tệp trong tất cả các thư mục lồng nhau với shell globalbing .
kenorb

@ JustinM.Keyes Danh sách bộ đệm là siêu bộ của danh sách args, vì vậy điều đó được mong đợi.
jamessan

3

Để mở tập tin phù hợp trong các tab riêng biệt

:n */.git/config | tab all

Giải thích: :n ( :next) đặt danh sách tệp tiếp theo cho tất cả các kết quả khớp. tab allmở tất cả các tệp trong danh sách tệp tiếp theo trong các tab mới.

… hoặc là …

for f in glob("*.py", 0, 1) | exe "tabe" f | endfor

Giải thích: Trong glob(…), 0 có nghĩa là bao gồm tất cả các tệp phù hợp, ngay cả khi chúng bị bỏ qua do các cài đặt suffixeshoặc wildignorecase. 1 có nghĩa là trả về một danh sách, thay vì một chuỗi. exe "tabe" flà một hình thức ngắn execute "tabedit" fvà có nghĩa là để mở tệp được chỉ định bởi biến ftrong tab mới.


1
Trông giống như :n */.git/config | buffercông trình.
Mateen Ulhaq

2

Tại dòng lệnh Vim:, tôi dự kiến ​​sẽ :find */.git/configlàm một cái gì đó tương tự (nghĩa là mở tất cả các tệp khớp với biểu thức toàn cầu), nhưng thay vào đó, nó phàn nàn E77: Too many file names.

Đừng mong đợi bất cứ điều gì trước khi đọc tài liệu.

Ngoài câu trả lời của Tom, bạn có thể trực tiếp sử dụng :nextthay thế cho :args.


0

Mở tập tin bằng cách vim */.git/configchắc chắn nên làm việc. Nếu không, bạn nên nâng cấp Vim của mình lên 7.4 (phiên bản trước có nhiều lỗi hơn).

Hoặc thử một trong các cách sau (trong trình chỉnh sửa):

:n `find .git/ -name config`
:args `find . -name config`

Bạn đã không đọc kỹ câu hỏi của tôi. Và, câu trả lời được chấp nhận đã đề cập :args.
Justin M. Keyes

@ JustinM.Keyes Cảm ơn điểm của bạn. Wildcard nên hoạt động theo mặc định và đây là câu trả lời duy nhất nói rằng nó sẽ hoạt động trong 7.4 (vì tôi đã có cùng một lỗi trước khi nâng cấp). Việc sử dụng argschỉ là cách giải quyết, nhưng hơn nữa nó chỉ cho bạn cách sử dụng mở rộng shell trong vim it-self trong trường hợp người dùng tiếp tục muốn sử dụng nó cho các giải pháp phức tạp hơn, bằng cách sử dụng find, như cách này . Vì vậy, tôi nghĩ rằng nó cung cấp một số giá trị bổ sung cho câu hỏi của bạn. Vì vậy, tôi hy vọng nó tốt với bạn.
kenorb

Tôi chưa bao giờ gặp sự cố vim */foovà không có cách nào có thể liên quan đến phiên bản Vim, vì đó là tính năng vỏ .
Justin M. Keyes

0

Rõ ràng, nhưng không được liệt kê ở trên - ví dụ tìm tất cả các tệp sql có chuỗi create_table trong tên của chúng

:args **/*create_table*sql

và kiểm tra chúng

:ls

và mở cái đầu tiên

:b 1
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.