Bash команди всередині vi


33

Чи можна набрати команду bash всередині vi і отримати stdout?

Мені здається, що часто нудно закривати та знову відкривати vi лише тому, що я хочу щось шукати в оболонці.

Відповіді:


45

Так, наприклад, якщо ви хочете це зробити ls, спробуйте:

:!ls

Для нересту оболонки використовуйте

:shell


дивовижно, як я міг жити без цього?
арфа

3
Насправді те, що я часто роблю, це забути запустити vi як root під час редагування чогось. Ця команда врятувала мене від тривалих переписувань більше разів, ніж я пам'ятаю. :w !sudo tee %
Марк D

1
Мені б хотілося, щоб це було в gnunano
ixtmixilix

1
а потім як повернутися до редактора після використання: shell?
VaTo

@VaTo: Щоб повернутися назад, ви можете ввести: exit
Raman Kathpalia

12

Я схильний використовувати ctrl+zдля сну vi, виконувати те, що мені потрібно в оболонці, а потім fgвідновити vi. Не зовсім відповідь на ваше запитання, але я вважаю це дуже швидким способом роботи.

Якщо ви забудете, що у вас відкритий фон у фоновому режимі (це може статися, коли ви зайняті), коли ви намагаєтеся вийти з оболонки за допомогою ctrl+dвас, вас попередить, що у вас запущені фонові завдання, і ви можете або закрити їх, або знову натисніть ctrl + d, щоб вийти. Крім того, якщо ви спробуєте повторно відкрити один і той самий файл двічі, ви отримаєте попередження про відновлення, тож ви можете натиснути, aщоб перервати або запустити fg, щоб повернутися до vi.


1
Це може стати липким, якщо ви потрапите в те, що ви робите в командному рядку, і забудете, що у вас з'явився фон vim.
Еліотський бал

1
Так, можливо, я це зробив сам. Для мене варто мати сталість оболонки. Я
оновлю

1
Я думаю, вам буде краще використовувати gnu screen.
user606723

1
Я сам використовую tmux ... але для швидкості, і якщо увійшов на сервер без tmux чи екрану, це зручно
Rqomey

11

Оскільки ви згадали про "дістати stdout", зауважте, що ви можете це зробити

:r! command

і вихід команди буде доданий у файл, або

:<range>!command

щоб зміст діапазону було відфільтровано за допомогою команди [наприклад :1,$!wc]


:%!commandвиглядає досить корисно
Eliot Ball

Я часто використовую це для сортування рядків [напр. :.,+20 !sort]
Walter A

5

Моя краща ідіома - це

!!command

який є скороченим

:.!command

який передає поточну лінію через команду та вставляє вихід у файл. Найпоширеніший випадок для мене - це редагувати команду з vi і запускати:

!!sh

Або

!<motion>command

наприклад (наприклад)

!apsh

пропустити весь поточний абзац через оболонку.


2
Зауважте, що !}ви повинні розміщуватись на початку абзацу, спробуйте !ap. (Я не знаю, чи є це в кожному vi чи лише vim)
Random832,

4

Використовуючи двокрапку та знак оклику, ви можете запустити будь-яку команду в шляху до оболонки та скриптах оболонки, майте на увазі, що команда працює під користувачем, який запускає програму vi / vim, та використовуючи її оточення.

:!<command>

Оскільки vi використовує середовище, яке діяло під час його запуску, воно використовує той самий шлях, який був у батьківській команді. Майте на увазі, що деякі оболонки зберігають кеш програм на шляху, і vi може не працювати з цим кешем (залежно від оболонки, яку він використовує та її версії), тож ви можете в кінцевому рахунку запустити неправильний бінарний файл, якщо у вас є більше ніж один двійковий файл з однаковою назвою.


4

Ви можете побачити вихід команди, ввівши, наприклад, :!ls -lhв командному режимі.

Якщо ви хочете вставити вихід команди в файл, який ви редагуєте, просто додайте r. Наприклад, :r!which perl.


1

Використання !- це, очевидно, правильна відповідь, але якщо ви часто перемикаєтесь назад і назад, може бути корисним і те, як екран або tmux.


0

Я маю це у своєму .vimrc. Знайдено на стеку Overflow деякий час назад:

" Executes the current line in a bash shell; syntactically similar to slimv's ,d feature
:nmap ,,d Y:!<C-R>"<C-H><CR>

0

Я б і так легко обійшов це в Linux, відкривши два вікна командного рядка терміналу, запустивши vi в одному та іншому, доступному для інших робіт одночасно.

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