Làm cách nào tôi có thể chuyển đầu ra của lệnh shell sang bộ đệm mới trong Vim? Điều sau đây rõ ràng sẽ không hoạt động, nhưng bạn có thể thấy những gì tôi đang làm:
:!echo % | :newtab
Làm cách nào tôi có thể chuyển đầu ra của lệnh shell sang bộ đệm mới trong Vim? Điều sau đây rõ ràng sẽ không hoạt động, nhưng bạn có thể thấy những gì tôi đang làm:
:!echo % | :newtab
Câu trả lời:
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
:r!echo
không thay đổi bộ đệm.
Đâ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.txt
và 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 #
:new
tạo một phân chia ngang, sử dụng :vnew
nếu bạn muốn phân chia theo chiều dọc thay thế và :tabnew
cho một tab mới.
:tabnew | enew | r ! <your shell cmd>
làm việc cho tôi
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>