Comandos Bash dentro do vi

32

É 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.

    
por harp 11.09.2012 / 09:59

9 respostas

44

Sim, por exemplo, se você quiser fazer ls , tente:

:!ls

Para gerar um shell, use

:shell

    
por 11.09.2012 / 10:03
12

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.

    
por 11.09.2012 / 10:16
10

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 ]

    
por 11.09.2012 / 15:58
4

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.

    
por 11.09.2012 / 10:17
4

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 .

    
por 11.09.2012 / 14:28
4

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.

    
por 11.09.2012 / 17:20
0

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>
    
por 12.09.2012 / 03:11
0

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.

    
por 13.09.2012 / 20:18
0

Usar ! é obviamente a resposta correta, mas se você está alternando frequentemente, algo como screen ou tmux pode ser útil também.

    
por 18.03.2013 / 21:55

Tags