:!<command>
pode ser usado para executar um comando no shell. Mas isso "assume" meu terminal e o preenche com stdout
esse comando específico.
Como executo um comando em segundo plano que só me notifica em um código de saída diferente de zero?
external-command
OrangeTux
fonte
fonte
Respostas:
:silent exec "!command"
Observe que sua sessão vim ainda estará ocupada enquanto seu comando estiver em execução. Isso se deve à natureza síncrona do Vim. Você ainda pode voltar ao seu shell pressionando CTRL + z (para enviar o Vim para o segundo plano) e depois retomar o vim com o comando
fg
normalmente.Para fazer as coisas de forma assíncrona, dê uma olhada no plugin vim-dispatch de Tim Pope ou no projeto NeoVim, que possui suporte nativo para execução de comandos assíncronos, que você pode aproveitar facilmente usando o plugin NeoMake. A versão mais recente do Vim também oferece suporte para tarefas assíncronas.
Veja : h: silencioso
fonte
:silent !ls
) ... Ele também não 't dar saída apropriada em um-0 não código de saída ... Então eu tenho medo é um pouco mais envolvido do que apenas usando:silent
...:silent exec "!ls"
nem:silent !ls
mostro nenhuma saída na minha versão do Vim, 7.4 com os patches 1-213.:silent !ls
: i.stack.imgur.com/1XvS6.png ... Preciso pressionar^L
para corrigi-lo novamente ...Para executar um comando sem acionar a mensagem Enter, como:
tente o seguinte exemplo simples:
Em seguida, pressione Ctrl+ L(ou
:redraw!
) para atualizar a tela quando voltar ao Vim.Para evitar a necessidade de atualização, você pode definir seu próprio comando personalizado, como:
Agora, você pode usar o novo comando Vim para executar um comando shell (nota: sem ! E com S maiúsculo ):
Fonte: Evitando os avisos "Pressione ENTER para continuar" no site da Vim Wikia
fonte
:Silent ctags -R . > /dev/null &
sejam executados em segundo plano. Enviar stdout para / dev / null impede que a saída apareça no buffer do vim.Uma solução rápida e suja (em puro Vimscript)
Isso pode iniciar um processo em segundo plano:
Mas o Vim precisa de uma maneira de descobrir quando o processo foi concluído e como, então, vamos usar um arquivo de marcador:
Agora, podemos pedir ao Vim para verificar de vez em quando se o processo foi concluído:
Ei, não é bonito, mas funciona!
Desvantagens
Infelizmente, o autocmd acima não será acionado até você mover o cursor. E se você deseja executar mais de um processo em segundo plano por vez, precisará adicionar IDs exclusivos a esses arquivos e ao nome do grupo autocmd.
Portanto, se você puder lidar com uma dependência extra, é melhor usar uma solução testada e comprovada, como o plug-in vim-dispatch mencionado em outra resposta.
Exibindo saída
Se você deseja ver a saída do processo, em vez de apenas o código de saída , substitua a final
echo
acima por:Isso abriria a janela de visualização. Para usar a lista de erros do quickfix:
A lista de correções rápidas permite navegar facilmente para erros usando
:cnext
. No entanto,copen
move o cursor para a janela do quickfix quando ela é aberta, o que provavelmente será surpreendente / irritante.(Uma solução alternativa seria abrir a janela QF
:copen
ao iniciar o processo inicialmente, para que você não precise chamá-lo no final.)fonte
Executando um comando em segundo plano
Eu estava executando um comando que bloqueou um pouco e realmente não me importei com a saída. Isso pode ser resolvido iniciando o processo anexado não ao terminal / emulador, mas ao sistema e redirecionando toda a saída para / dev / null. Por exemplo:
o
(...&)
executa em segundo plano e> /dev/null
redireciona toda a saída para/dev/null
(nada).Os parênteses prendem a saída em um subshell (ou algo assim), mas tem o efeito colateral de não ser anexado ao shell atual (não é grande coisa).
Executando um Comando Silenciosamente em Segundo Plano com Mapeamento
Acabei de perceber que, se você estiver mapeando, pode fazer algo como
O item acima não exibirá nada na barra de comando e, além disso, não exibirá nada no terminal fora do vim. Será mapeado para
<leader>
e, que é \ epor padrão.Executando um comando, capturando sua saída, exibindo seu conteúdo
(Outra edição - e talvez a melhor). Este mostrará a saída de um comando se você escolher:
DENTRO DE UMA NOVA TAB:
DENTRO DE UMA DIVISÃO VERTICAL:
DENTRO DE UMA FENDA HORIZONTAL:
... faça o que você quiser
fonte
Se você não se importa com o código de saída, pode fazer isso:
fonte
v:shell_error
variável informaráNão tenho certeza se isso atende às suas necessidades (não lida com processos em segundo plano como em
foo &
- não tenho certeza se é isso que você quer dizer com "em segundo plano" ), mas um comando personalizado pode ser usado como em:Então use como por exemplo:
Se você não precisa / deseja que a mensagem de erro seja
system()
suficiente, verifiquev:shell_error
e relate por exemploecho Error!
.Na ajuda v: shell_error :
fonte
foo &
…” . A partir do texto Q como um todo, eu o interpretei como sendo um ou outro. Ou “Executar como comando externo AKA background” ou “Executar como comando externo _e_ como processo em background” . Eu respondi principalmente com base no título de Q etc. - e adicionei um comentário sobre "Não tenho certeza ..." - e deixei para o OP esclarecer se é ou não.O Vim 8 introduziu o suporte a trabalhos. Pode-se executar comandos externos em segundo plano sem depender de plug-ins. Por exemplo, para executar um servidor de descontos ( markserv ) no local atual e não bloquear a sessão do vim:
Isso inicia o processo markserv como um subprocesso do processo vim atual. Você pode verificar isso com
pstree
.Consulte job_start
fonte
Eu uso o seguinte código:
Agora você pode digitar o seguinte
Isso parece quase com o
silent !
comando interno do Vim , exceto a capitalS
. Ele ainda permite um opcional!
para torná-lo ainda mais semelhante. A chamada parasystem()
torna o comando shell verdadeiramente silencioso: nenhuma tela pisca e não é redesenhada.(e se você precisar de um código de status, pode verificar a
v:shell_error
variável, consulte a ajuda para obter mais informações)fonte
O plug- in AsyncRun, se projetado para isso, permite executar comandos do shell em segundo plano no Vim8 / NeoVim e exibir a saída na janela do quickfix.
Apenas como uma substituição do
!
comando:Você também pode ocultar completamente a saída na janela do quickfix:
Quando o trabalho for concluído, o AsyncRun o notificará passando uma opção
-post
:O script vim definido por
-post
será executado após a conclusão do trabalho.fonte