É possível executar um script VIM em um modo não interativo?

8

O rastreador de erros do Gnats possui um comando (edit-pr) que abre um ticket em $ EDITOR. Meu $ EDITOR é o VIM e, quando esse comando abre o ticket em $ EDITOR, eu gostaria de executar automaticamente algumas edições com script sem precisar pressionar as teclas adicionais.

Existe uma maneira de escrever um script VIM que possa ser executado de maneira não interativa assim?

Matt Pfefferle
fonte

Respostas:

3

Eu nunca usei mosquitos, por isso é difícil dizer exatamente o que edit-prse espera que seja feito. Mas, pelo que você nos forneceu, você pode tentar alterar a variável env do EDITOR para um script de shell personalizado, ou talvez até um script python ou algo assim.

EDITOR=/path/to/script.(sh|py) edit-pr <args>

Mas, como eu disse, não sei que tipo de edição ela deseja ou o que precisa ser feito no editor. Talvez se você nos desse um exemplo do que gostaria de automatizar?

Falmarri
fonte
O comando gnats foi apenas um exemplo. Eu estava procurando uma solução geral e acho que sua resposta é o caminho a seguir. Obrigado!
Matt Pfefferle
20

Mesmo que você já tenha recebido uma resposta para sua pergunta, outras pessoas podem achar isso útil.

Os comandos do Vim também podem ser especificados em um arquivo que é executado usando a -sopção:

    vim -s commands.txt file

Exemplo:

    echo 'gg=G' > indent.txt
    echo ':wq' >> indent.txt
    vim -s indent.txt file

Isso usará o Vim para recuar o conteúdo do arquivo, salvar e sair.

S. Christoffer Eliesen
fonte
14

Os comandos do Vim podem ser especificados na linha de comandos quando você executa o programa da seguinte maneira:

vim file.txt "+:s/foo/bar/g"

Você pode continuar adicionando comandos adicionando "+[cmd]"argumentos. Você pode terminar aí e o editor abrirá, executará esses comandos e espere ou você poderá adicionar um "+:wq"para salvar e fechar o arquivo.

Você também pode escrever um script usando a sintaxe vimscript e envolvê-lo em uma função para chamar quando o arquivo é aberto ou em um script separado para importar e aplicar ao buffer usando a sintaxe acima.

Caleb
fonte
5

Para executar o vim no modo não interativo, você pode usar o parâmetro +{command}/ -c {command}ou -sque permitirá executar os comandos do vim após a leitura do primeiro arquivo.

Veja alguns exemplos abaixo.

Entrada e saída padrão simples usando tubos podem ser alcançadas pelo comando:

$ echo Example | vim -es '+:wq! /dev/stdout' /dev/stdin | cat

Para editar um arquivo e salvar as alterações em outro:

$ vim -es '+:0,$s/127/128/g' '+:wq! new_file' /etc/hosts
$ cat file1 file2 | vim - -es '+:0,$s/foo/test/g' '+:wq! file3'

Para editar o arquivo no local, você pode usar -s {scriptin}para que o arquivo de script seja lido, por exemplo:

$ echo ':0,$s/foo/test/ge' > cmds.txt
$ echo ':wq' >> cmds.txt
$ vim -s cmds.txt -es file

Para analisar o arquivo e enviá-lo para a saída do pipeline, você pode tentar o seguinte:

$ cat /etc/hosts | vim -es '+:0,$s/127/128/g' '+%print' '+:q!' /dev/stdin | cat

ou:

$ cat /etc/hosts | vim -es '+:0,$s/127/128/g' '+:wq! /dev/stdout' /dev/stdin | cat

Veja mais: Como editar arquivos de maneira não interativa (por exemplo, no pipeline)? na Vim SE

kenorb
fonte
Muito conveniente! Alguma idéia de qual recurso apóia o pager do Vim, por exemplo, onde :hié rolável e mostra -- More -- SPACE/d/j: screen/page/line down, b/u/k: up, q: quit? Ele não aparece na lista de buffers e a gravação com :wgrava um arquivo vazio (e o pressionamento de tecla 'enter' faz com que o pager role ou saia.) Eu posso usar :redir! >file | :hi | :redir END , que captura tanto quanto eu rolar. Eu acho que pode funcionar mecanicamente como um bidirecional more. Eu tenho que saber por que :helpe :hinão são tanto paginada ou ambos RO-tamponada ...
John P