Executar script bash do vim

21

Eu uso o vim para scripts bash. às vezes, não quero criar um novo arquivo, torná-lo executável, executá-lo e removê-lo. Quero dizer os scripts que serão usados ​​apenas uma vez.

Por exemplo, eu abro o vim e digito isto:

#!/bin/bash

ll | while read line
do
    echo $line
done

Não salvei este arquivo, apenas uso o vim para simplificar o bash-scripting. Eu sei que posso executar um comando bash via !no vim. Mas e quanto a executar tudo o que está no buffer?

St.Antario
fonte
4
Você sabe que pode editar a linha de comando atual no Vim <C-x><C-e>e executá-la na gravação, certo?
Romainl 7/11
Se você executar o bash com esta opção set -o vi, poderá pressionar Esc-vpara editar a linha de comando no vi. Então Esc-:wqpara executar.
Roblogic 22/08/19

Respostas:

35

Eu escrevi uma resposta bastante extensa sobre isso no estouro de pilha . A idéia básica é que, como o comando write trata de gravar e não salvar , é possível gravar o texto no buffer em um programa externo, como python ou bash. No seu caso, você gostaria de fazer algo como:

:w !bash

ou

:w !sh

Esses comandos literalmente apenas escrevem o texto no seu buffer diretamente no programa especificado !, o que é conveniente, pois você não precisa salvar um arquivo. Obviamente, você também pode fazer algo como:

:w | !bash %

que salva seu arquivo e o executa como um script bash. Você pode escolher o que fizer mais sentido para você.

DJMcMayhem
fonte
Existe uma maneira de fornecer opções um argumento dessa maneira? Eu tentei :w !bash -a test, mas tem "não pode executar o arquivo binário"
St.Antario
@ St.Antario Hmm. Tenho certeza de que deve haver alguma maneira, mas minha festa está bem enferrujada (eu principalmente uso janelas). Quando tento isso no cygwin com um testarquivo vazio , ele funciona bem para mim. O que o comando deve fazer e o que deve testconter?
DJMcMayhem
Meu caso atual é bastante complicado, então deixe apenas imprimir o argumento passado. BTW, o que você quer dizer com o que deve test conter? testé apenas um argumento para -a.
Paulo Ontem '17
11
@ St.Antario Oh, entendi. Eu pensei que testdeveria ser um arquivo. Não tenho muita certeza do que fazer. Se você está tentando algo complexo, pode ser melhor salvá-lo em um arquivo. Pode valer a pena fazer uma pergunta separada, para que você possa fornecer mais detalhes. Provavelmente, também seria uma boa pergunta para Unix e Linux.
DJMcMayhem
4

Cenário: você está trabalhando no shell bash. Primeiro, verifique se o modo de edição local é vi:

$ set -o vi

Agora, quando você estiver trabalhando em um comando longo como o seguinte, pressione Esc+ v.

$ fjhwfq this is my long command

Isso carregará seu comando em uma visessão temporária . Agora você pode editá-lo como quiser e até adicionar outro comando ...

fjhwfq some long command
ls -l

Quando você terminar de editar, digite Esc :wqe os comandos serão executados, por exemplo:

$ fjhwfq some long command
fjhwfq some long command
bash: fjhwfq: command not found
ls -l
total 44
-rw-r--r-- 1 ropata Domain Users 24073 Nov 10 14:17 _viminfo
drwxr-xr-x 1 ropata Domain Users     0 Jul 15 13:57 bin/
-rw-r--r-- 1 ropata Domain Users   956 Nov  7 10:43 custom_env
roblogic
fonte
3
pode não funcionar se você tem um novo macbook sem uma Escchave;)
roblogic
11
Novos MacBooks não têm Escchaves !? Como eles podem usar o Vim então?
Hubro 19/05
11
Agora eu fiz, o novo MacBook barra de toque coisinha faz mostrar uma Escchave ao executar Vim em um terminal.
Roblogic