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


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!


4


origem




Respostas:


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.

Modelos de criação pythontmp.txt e phptmp.txt em algum diretory (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

9



+1 respostas automáticas são boas para SU (esse também é o jeito certo de fazê-lo). - msw


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 faça 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
oh eu tenho você, obrigado :) - SpawnST


Existem 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



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


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.


1



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 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 Plugin do Model Expander suporte chamadas para 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 fornecem 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 permita 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