Làm cách nào tôi có thể chạy một chức năng hoặc macro trên một thư mục tệp?


11

Hãy nói rằng tôi có một chức năng, được đặt tên StripWhitespace.

Tôi có thể chạy nó trên một tệp bằng cách mở tệp và chạy :StripWhitespace.

Làm cách nào tôi có thể tự động chạy chức năng đó đối với thư mục tệp và lưu kết quả khi tôi thực hiện?


3
Chi tiết, xin vui lòng!
200_success 3/2/2015

Câu trả lời:


9

Bạn có thể sử dụng -cđối số để chạy lệnh khi khởi động, từ vim(1):

   -c {command}
               {command} will be executed after the first  file  has  been
               read.   {command}  is interpreted as an Ex command.  If the
               {command} contains spaces it must  be  enclosed  in  double
               quotes  (this depends on the shell that is used).  Example:
               Vim "+set si" main.c
               Note: You can use up to 10 "+" or "-c" commands.

Thí dụ:

vim -c ':call StripWhitespace()' file1 file2

Để thoát sau đó, thêm | :wqa:

vim -c ':call StripWhitespace() | :wqa' file1 file2

1
Bạn muốn có: argdo, nếu bạn chạy tệp này cho một vài tệp trên dòng lệnh
Christian Brabandt 3/03/2015

18

Nếu bạn đã ở trong Vim, bạn có thể sử dụng các lệnh :argdohoặc :bufdođể thực thi một lệnh trên mỗi mục trong danh sách đối số hoặc danh sách bộ đệm, tương ứng.

ví dụ: để chạy :lệnh trên mỗi tệp trong danh sách đối số:

:argdo StripWhitespace

Hoặc để gọi một hàm từ mọi tệp trong danh sách bộ đệm:

:bufdo call StripWhitespace()

Hoặc để chạy macro qtrên mọi tệp trong danh sách đối số:

:argdo normal @q

Sau đó, bạn có thể lưu tất cả các bộ đệm đã thay đổi với :wallhoặc lưu tất cả và thoát Vim với :wqall.

Nếu bạn muốn viết các tệp khi bạn thực hiện, bạn có thể thêm một cuộc gọi đến :update, như vậy:

:argdo s/foo/bar/ge | update

Có nhiều cách khác nhau để bạn có thể đưa các tệp vào Vim ở vị trí đầu tiên, bao gồm:

  • Cung cấp tham số cho dòng lệnh vim: vim *(điều này thêm tất cả các tệp vào danh sách đối số),
  • Sử dụng :argslệnh (hỗ trợ ký tự đại diện và biểu thức backtick) để điền danh sách đối số hoặc :argaddlệnh để thêm tệp vào đó,
  • Chỉ cần mở tất cả chúng bằng tay với :e, :Exhoặc một plugin tập tin mở.

1
Tôi thích câu trả lời này vì nó không yêu cầu rời khỏi Vim, theo ý kiến ​​của tôi là quá đắt (danh sách bộ đệm quý giá của tôi!). Tôi có một số lưu ý: (1) để lại bộ đệm mà không cần viết 'hidden'; (2) : updatelệnh là một cải tiến nhỏ :wvì nó chỉ ghi nếu một thay đổi đã được thực hiện, do đó :bufdo updatehoặc :argdo updatesẽ ghi tất cả các bộ đệm hoặc đối số đã sửa đổi.
tommcdo

Điểm tốt trên update. Tôi đã cân nhắc việc đề cập đến hiddenkhi tôi đang viết câu trả lời, nhưng đã quyết định chống lại nó bởi vì tôi không muốn làm quá lên. Về sự phản ánh, nó nên ở trong đó. Tôi sẽ cập nhật câu trả lời để bao gồm cả hai đề xuất hiện nay.
Giàu

@tommcdo Chỉ cần kiểm tra tài liệu cho: wall, và nó chỉ ghi bộ đệm đã thay đổi, vì vậy: cập nhật bufdo là không cần thiết sau tất cả.
Giàu

nắm bắt tốt về :wallđiều này, cũng có lợi thế là không đạp xe qua bộ đệm và di chuyển bạn ra khỏi nơi bạn bắt đầu. Tôi cho rằng :argdo updatevẫn là một câu chuyện khác - có thể bạn không muốn viết cho bộ đệm không có trong danh sách đối số của bạn.
tommcdo

@tommcdo Điểm tốt.
Giàu
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.