Подавить вывод из автокоманды vim

13

У меня есть автокоманда, определенная в моем vimrc:

au BufWritePost * !./make.sh

Сценарий make.shкомпилирует .texфайл 3 раза, и я не хочу, чтобы вывод отображался.

Есть ли способ подавить вывод?

Я пытался добавить silentодну строку перед auкомандой, но это не сработало. Я тоже пробовал этот путь безуспешно.

Андре Герман Безерра
источник

Ответы:

20

Тишина должна идти раньше !./make.sh, а не раньше au. Если поставить silentперед, auзначит просто, он автоматически зарегистрирует автокоманду. Это должно выглядеть так:

au BufWritePost * silent! !./make.sh

Одна из проблем, связанных с запуском такой внешней команды с :silentкомандой, заключается в том, что экран не перерисовывается, и у вас остается пустой экран. Тем не менее, vim имеет команду, которая перерисовывает экран, которую можно использовать так:

au BufWritePost * silent! execute "!./make.sh >/dev/null 2>&1" | redraw!

Причина, по которой мне нужно использовать команду execute, заключается в том, что :!команда использует любые символы, найденные после нее, а это значит, что я не мог просто сделать это, silent! !./make.sh | redraw!потому что bash попытался бы интерпретировать все символы после !.

Примечания

Обратите внимание, что :silent!игнорирует сообщения об ошибках, а :silentне. Кроме того, >/dev/null 2>&1часть перенаправляет весь вывод !./make.shв /dev/null. Вы можете прочитать больше о перенаправлении ввода / вывода в bash здесь .

Соответствующие разделы справки

  • :help :execute
  • :help :silent
  • :help :!
  • :help :bar
Вечнозеленое дерево
источник
Вторая команда сработала, хотя она все еще печатает вывод на экран. Кроме того, мне не нужно нажимать Enter, когда скрипт больше не заканчивается, и это хорошо. Но мне интересно, есть ли способ полностью подавить вывод.
Андре Герман Безерра
1
Есть ли замена execute "!./make.sh"с execute "!./make.sh >/dev/null 2>&1"помощью? Это перенаправляет весь вывод команды на /dev/null. Прочтите tldp.org/LDP/abs/html/io-redirection.html для получения дополнительной информации о перенаправлении в bash.
EvergreenTree
Я должен был подумать об этом! Оно работает. Благодарность!
Андре Герман Безерра
7

Ответ на ваш прямой вопрос так же, как @EvergreenTree опубликовал. Однако я чувствую, что вам не хватает некоторых встроенных инструментов Vim для создания / компиляции / линтинга проектов. В частности, :makeсписок быстрых исправлений.

Что дает :makeнам использование?

Использование :makeпозволяет собирать ошибки в список, известный как список быстрых исправлений. Используя быстрое исправление, вы можете перемещаться между ошибками в ваших файлах, поэтому вы переходите прямо туда, где компилятор говорит об ошибке (удобно, правда?).

:сделать

Запуск :makeвыполнит программу make 'makeprg'. Затем проанализируйте вывод с помощью 'errorformat'и поместите каждую запись в список быстрых исправлений.

Обычно по 'makeprg'умолчанию используется makeкоманда, которая запускает Makefile. Однако вы можете изменить свой с 'makeprg'помощью :compilerкоманды или установить его непосредственно.

Вы также можете передать дополнительные аргументы :make. например:make clean

Примечание: во время выполнения :makeчасто вывод команды выводится внизу экрана с приглашением нажать клавишу ввода. Просто нажмите Enter, поскольку все выходные данные будут доступны в списке быстрых исправлений. Вы можете подавить это через :silent, например :silent make.

Обычная настраиваемая команда для автоматической сборки:

command -nargs=* -bar Smake silent make <args> <bar> cwindow

список быстрых исправлений

После того, как вы запустите :makeваш список быстрых исправлений, будет храниться вывод компилятора.

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

  • :copen открыть окно быстрого исправления
  • :cclose закрыть окно быстрого исправления
  • :cnext/ :cprevдля перехода к следующему / предыдущему элементу
  • :ccраспечатать внизу текущую ошибку или :cc 3показать конкретную ошибку в этом примере 3

Лично я использую Тима папы неразделенного плагин для перемещения по списку QuickFix.

А как насчет :makeавтоматического и бесшумного запуска ?

Вы можете сделать это с таким :autocmdже, как вы, где.

augroup auto_make
    autocmd!
    autocmd BufWritePost * silent make
    autocmd QuickFixCmdPost *make* cwindow
augroup END

В качестве бонуса я добавил при открытии окна быстрого исправления через, :cwindowесли есть какие-либо ошибки присутствуют.

Примечание: должен быть более конкретным с этим шаблоном файла на BufWritePostautocmd, чтобы не связанные файлы не создавались.

Там еще больше ?!

Это использует только несколько встроенных команд Vim плюс несколько autocmd для убеждения. Есть, конечно, плагины и инструменты, которые могут помочь вам

  • Dispatch.vim может использоваться для :makeасинхронного запуска заданий.
  • Синтаксический плагин проверяет файл после :write.
  • Ale.vim (Asynchronous Lint Engine) - это плагин для обеспечения линтинга в NeoVim и Vim 8 во время редактирования текстовых файлов.
  • Unimpaired.vim упрощает управление списком быстрых исправлений.
  • Обычные старые Makefiles. Если вы ./script.shне очень сложны, вы можете попробовать использовать make. Он может масштабировать и выполнять больше задач позже и является распространенным инструментом построения.
  • Вы можете использовать Vim Awesome для поиска дополнительных плагинов, которые могут помочь.

Вывод

Лично я интегрирую :makeи быстрое исправление в свой рабочий процесс. Я считаю, что захват результатов вашего процесса сборки и фиксация ошибок окупаются. В качестве дополнительного бонуса вам, возможно, станет удобнее использовать список быстрых исправлений, и вы сможете использовать этот список для других приложений, например :grep.

Для получения дополнительной помощи см .:

:h :make
:h quickfix
:h 'makeprg'
:h 'errorformat'
:h :compiler
:h :copen
:h :cwindow
:h :cnext
:h :cc
Питер Ринкер
источник
Я думал о том, :makeкогда отвечал на это, но я не включил это. Лучше использовать команду make fore compiling.
EvergreenTree
Как изменить autocmd для запуска makeprg только для определенного файла.
Ибн Саид