Comandos Bash dentro do vi


33

É possível digitar um comando bash dentro do vi e obter o stdout?

Acho muitas vezes entediante fechar e reabrir o vi apenas porque quero procurar algo no shell.

Respostas:


45

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

:!ls

Para gerar uma concha, use

:shell


incrível, como eu poderia viver sem isso?
harp

3
De fato, algo que costumo fazer é esquecer de executar o vi como root ao editar algo. Este comando me salvou de reescritas longas mais vezes do que me lembro. :w !sudo tee %
Mark D

1
Eu gostaria que houvesse alguma maneira de fazer isso em gnunano
ixtmixilix

1
e então como você volta ao editor depois de usar: shell?
VaTo 25/11/16

@VaTo: Para voltar, você pode digitar: exit
Raman Kathpalia /

12

Costumo ctrl+zdormir o vi, executar o que preciso no shell e depois fgretomar o vi. Não é exatamente uma resposta para sua pergunta, mas acho que é uma maneira muito rápida de trabalhar.

Se você esquecer que possui o vi aberto em segundo plano (isso pode acontecer quando você estiver ocupado), quando tentar sair do shell usando ctrl+do aviso de que você tem trabalhos em segundo plano em execução e poderá fechá-los, ou pressione 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 apara abortar e executar fg para voltar ao vi.


1
Isso pode ficar difícil se você se envolver com o que está fazendo na linha de comando e esquecer que possui o vim em segundo plano.
Eliot Ball

1
Sim, é possível, eu mesmo fiz. Para mim, vale a pena ter constância de concha. Vou atualizar a minha resposta a tomar o seu comentário em conta
Rqomey

1
Eu acho que você estaria melhor usando a tela gnu.
user606723

1
Eu uso tmux me ... mas para a velocidade, e se conectado para um servidor sem tmux ou na tela, é útil
Rqomey

11

Como você mencionou "get the stdout", observe que você pode fazer

:r! command

e a saída do comando será adicionada ao arquivo, ou

:<range>!command

filtrar o conteúdo do intervalo através do comando [por exemplo :1,$!wc]


:%!commandparece bem útil
Eliot Ball

Eu costumo usar isso para classificar linhas [por exemplo :.,+20 !sort]
Walter A

5

Meu idioma preferido é

!!command

que é uma abreviação 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.


2
Observe que !}você deve estar posicionado no início do parágrafo, tente !ap. (Não sei se isso é em todos os vi, ou apenas vim)
Random832

4

Usando dois pontos e ponto de exclamação, você pode executar qualquer comando no caminho e nos scripts do shell, lembre-se de que o comando é executado sob o usuário que executa o programa vi / vim e usa 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. Lembre-se de que alguns shells mantêm um cache dos programas no caminho e o vi pode não funcionar com esse cache (dependendo do shell que ele usa e da sua versão); portanto, você pode acabar executando o binário errado, caso tenha mais de um binário com o mesmo nome.


4

Você pode ver a saída de um comando digitando, por exemplo, :!ls -lhno modo de comando.

Se você deseja inserir a saída do comando no arquivo que está editando, basta adicionar um r. Por exemplo :r!which perl,.


1

Usar !é obviamente a resposta correta, mas se você estiver alternando com frequência, algo como screen ou tmux também poderá ser útil.


0

Eu tenho isso no meu .vimrc. Encontrado no Stack Overflow há um tempo:

" Executes the current line in a bash shell; syntactically similar to slimv's ,d feature
:nmap ,,d Y:!<C-R>"<C-H><CR>

0

Eu resolveria isso com facilidade no Linux, abrindo duas janelas de linha de comando do terminal, executando o vi em um e outro disponível para outro trabalho ao mesmo tempo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.