Có thể thực thi tập lệnh VIM ở chế độ không tương tác không?


8

Trình theo dõi lỗi Gnats có một lệnh (edit-pr) mở một vé bằng $ EDITOR. $ EDITOR của tôi là VIM và khi lệnh này mở vé trong $ EDITOR, tôi muốn tự động thực hiện một số chỉnh sửa theo kịch bản mà không phải thực hiện bất kỳ thao tác gõ phím nào.

Có cách nào để viết một tập lệnh VIM có thể chạy không tương tác như thế này không?

Câu trả lời:


3

Tôi chưa bao giờ sử dụng gnats, vì vậy thật khó để nói chính xác những gì edit-prđang được mong đợi sẽ được thực hiện. Nhưng từ những gì bạn đã cung cấp cho chúng tôi, bạn có thể thử thay đổi biến env EDITOR thành tập lệnh shell tùy chỉnh hoặc thậm chí có thể là tập lệnh python hoặc một cái gì đó.

EDITOR=/path/to/script.(sh|py) edit-pr <args>

Nhưng như tôi đã nói, tôi không biết nó muốn chỉnh sửa kiểu gì, hoặc cần phải thực hiện những gì trong trình chỉnh sửa. Có lẽ nếu bạn đã cho chúng tôi một ví dụ về những gì bạn muốn tự động hóa?


Lệnh gnats chỉ là một ví dụ. Tôi đang tìm kiếm một giải pháp chung và tôi nghĩ câu trả lời của bạn là con đường để đi. Cảm ơn!
Matt Pfefferle

20

Mặc dù bạn đã nhận được câu trả lời cho câu hỏi của mình, những người khác có thể thấy điều này hữu ích.

Các lệnh Vim cũng có thể được chỉ định trong một tệp được thực thi bằng -stùy chọn:

    vim -s commands.txt file

Thí dụ:

    echo 'gg=G' > indent.txt
    echo ':wq' >> indent.txt
    vim -s indent.txt file

Điều này sẽ sử dụng Vim để thụt lề nội dung của tệp, lưu và thoát.


13

Các lệnh Vim có thể được chỉ định trên dòng lệnh khi bạn chạy chương trình như thế này:

vim file.txt "+:s/foo/bar/g"

Bạn có thể tiếp tục thêm các lệnh bằng cách thêm "+[cmd]"đối số. Bạn có thể kết thúc ở đó và trình soạn thảo sẽ mở, chạy các lệnh đó và chờ hoặc bạn hoặc bạn có thể thêm một "+:wq"để lưu và đóng tệp.

Bạn cũng có thể viết một tập lệnh bằng cú pháp vimscript và bọc nó trong một hàm để gọi khi tệp mở hoặc trong một tập lệnh riêng biệt để nhập và áp dụng cho bộ đệm bằng cú pháp ở trên.


5

Để thực thi vim trong chế độ không tương tác, bạn có thể sử dụng +{command}/ -c {command}hoặc -stham số sẽ cho phép bạn thực thi các lệnh vim sau khi tệp đầu tiên được đọc.

Kiểm tra một vài ví dụ dưới đây.

Lệnh đầu vào và đầu ra tiêu chuẩn đơn giản có thể đạt được bằng lệnh:

$ echo Example | vim -es '+:wq! /dev/stdout' /dev/stdin | cat

Để chỉnh sửa một tệp và lưu các thay đổi sang tệp khác:

$ vim -es '+:0,$s/127/128/g' '+:wq! new_file' /etc/hosts
$ cat file1 file2 | vim - -es '+:0,$s/foo/test/g' '+:wq! file3'

Để chỉnh sửa tệp tại chỗ, bạn có thể sử dụng -s {scriptin}để tệp script được đọc, ví dụ:

$ echo ':0,$s/foo/test/ge' > cmds.txt
$ echo ':wq' >> cmds.txt
$ vim -s cmds.txt -es file

Để phân tích tệp và gửi nó đến đầu ra của đường ống, bạn có thể thử như sau:

$ cat /etc/hosts | vim -es '+:0,$s/127/128/g' '+%print' '+:q!' /dev/stdin | cat

hoặc là:

$ cat /etc/hosts | vim -es '+:0,$s/127/128/g' '+:wq! /dev/stdout' /dev/stdin | cat

Xem thêm: Làm cách nào để chỉnh sửa các tệp không tương tác (ví dụ: trong đường ống)? tại Vim SE


Rất tiện dụng! Bất kỳ ý tưởng nào tài nguyên sao lưu máy nhắn tin của Vim, ví dụ, nơi :hicó thể cuộn và hiển thị -- More -- SPACE/d/j: screen/page/line down, b/u/k: up, q: quit? Nó không xuất hiện trong danh sách bộ đệm và viết bằng cách :wghi một tệp trống (và tổ hợp phím 'enter' khiến máy nhắn tin cuộn hoặc thoát.) Tôi có thể sử dụng :redir! >file | :hi | :redir END , nó chụp nhiều như tôi cuộn. Tôi nghĩ rằng nó có thể hoạt động cơ học như 2 hướng more. Tôi phải tự hỏi tại sao :help:hicả hai đều không phân trang hay cả bộ đệm RO ...
John P
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.