Suprimir a saída de um autocomand vim

13

Eu tenho um comando automático definido no meu vimrc:

au BufWritePost * !./make.sh

O script make.shcompila um .texarquivo três vezes e não quero que a saída seja exibida.

Existe uma maneira de suprimir a saída?

Tentei adicionar silentuma linha antes do aucomando, mas não funcionou. Eu também tentei dessa maneira sem sucesso.

Andre Herman Bezerra
fonte

Respostas:

20

Silencioso deve ir antes !./make.sh, não antes au. Colocar silentantes auapenas significa que ele registrará o comando automático silenciosamente. Em vez disso, deve ficar assim:

au BufWritePost * silent! !./make.sh

Um problema ao executar um comando externo como este com o :silentcomando é que a tela não é redesenhada, deixando uma tela em branco. No entanto, o vim possui um comando que redesenha a tela, que pode ser usado assim:

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

O motivo pelo qual eu preciso usar o comando execute é porque o :!comando usa qualquer caractere encontrado depois dele, o que significa que eu não poderia fazê-lo silent! !./make.sh | redraw!porque o bash tentaria interpretar todos os caracteres depois !.

Notas

Observe que :silent!ignora as mensagens de erro, enquanto :silentnão. Além disso, a >/dev/null 2>&1peça redireciona toda a saída de !./make.shpara /dev/null. Você pode ler mais sobre o redirecionamento de E / S no bash aqui .

Tópicos de ajuda relevantes

  • :help :execute
  • :help :silent
  • :help :!
  • :help :bar
EvergreenTree
fonte
O segundo comando funcionou, embora ainda imprima a saída na tela. Além disso, não preciso pressionar Enter quando o script terminar mais, o que é bom. Mas eu me pergunto se existe alguma maneira de suprimir totalmente a saída.
Andre Herman Bezerra
1
Substituir execute "!./make.sh"com execute "!./make.sh >/dev/null 2>&1"ajuda? Isso redireciona toda a saída do comando para /dev/null. Leia tldp.org/LDP/abs/html/io-redirection.html para obter mais informações sobre redirecionamento no bash.
EvergreenTree
Eu devia ter pensado nisso! Funciona. Obrigado!
Andre Herman Bezerra
7

A resposta para sua pergunta direta é exatamente como o @EvergreenTree postou. No entanto, sinto que você está perdendo algumas das ferramentas integradas do Vim para criar / compilar / projetar projetos. Mais notavelmente :makee a lista de correções rápidas.

O que o uso :makenos leva?

O uso :makepermite coletar seus erros em uma lista conhecida como lista de correções rápidas. Usando o quickfix, você pode navegar entre os erros em seus arquivos, para ir direto para o local onde o compilador diz que está o erro (útil, certo?).

:faço

A execução :makeexecutará o programa make 'makeprg',. Em seguida, analise a saída 'errorformat'e coloque cada entrada na lista de correções rápidas.

Normalmente, o 'makeprg'padrão é o makecomando que executa a Makefile. No entanto, você pode alterar o seu 'makeprg'através do :compilercomando ou configurá-lo diretamente.

Você também pode passar argumentos extras para :make. por exemplo:make clean

Nota: a execução :makegeralmente mostra a saída do comando na parte inferior da tela com um prompt pedindo para pressionar enter. Basta pressionar Enter, pois toda a saída estará disponível na lista de correções rápidas. Você pode suprimir isso via :silent, por exemplo :silent make.

Um comando personalizado comum para uma make silenciosa é:

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

lista de correções rápidas

Depois de executar :makesua lista de correções rápidas, a saída do compilador será mantida.

Use o seguinte comando para navegar na lista de correções rápidas.

  • :copen abrir a janela do quickfix
  • :cclose fechar a janela do quickfix
  • :cnext/ :cprevpara ir para o item seguinte / anterior
  • :ccimprimir na parte inferior o erro atual ou :cc 3mostrar um erro específico neste exemplo 3

Pessoalmente, uso o plug-in intacto de Tim Pope para navegar na lista de correções rápidas.

Que tal correr :makeautomaticamente e silenciosamente?

Você pode fazer isso :autocmdexatamente como você.

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

Como um bônus, eu adicionei ao abrir a janela do quickfix via :cwindowse houver algum erro presente.

Nota: deve ser mais específico com esse padrão de arquivo no BufWritePostautocmd para que os arquivos não relacionados não sejam construídos.

Ainda mais ?!

Isso está usando apenas alguns comandos internos do Vim, além de alguns autocmd's para convencer. É claro que existem plugins e ferramentas que podem ajudá-lo

  • Dispatch.vim pode ser usado para executar :maketarefas de forma assíncrona.
  • A sintaxe do plug-in sintático verifica o arquivo depois :write.
  • O Ale.vim (Asynchronous Lint Engine) é um plug-in para fornecer dicas no NeoVim e no Vim 8 enquanto você edita seus arquivos de texto.
  • O Unimpaired.vim facilita o gerenciamento da lista de correções rápidas.
  • Makefiles antigos simples. A menos que você ./script.shseja muito complicado, você pode querer usar o make. Ele pode ser escalado para realizar mais tarefas posteriormente e é uma ferramenta de construção comum.
  • Você pode usar o Vim Awesome para procurar mais plugins que possam ajudar.

Conclusão

Pessoalmente, :makeintegro e o quickfix ao meu próprio fluxo de trabalho. Acredito que capturar a saída do seu processo de compilação e capturar os erros valem o investimento. Como um bônus adicional, você possivelmente se sentirá mais confortável com a lista de correções rápidas e poderá usá-la para outros aplicativos, como :grep.

Para obter mais ajuda, consulte:

:h :make
:h quickfix
:h 'makeprg'
:h 'errorformat'
:h :compiler
:h :copen
:h :cwindow
:h :cnext
:h :cc
Peter Rincker
fonte
Pensei :makeenquanto respondia, mas não o incluí. É uma idéia melhor usar o make antes de compilar as coisas.
EvergreenTree
como alterar o autocmd para executar apenas makeprg em um determinado arquivo.
Ibn Saeed