Tôi có cùng mong muốn giống như bạn: Tôi muốn viết các lệnh vim bình thường và để chúng chỉnh sửa luồng đường ống. Tôi đã thất vọng bởi sự khó khăn khi sử dụng vim bình thường theo cách này (rất nhiều cờ!), Như được cung cấp bởi các tùy chọn vim mặc định.
Do đó, tôi đã viết một trình bao bọc nhỏ trên vim để làm điều đó: https://github.com/MilesCranmer/vim-stream/ . Nó được gọi là vims
.
Trung tâm của trình bao bọc là lệnh sau:
vim - -nes "${vim_cmds[@]}" -c ':q!' | tail -n +2
Sử dụng điều này, với thế hệ lệnh tôi làm, nó hoạt động khá ngắn gọn và vì vim là một trình soạn thảo phương thức, tôi đã tạo vims
một trình soạn thảo luồng phương thức. Có ba chế độ chính hữu ích cho tâm lý chỉnh sửa đường ống:
[-t|--turn-off-mode] - (Default mode)
Every string is a vim command line, e.g., '%g/foo/d' deletes
all lines with foo.
[-e|--exe-mode] - Translated to '%g/$1/exe "norm $2"', see examples below
[-s|--simple-mode] - Like exe-mode, but runs on 1st line only
Coi đây nè:
$ echo "Hello World" | vims -s "ea Beautiful"
Hello Beautiful World
Vì vậy, e
đi đến cuối Hello
, sau đó a
bắt đầu nối thêm.
Một cái gì đó fancier, trong chế độ exe, để nhận xét các dòng có chứa my_bad_var
và xóa dòng trước đó.
cat my_script.cpp | vims -e 'my_bad_var' 'I//\<esc>kdd'
Dịch nghĩa là vims '%g/my_bad_var/exe "norm I//\<esc>kdd"'
- I
lệnh bắt đầu chèn vào đầu dòng và //
là chuỗi nhận xét.
\<esc>kdd
nhấn phím thoát, di chuyển lên một dòng, sau đó xóa dòng.
Tôi có 11 ví dụ tổng thể về repo, tôi khuyến khích bạn kiểm tra chúng. Một lần nữa, điều này đang chạy trên đỉnh vim, đó chỉ là một cách để làm cho vim giống như sed cho đầu vào luồng (nhưng bảo toàn tất cả các macro vim yêu quý của bạn!)
|
vật dẫn đầu ra của lệnh này sang lệnh khác.wea-this
không phải là một lệnh. Đường ống không thể được sử dụng để đạt được những gì bạn muốn làm; Nó sẽ khiến stdin của Vim là ứng dụng tay trái, không phải bàn phím. Nếu bạn muốn đưa stdin vào một bộ đệm trong vim, hãy khởi động nó bằng một dấu trừ cho tên tệp :echo Hello, world! | vim -
.