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

6

O rastreador de bugs do Gnats possui um comando (edit-pr) que abre um ticket em $ EDITOR. Meu $ EDITOR é VIM, e quando este comando abre o ticket em $ EDITOR, eu gostaria de executar automaticamente algumas edições de script sem ter que fazer nenhum pressionamento de tecla adicional.

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

    
por Matt Pfefferle 31.05.2011 / 19:18

4 respostas

3

Eu nunca usei gnats, então é difícil dizer exatamente o que o edit-pr está esperando. Mas a partir do que você nos deu, você poderia tentar mudar a variável EDITOR env para um script de shell personalizado, ou talvez até mesmo 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 deseja ou o que precisa ser feito no editor. Talvez se você nos deu um exemplo do que você gostaria de automatizar?

    
por 31.05.2011 / 22:16
18

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 opção -s :

    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.

    
por 13.10.2011 / 19:21
12

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

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

Você pode continuar adicionando comandos adicionando "+[cmd]" arguments. Você pode terminar lá e o editor abrirá, executará esses comandos e aguardará, 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 for aberto ou em um script separado para importar e aplicar ao buffer usando a sintaxe acima.

    
por 02.06.2011 / 09:47
5

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

Confira alguns exemplos abaixo.

Entradas e saídas padrão simples usando pipes podem ser obtidas 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 forma não interativa (por exemplo, em pipeline)? no Vim SE

    
por 19.02.2015 / 16:16

Tags