Команды Bash внутри vi

33

Можно ли набрать команду bash внутри vi и получить стандартный вывод?

Мне часто бывает утомительно закрывать и открывать vi только потому, что я хочу что-то посмотреть в оболочке.

арфа
источник

Ответы:

45

Да, например, если вы хотите сделать ls, попробуйте:

:!ls

Чтобы порождать раковину, используйте

:shell

маргаритка
источник
офигенно, как я могу без этого жить?
Арфа
3
На самом деле, я часто забываю запускать vi от имени root при редактировании. Эта команда спасла меня от длительных переписываний больше раз, чем я помню. :w !sudo tee %
Марк Д
1
Я хотел бы, чтобы был какой-то способ сделать это в nano
GNU
1
а затем как вы вернетесь в редактор после использования: оболочки?
VaTo
@VaTo: Чтобы вернуться назад, вы можете набрать: exit
Raman Kathpalia
12

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

Если вы забудете, что vi открыт в фоновом режиме (это может произойти, когда вы заняты), при попытке выйти из оболочки с помощью ctrl+dвас будут предупреждены, что у вас запущены фоновые задания, и вы можете закрыть их, или снова нажмите Ctrl + D, чтобы выйти. Кроме того, если вы попытаетесь открыть один и тот же файл дважды, вы получите предупреждение о восстановлении, поэтому вы можете нажать, aчтобы прервать, и запустить fg, чтобы вернуться к vi.

Rqomey
источник
1
Это может застрять, если вы увлечены тем, что делаете в командной строке, и забыли, что у вас есть фон vim.
Элиот Бал
1
Да, это возможно, я сделал это сам. Для меня это стоит того, чтобы иметь постоянство оболочки. Я
обновлю
1
Я думаю, вам лучше использовать экран GNU.
user606723
1
Я сам использую tmux ... но для скорости, и если войти на сервер без tmux или экрана, это удобно
Rqomey
11

Поскольку вы упомянули «получить стандартный вывод», обратите внимание, что вы можете сделать

:r! command

и вывод команды будет добавлен в файл, или

:<range>!command

фильтровать содержимое диапазона с помощью команды [например :1,$!wc]

Random832
источник
:%!commandвыглядит довольно полезно
Элиот Болл
Я часто использую это для сортировки строк [например :.,+20 !sort]
Вальтер А
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

Использование !, очевидно, является правильным ответом, но если вы часто переключаетесь назад и вперед, вам может помочь что-то вроде screen или tmux.

Райан А.
источник
0

У меня есть это в моем .vimrc. Найден на переполнении стека некоторое время назад:

" 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 в одном, а другой одновременно для другой работы.

Гарри Уэстон
источник