Como adicionar uma string na cabeça de um novo arquivo criado automaticamente no VIM?

4

Para ser especificado, o que eu quero fazer é:

  • se eu criar xxx.php, #!/usr/bin/env php será a primeira linha do arquivo
  • se eu criar xxx.py, #!/usr/bin/env python será adicionado primeiro.

Como posso abordar isso? Obrigado!

SpawnST
fonte

Respostas:

9

Depois de algum trabalho de pesquisa, eu acho uma postagem em SO que pode resolver o meu problema usando modelos.Espero que seja útil para vocês.

Criar modelos pythontmp.txt e phptmp.txt em algum diretório (exemplo: ~/.vim/templates/ ) como abaixo

#!/usr/bin/env python(php)

Adicione a seguinte configuração para .vimrc

autocmd bufnewfile *.py :0r ~/.vim/templates/pythontmp.txt
autocmd bufnewfile *.php :0r ~/.vim/templates/phptmp.txt
SpawnST
fonte
1
1 auto respostas são boas para SU (este também é o caminho certo para fazê-lo).
msw
1

Não tenho certeza se você pode configurar o vim para fazer isso sem ajuda. Você pode criar um script auxiliar para fazer isso por você.

Assumindo um ambiente linux ... Esse script verificará a extensão do arquivo e, se necessário, criará o arquivo com o cabeçalho antes de chamar o vim.

#/bin/bash

type=`expr "\$1" : ".*\.\(.*\)"`   # Check the file extension

case "$type" in
    py) 
    interpreter=python;
    ;;
    php)
    interpreter=php;
    ;;
esac

if test ${interpreter+defined}; then echo "#!/usr/bin/env $interpreter" > $1 && /usr/bin/vim $1;
else /usr/bin/vim $1;
fi

Você poderia alias este script para ser executado no lugar do vim.

alias vim='/path/to/script.sh'
Tim Kane
fonte
1
Você também pode investigar plugins / scripts do vim
Tim Kane
Sim, eu estou nisso agora. ${interpreter+defined} quer dizer? Eu tenho que apagar +defined e fazer funcionar.
SpawnST
É um mecanismo (usando a expansão de parâmetros) para testar se a variável $ interpreter foi definida. Você poderia facilmente escrever $ {interpreter + blah} para ter o mesmo efeito. $ {var + word} # se var estiver definido, use "word"; caso contrário, nada
Tim Kane
1

Existe muitos plugins que oferecem esse recurso. Alguns até permitem deduzir automaticamente várias coisas, ou até mesmo parametrizar o seu cabeçalho, dependendo da pasta onde você está criando o novo arquivo ( modelo mu ).

Luc Hermitte
fonte
+1 sim, muitos plugins que facilitam o uso do "autocmd". tudo funciona sob os termos de "modelos" e "esqueletos".
akira
1

Eu realmente gosto da abordagem de definir uma função vim para fazer o trabalho, assim fica muito mais fácil fazer coisas mais complicadas. Por exemplo, se o texto inserido depender do nome do arquivo, como é comumente feito com C / C ++. Meu C / C ++ se parece com isso:

autocmd BufNewFile *.{h,hpp} call <SID>insert_c_gates() 

...

function! s:insert_c_gates()
   let gatename = <SID>get_gate_name()
   execute "normal i#ifndef " . gatename
   execute "normal o#define " . gatename
   execute "normal Go#endif /* " . gatename . " */"
   normal kk
endfunction

A função get_get_name () forma o nome do gate a partir do nome do arquivo que está sendo editado e, na verdade, varia dependendo do projeto em que estou trabalhando, porque alguns projetos querem que ele seja formatado de uma certa maneira.

Neg_EV
fonte
Sinto que sua solução é mais poderosa, embora não compreenda bem a função.
SpawnST
Na verdade, brincando com :exe + :normal (/ :put ) é bastante complicado manter comparando com soluções como mu-template (veja code.google.com/p/lh-vim/source/browse/mu-template/trunk/after/… ). Extrair a função de geração de cabeçalho é muito fácil, desde que o suporte ao Plugin do Expansor de Modelo chame as funções viml "externas".
Luc Hermitte
Sim, o ponto não são as combinações de execução e normal (eu escrevi há muitos anos e não as mudei desde então) ... mas apenas o fato de que colocando uma chamada de função lá você tem acesso a todo o poder de script do vim em vez disso, basta inserir um modelo. Os plugins definitivamente oferecem uma boa facilidade de uso, mas se você quiser ter sua própria solução sem um plugin, a abordagem de função é um bom ponto de partida para todas as soluções.
Neg_EV
O que está acontecendo no meu func é que eu tenho um func get_gate_name que dependendo do caminho do arquivo eu determino o seu nome (eu mantenho meus projetos organizados em uma pasta de projetos de uma forma que me permite fazer isso). Então, quando eu tiver o nome, insiro os portões (de uma maneira muito primitiva) usando os comandos normais de execução. Outra razão que faço isso é que eu escrevi uma função UpdateGates que, dado um arquivo com portas existentes, eu posso atualizá-las para o que eu gostaria (por exemplo, se eu renomear um arquivo). Isso me permite reutilizar as funções em que uma solução de modelo / plug-in pode não ser tão fácil de fazer o mesmo.
Neg_EV