:!<command>
может использоваться для выполнения команды в оболочке. Но это «захватывает» мой терминал и наполняет его stdout
именно этой командой.
Как выполнить команду в фоновом режиме, которая уведомляет меня только о ненулевом коде выхода?
external-command
OrangeTux
источник
источник
Ответы:
:silent exec "!command"
Обратите внимание, что ваша сессия vim все еще будет занята во время выполнения вашей команды. Это связано с синхронным характером Vim. Вы все еще можете вернуться к своей оболочке, нажав CTRL + z (чтобы отправить Vim в фоновый режим), а затем возобновить работу vim с помощью команды,
fg
как обычно.Чтобы сделать все асинхронно, взгляните на плагин Tim Pope vim-dispatch или проект NeoVim, который имеет встроенную поддержку асинхронного выполнения команд, которую вы легко можете использовать с помощью плагина NeoMake. Последняя версия Vim также поддерживает асинхронные задачи.
Смотри : h: тихий
источник
:silent !ls
) ... Это также не не дает правильного вывода для кода выхода, отличного от 0 ... Так что я боюсь, что это немного сложнее, чем просто использование:silent
...:silent exec "!ls"
ни:silent !ls
показать никакого вывода вообще на моей версии Vim, 7.4 с патчами 1-213.:silent !ls
: i.stack.imgur.com/1XvS6.png ... Мне нужно нажать,^L
чтобы исправить это снова ...Чтобы выполнить команду без запуска сообщения Enter, например:
попробуйте следующий простой пример:
Затем нажмите Ctrl+ L(или
:redraw!
), чтобы обновить экран, когда вернетесь к Vim.Чтобы избежать необходимости обновления, вы можете определить свою собственную команду, например:
Теперь вы можете использовать новую команду Vim для запуска команды оболочки (примечание: без ! И с заглавной буквы S ):
Источник: Избегайте подсказок «Нажмите ENTER, чтобы продолжить» на сайте Vim Wikia
источник
:Silent ctags -R . > /dev/null &
запускаться в фоновом режиме. Отправка stdout в / dev / null предотвращает появление выходных данных в буфере vim.Быстрое и грязное решение (в чистом Vimscript)
Это может запустить процесс в фоновом режиме:
Но Vim нужен способ узнать, когда процесс завершен и как, поэтому давайте воспользуемся файлом маркера:
Теперь мы можем попросить Vim часто проверять, завершился ли процесс:
Эй, это не красиво, но вроде как работает!
Недостатки
К сожалению, приведенный выше autocmd не сработает, пока вы не переместите курсор. И если вы хотите запускать более одного фонового процесса одновременно, вам нужно будет добавить уникальные идентификаторы в эти файлы и в имя группы autocmd.
Поэтому, если вы можете справиться с дополнительной зависимостью, вам может быть лучше использовать проверенное решение, такое как плагин vim-dispatch, упомянутый в другом ответе.
Отображение вывода
Если вы хотите увидеть выходные данные процесса, а не просто код выхода , замените последний результат
echo
на:Это откроет окно предварительного просмотра. Чтобы использовать список ошибок быстрого исправления вместо:
Список быстрых исправлений позволяет легко переходить к ошибкам с помощью
:cnext
. Однако при егоcopen
перемещении курсор в окно быстрого исправления открывается, что, вероятно, будет удивительно / раздражающим.(Обходным путем для этого может быть открытие окна QF
:copen
при первом запуске процесса, поэтому вам не нужно будет вызывать его в конце.)источник
Запуск команды в фоновом режиме
Я выполнял команду, которая немного блокировалась, и мне было наплевать на вывод. Об этом можно позаботиться, запустив процесс, подключенный не к терминалу / эмулятору, а скорее к системе, и перенаправив весь вывод в / dev / null. Например:
(...&)
работает в фоновом режиме и> /dev/null
перенаправляет весь вывод/dev/null
(ничего).Круглая скобка выводит выходные данные в подоболочку (или что-то в этом роде), но у нее есть побочный эффект - она не привязана к текущей оболочке (не имеет значения).
Запуск команды в фоновом режиме с отображением
Я просто понял , что если вы находитесь на самом деле, отображение его, вы можете сделать что - то вроде
Выше ничего не будет отображаться в командной строке и, кроме того, не будет ничего отображать в терминале за пределами vim. Это будет сопоставлено
<leader>
e, что \ eпо умолчанию.Выполнение команды, захват ее вывода, отображение ее содержимого
(Другое редактирование - и, возможно, самое последнее). Это один будет отображаться на выходе из команды , если вы так выбираете:
ВНУТРИ НОВОГО TAB:
ВНУТРИ ВЕРТИКАЛЬНОГО РАЗДЕЛЕНИЯ:
ВНУТРИ ГОРИЗОНТАЛЬНОГО РАЗДЕЛЕНИЯ:
... делай что хочешь
источник
Если вам не важен код выхода, вы можете пойти с этим:
источник
v:shell_error
переменная будет сказать вамНе уверен, что это соответствует вашим потребностям (не обрабатывает фоновые процессы как в
foo &
- не уверен, что это то, что вы подразумеваете под «в фоновом режиме» ), но можно использовать пользовательскую команду, как в:Затем используйте как, например:
Если вам не нужно / хотят сообщение об ошибке просто
system()
может хватить, а затем проверитьv:shell_error
и отчет , напримерecho Error!
.Из справки v: shell_error :
источник
foo &
…» . Из текста Q в целом я истолковал его как либо либо, либо. Либо «Выполнить как внешняя команда AKA фон», либо «Выполнить как внешняя команда _and_ как фоновый процесс» . Я отвечал в основном на основе названия Q и т. Д. - и добавил комментарий «Не уверен…» - и оставил это на OP, чтобы уточнить, если либо, либо.Vim 8 ввел поддержку рабочих мест. Можно запускать внешние команды в фоновом режиме, не полагаясь на плагины. Например, чтобы запустить сервер уценки ( markserv ) в текущем местоположении, а не блокировать сеанс vim:
Это запускает процесс markserv как подпроцесс текущего процесса vim. Вы можете проверить это с
pstree
.Смотри job_start
источник
Я использую следующий код:
Теперь вы можете ввести следующее
Это выглядит почти как встроенная
silent !
команда Vim , за исключением столицыS
. Это даже позволяет опционально!
сделать его еще более похожим. Вызовsystem()
делает команду оболочки по-настоящему тихой: экран не мигает и не перерисовывается.(и если вам когда-либо понадобится код состояния, вы можете проверить
v:shell_error
переменную, см. справку для получения дополнительной информации)источник
AsyncRun плагин , если они предназначены для этого, она позволяет запускать команды оболочки в фоновом режиме в Vim8 / NeoVim и вывод изображения в QuickFix окна.
Так же, как замена
!
команды:Вы также можете полностью скрыть вывод в окне быстрого исправления:
Когда работа будет завершена, AsyncRun уведомит вас, передав опцию
-post
:Сценарий vim, определенный с помощью,
-post
будет выполнен после завершения задания.источник