Eu quero executar o seguinte shell.
wea-this is the end of the second word | vim j
exit 0
Que eu esperava que canalizasse os pressionamentos de tecla w
(avançar uma palavra) e depois e
(final da palavra), depois a
(anexar) e depois -this is the end of the second word
(texto) no documento do Vim nomeado j
que já possui palavras.
O seguinte erro ocorreu quando eu executei o script de shell.
/root/bin/tt.sh: line 1: wea-this: command not found
Vim: Warning: Input is not from a terminal
Estou executando o Ubuntu 14.04. Dois tipos de respostas serão apreciados:
- Como usar a tubulação para alcançar o resultado desejado.
- Outro método pelo qual eu posso usar os "comandos Vim" (não os comandos ed ou sed) para editar um documento de texto a partir de um script de shell.
invocation
Jason Basanese
fonte
fonte
|
caractere canaliza a saída de um comando para outro.wea-this
não é um comando. A tubulação também não pode ser usada para alcançar o que você deseja; fará com que o stdin do Vim seja o aplicativo à esquerda, não o teclado. Se você quiser se stdin em um buffer no vim, iniciá-lo com um sinal de menos para o filename:echo Hello, world! | vim -
.Respostas:
Para inserir a string
"hello"
na primeira linha do arquivoj
, você pode digitar em seu shell o seguinte comando:vim +"1 | put! ='hello'" j
:1
move o cursor para a primeira linha do buffer:put! ='hello'
cola a string "olá" acima da linha atualPara inserir a sequência
"hello"
e, em seguida, salve e saia do arquivo:vim +"1 | put! ='hello' | x" j
Assim como antes, acabamos de adicionar o comando Ex
:x
que salva e sai.Em geral, você pode executar qualquer sequência de comandos Ex em um arquivo, em um shell interativo ou em um script bash, como este:
vim +'Ex command1 | Ex command2 | ...' file
Se você tiver muitos comandos Ex, poderá escrevê-los todos em um arquivo dedicado (chamado, por exemplo
myExCommands.vim
), um comando por linha e, a partir do shell ou de um script, poderá obtê-lo (com o comando Ex:source
ou a versão curta:so
) como isso:Editar
Vejo que você editou sua pergunta.
Acho que a resposta anterior ainda se aplica, porque você pode executar qualquer comando normal no modo Ex com os comandos Ex
:normal
e:execute
.Por exemplo, digamos que você queira:
1G
)_
)w
)e
)a
)hello
:x
)Para fazer isso no arquivo
j
, digite no shell:Para mais informações, veja:
fonte
:normal
e:execute
faça o que você deseja?Aqui está uma maneira de usar comandos no modo normal, em vez de apenas comandos ex, para editar um fluxo apresentado ao Vim a partir do stdin. Este não é um exemplo muito útil, mas ilustra as técnicas envolvidas. Assume que seu shell é uma festança.
O
-
no final diz ao Vim para ler texto (não comandos) do stdin. O-s
comando diz ao Vim para executar pressionamentos de teclas do arquivo especificado. Nesse caso, o arquivo é a saída de uma substituição do processo bash. O<(...)
é substituído pelo nome de um pipe nomeado. A saída do pipe é a saída do comando entre parênteses. Owcwred\e
move o cursor por uma palavra e altera a próxima palavra parared
. O:wq! foo\n
resultado é salvo no arquivo,foo
mesmo que ele já exista. O resultado final é um arquivo chamadofoo
contendo o textoThe red fox jumped.
Para mais informações sobre alguns desses tópicos, consulte
Veja também a
Process Substitution
seção dabash(1)
página de manual.fonte
vimx () { vi -s <(echo "$1"':wq') "$2" &> /dev/null; }
. Agora eu possovimx 'iThe brow fox jumped.\e' foo; vimx 'wcwred\efjdwiclimbed\e' foo; cat foo
. Arrumado!Eu achei o método de pegar a saída de um programa redirecionado do sub-shell para ser muito fácil:
Exemplo:
fonte
Eu tinha exatamente o mesmo desejo que você: queria escrever comandos vim normais e fazer com que eles editassem um fluxo de pipeline. Fiquei desapontado com a dificuldade de usar o vim normal dessa maneira (tantas bandeiras!), Conforme fornecido pelas opções padrão do vim.
Portanto, escrevi um pequeno invólucro no vim para fazê-lo: https://github.com/MilesCranmer/vim-stream/ . É chamado
vims
.O coração do wrapper é o seguinte comando:
Usando isso, com a geração de comandos que eu faço, parece bastante conciso e, como o vim é um editor modal,
vims
criei um editor de fluxo modal. Existem três modos principais que são úteis para a mentalidade de edição de pipeline:Vê isto:
Então,
e
vai para o final deHello
ea
começa a acrescentar.Algo mais sofisticado, no modo exe, para comentar as linhas que contêm
my_bad_var
e excluir a linha anterior.O que se traduz em
vims '%g/my_bad_var/exe "norm I//\<esc>kdd"'
-I
sendo o comando para iniciar a inserção no início da linha e//
sendo a sequência de comentários.\<esc>kdd
pressiona a tecla Escape, move uma linha para cima e exclui a linha.Eu tenho 11 exemplos no total do repositório. Convido você a vê-los. Novamente, isso está sendo executado no topo do vim, é apenas uma maneira de tornar o vim mais parecido com o sed para entrada de fluxo (mas preservando todas as suas amadas macros do vim!)
fonte
Essa é uma pergunta bastante antiga, mas achei que valia a pena contribuir para o fato de que, se a sua distribuição / SO tiver acesso
moreutils
, você poderá instalá-la e simplesmente usá-lavipe
como complemento padrão paravim
:moreutils
também é super útil para outras ferramentas, e eu as recomendo se você for um usuário sério da linha de comando! :) Veja a introdução do autor (link anterior) para mais detalhes.moreutils
geralmente deve estar disponível para a maioria das distribuições do tipo * nix por meio de um gerenciador de pacotes e pelo Homebrew no Mac . Por exemplo...moreutils
também faz parte do repositório de pacotes MSYS2 , para que você também possa usá-lo tecnicamente no Windows. :)fonte