Трубопровід команди оболонки (!) В новий буфер у Vim


Відповіді:


27

Ви не можете передавати висновок команди оболонки в команду, яка створює новий буфер, але ви можете створити новий буфер і прочитати висновок команди оболонки в цей буфер одним записом у командному рядку Vim. Працюючим варіантом вашого прикладу буде

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

Зауважте, що символ труби в цьому випадку є роздільником між командами Vim ex, а не трубою оболонки. Дивись також

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

Це майже саме те, що мені потрібно, просто навпаки, щоб я міг отримати доступ до імені поточного буфера. Примітка: оновлено питання, щоб сподіватися уточнити бажаний кінцевий результат.
Річі Маркес

@ Річард Маркес: я оновив цю відповідь. нова вкладка тепер відкрита зі "старим" ім'ям файлу, таким чином ви можете зателефонувати:! echo%
akira

Але не :r!echoбез зміни буфера.
Люк Ермітте

2
@garyjohn, akira: дякую за допомогу. Частина "<cr> = ..." зробила помилки в написанні Vim, але я зміг змусити її працювати з ": tabnew | r! Echo #".
Річі Маркес

1
Також може бути корисно зауважити, що якщо ви хочете зіставити це на ключ у вашому .vimrc, вам потрібно буде замінити | символ з <bar>.
Річі Маркес

16

Ось що я роблю. На це згадується в коментарях до вищезгаданих відповідей.

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

Приклад 1 : Знайдіть усі текстові файли в/tmp

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

Приклад 2 : Ви редагуєте файл foo.txt і хочете запустити ls -la foo.txtта отримати вихід у буфері:

:new | r ! ls -la #

#Замінюється на ім'я файлу вихідного буфера ви редагуєте. Це особливо корисно для спеціальних команд управління джерелом, наприклад

:new | r ! hg annotate -un #

:newстворює горизонтальний розкол, використовуйте, :vnewякщо ви хочете вертикальний розкол замість нього та :tabnewдля нової вкладки.


В змозі відповісти на це питання Ви тут , а? йдеться про спробу використовувати поточний буфер %для наступного буфера, але не E499.
hhh


2

Якщо ви дійсно вимагаєте зберігати результат у новому буфері, але вимагаєте інформацію зі старого поточного буфера, то ви можете використовувати system():

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

або зберегти поточне ім’я буфера для подальшого :

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

дивіться іншу відповідь, ви можете це зробити, не зберігаючи ім’я в змінній. але гарна відповідь все одно.
акіра

Справді. Я не був впевнений, що "#" дасть очікуваний результат у такому випадку - оскільки я ніколи не використовую вкладки
Люк Ермітт,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.