Làm cách nào để mở nhiều tệp cùng lúc trong Vim?


87

Có cách nào để mở tất cả các tệp trong một thư mục từ bên trong Vim không? Vì vậy, một :commandcó hiệu lực sẽ nói "Mở tất cả các tệp trong /some/pathbộ đệm".

Lý tưởng nhất là mở tất cả các tệp dưới một đệ quy dir.

Câu trả lời:


105

Lệnh bạn đang tìm là args:

Ví dụ:

:args /path_to_dir/*

sẽ mở tất cả các tệp trong thư mục


32
Sử dụng **để đối sánh các tệp một cách đệ quy. Ví dụ:args /path_to_dir/**
daf

1
Để mở tệp không có phần mở rộng, hãy chỉ định thư mục mẹ, ví dụ: args ** /. Hg / hgrc hoạt động nhưng ** / hgrc thì không.
79E09796

11
Khi các tệp được mở, sử dụng :tab allđể đưa chúng vào các tab riêng lẻ.
Backlin

"Tất cả các tệp" sẽ bao gồm các thư mục con có thể không được mong muốn. (Lỗi vim của tôi "/path_to_dir/subdir/" Illegal file name). Giải pháp nhanh là chạy lệnh thứ hai argd */để loại bỏ những từ danh sách một lần nữa
lessthanideal

Sẽ thực sự tuyệt vời nếu bạn hoàn thành câu trả lời với gợi ý sau: Là một thông lệ tốt và để chỉ ra cách áp dụng cùng một nhóm lệnh cho tất cả các tệp đã được mở, bạn có thể thực hiện lệnh sau để áp dụng tất cả các lệnh chứa trong tệp my_commands_batch.vim:argdo source my_commands_batch.vim
aturegano.

21

Tại sao nó không hoạt động nếu tôi muốn mở tất cả các tệp kết thúc bằng một phần mở rộng nhất định? Tôi đã thử

:n ./**.cs

và chỉ mở các tệp trong thư mục hiện tại.

Tôi đã tìm thấy câu trả lời. Mã chính xác là :n **/*.cs

Để biết thêm thông tin :h find


9

Bạn đã thử chưa

:n /some/path/*

Nó sẽ mở tất cả các tệp trong / some / path

Tôi không nghĩ rằng nó sẽ mở tệp một cách đệ quy.

BIÊN TẬP

Có thể sử dụng ** sẽ mở đệ quy như daf đã đề cập


: N có nghĩa là gì? Nhìn vào sự giúp đỡ của vim chỉ cho tôi để "lặp lại mô hình cuối cùng" .. mà tôi hiểu là tổ hợp phím. Có cách nào để nhận trợ giúp chỉ cho chế độ lệnh không?
U0001

1
Quá dễ: h: n .. nhận trợ giúp cho ": n". Đừng Tôi giống như trả lời câu hỏi của riêng tôi;)
U0001

4

Một phương pháp không yêu cầu gây rối argslà đặt danh sách tệp vào tệp văn bản, sau đó sử dụng :solệnh để chạy các lệnh trong tệp đó.

Ví dụ: nếu bạn muốn mở tất cả các tệp kết thúc trong .phpmột thư mục nhất định, trước tiên hãy tạo files.txtcó chứa danh sách các tệp, được chèn sẵn bằng bất kỳ lệnh nào bạn muốn sử dụng để mở chúng.

sp alpha.php
sp bravo.php
sp charlie.php

Sau đó, trong vim:

:so files.txt

Nếu danh sách tệp lớn, thì việc tạo files.txttệp nhanh chóng là tương đối nhỏ , bằng cách chuyển hướng đầu ra của lstệp, sau đó sử dụng macro vim để thêm sptrước mỗi tên tệp.

Điều này rõ ràng là không thanh lịch bằng cách sử dụng các lệnh argsargdo, nhưng các lệnh đó cũng phức tạp hơn rất nhiều.

Cũng có thể có một cách để làm điều này với một lệnh duy nhất trên dòng lệnh, nhưng thậm chí sau 16 năm, tôi vẫn thấy lập trình vim là lạ và phức tạp.


Hấp dẫn ! Nghe có vẻ là một cách hay để giữ quyền kiểm soát những tệp nào được yêu cầu mở, thay vì mở một cách mù quáng tất cả các tệp của một thư mục nhất định nếu những tệp này không phải tất cả đều được yêu cầu.
cram2208

1

Một cách khác để mở tệp đệ quy

find . -type f -exec vi {} \;

4
Không đáp ứng hạn chế “từ bên trong Vim”.
ZyX

nhưng những gì là cần thiết :)
giả mạo-one

3
Nó không. Điều cần thiết là các tệp từ thư mục đã cho một cách đệ quy từ bên trong vim . Nếu bạn đang loại bỏ các điều kiện, bạn cũng có thể nói rằng kate **/*(^/)(sử dụng cú pháp zsh globbing) thực hiện những gì cần thiết: mở tệp từ thư mục đã cho một cách đệ quy. Nó không phải là "từ bên trong" và nó hoàn toàn không sử dụng vim, nhưng nó "chưa làm được những gì cần thiết". Hoặc thậm chí kate ~/.vimrc ~/.bashrc. Loại bỏ hoàn toàn “từ withing”, “từ thư mục đã cho” và “đệ quy”, nhưng nó vẫn “thực hiện những gì cần thiết”: mở tệp.
ZyX

Thao tác này sẽ mở từng tệp một
Paul

1

Nếu bạn muốn thêm vào danh sách đối số;

:arga what_you-d_like_to_add

xem

:he arga

từ / trong vim để biết thêm thông tin.

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.