Đầu ra ống của lệnh shell (!) Vào bộ đệm mới trong Vim


Câu trả lời:


27

Bạn không thể chuyển đầu ra của lệnh shell thành lệnh tạo bộ đệm mới, nhưng bạn có thể tạo bộ đệm mới và đọc đầu ra của lệnh shell vào bộ đệm đó bằng một mục trên dòng lệnh của Vim. Một phiên bản làm việc của ví dụ của bạn sẽ là

:tabnew | r !echo <c-r>=bufname("#")<cr>

Lưu ý rằng biểu tượng đường ống trong trường hợp này là dấu phân cách giữa các lệnh Vim ex, không phải đường ống của shell. Xem thêm

:help :tabnew
:help :r!
:help :bar

Đó gần như chính xác là những gì tôi cần, chỉ là cách khác để tôi có thể truy cập tên tệp của bộ đệm hiện tại. Lưu ý: cập nhật câu hỏi để hy vọng làm rõ kết quả cuối cùng mong muốn.
Richie Marquez

@Richard Marquez: tôi đã cập nhật câu trả lời này. tab mới hiện được mở với tên tệp "cũ", do đó bạn có thể gọi :! echo%
akira

Nhưng không phải :r!echokhông thay đổi bộ đệm.
Luc Hermitte

2
@ÿjohn, akira: cảm ơn vì sự giúp đỡ Phần "<cr> = ..." đã tạo ra lỗi Vim, nhưng tôi đã có thể làm cho nó hoạt động với ": tabnew | r! Echo #".
Richie Marquez

1
Cũng có thể hữu ích để lưu ý rằng nếu bạn muốn ánh xạ khóa này vào một khóa trong .vimrc của mình, bạn sẽ cần thay thế | ký tự với <bar>.
Richie Marquez

16

Đây là những gì tôi làm. Nó được ám chỉ trong các ý kiến ​​trong các câu trả lời ở trên.

:new | r ! <cmd>
:new | r ! <cmd> #   (# is replaced with filename)

Ví dụ 1 : Tìm tất cả các tệp văn bản trong/tmp

:new | r ! find /tmp -name '*.txt'

Ví dụ 2 : Bạn đang chỉnh sửa tệp foo.txt và bạn muốn chạy ls -la foo.txtvà nhận đầu ra trong bộ đệm:

:new | r ! ls -la #

Tên #được thay thế bằng tên tệp của bộ đệm ban đầu bạn đang chỉnh sửa. Điều này đặc biệt hữu ích cho các lệnh điều khiển nguồn ad-hoc, vd

:new | r ! hg annotate -un #

:newtạo một phân chia ngang, sử dụng :vnewnếu bạn muốn phân chia theo chiều dọc thay thế và :tabnewcho một tab mới.


Bạn có thể trả lời câu hỏi này ở đây không? đó là về việc cố gắng sử dụng bộ đệm hiện tại với %bộ đệm tiếp theo nhưng E499.
hhh


2

Nếu bạn thực sự yêu cầu lưu trữ kết quả trong một bộ đệm mới, nhưng yêu cầu thông tin từ bộ đệm hiện tại cũ, thì bạn có thể sử dụng system():

:let res = system('echo '.expand('%'))
:tabnew
:put=res

hoặc lưu trữ tên bộ đệm hiện tại cho sau này :

:let bn = expand('%')
:tabnew | :r!echo <c-r>=bn<cr>

Xem câu trả lời khác, bạn có thể làm điều đó mà không lưu tên trong một biến. Nhưng dù sao cũng trả lời tốt.
akira

Thật. Tôi không chắc chắn '#' sẽ cho kết quả như mong đợi trong trường hợp đó - vì tôi không bao giờ sử dụng các tab
Luc Hermitte
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.