Sim, por exemplo, se você quiser fazer ls
, tente:
:!ls
Para gerar um shell, use
:shell
É possível digitar um comando bash dentro do vi e obter o stdout?
Acho muitas vezes tedioso fechar e reabrir o vi só porque quero procurar algo no shell.
Eu costumo usar ctrl+z
para dormir vi, executar o que eu preciso no shell, então fg
para retomar o vi. Não é exatamente uma resposta à sua pergunta, mas acho que é uma maneira muito rápida de trabalhar.
Se você esquecer que o vi está aberto em segundo plano (isso pode acontecer quando você está ocupado), quando você tentar sair do shell usando ctrl+d
, você será avisado de que tem trabalhos em segundo plano em execução e você pode fechá-los ou pressionar ctrl + d novamente para sair. Além disso, se você tentar reabrir o mesmo arquivo duas vezes, receberá um aviso de recuperação, para poder pressionar a
para abortar e executar fg para voltar ao vi.
Como você mencionou "obter o stdout", observe que você pode fazer
:r! command
e a saída do comando será adicionada ao arquivo, ou
:<range>!command
para que o conteúdo do intervalo seja filtrado por meio do comando [por exemplo, :1,$!wc
]
Usando o ponto-e-vírgula e o ponto de exclamação, você pode executar qualquer comando nos scripts de caminho e shell do shell, tenha em mente que o comando é executado sob o usuário executando o programa vi / vim e usando seu ambiente.
:!<command>
Como o vi usa o ambiente que estava em vigor quando foi executado, ele usa o mesmo caminho que estava no comando pai. Tenha em mente que alguns shells mantêm um cache dos programas no caminho, e o vi pode não funcionar com este cache (dependendo do shell que ele usa e de sua versão), então você pode acabar executando o binário errado no caso de ter mais de um binário com o mesmo nome.
Você pode ver a saída de um comando digitando, por exemplo, :!ls -lh
no modo de comando.
Se você quiser inserir a saída do comando no arquivo que está editando, basta adicionar um r
. Por exemplo, :r!which perl
.
Meu idioma preferido é
!!command
que é uma forma abreviada de
:.!command
que canaliza a linha atual através do comando e insere a saída no arquivo. O caso mais comum para mim é editar o comando com vi e executar:
!!sh
Ou
!<motion>command
como (por exemplo)
!apsh
para executar todo o parágrafo atual através do shell.
Eu tenho isso no meu .vimrc. Encontrado no Stack Overflow há algum tempo:
" Executes the current line in a bash shell; syntactically similar to slimv's ,d feature
:nmap ,,d Y:!<C-R>"<C-H><CR>
Eu rodeava isso facilmente no Linux abrindo duas janelas de linha de comando do terminal, rodando o vi em um e o outro disponível para outros trabalhos ao mesmo tempo.
Usar !
é obviamente a resposta correta, mas se você está alternando frequentemente, algo como screen ou tmux pode ser útil também.