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!

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

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'

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 ).


+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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.