Question Comment ajouter une chaîne dans la tête d'un nouveau fichier créé automatiquement dans VIM?


Pour être précisé, ce que je veux faire est:

  • si je crée xxx.php,#!/usr/bin/env php sera la première ligne du fichier
  • si je crée xxx.py,#!/usr/bin/env python sera ajouté en premier.

Comment puis-je aborder cela? Merci!


4
2018-06-25 03:10


origine




Réponses:


Après quelques recherches, je trouve une publication dans SO cela peut résoudre mon problème en utilisant des templates.Hope il est utile pour vous les gars.

Créer des modèles pythontmp.txt et phptmp.txt dans un certain sens (exemple:~/.vim/templates/) comme ci-dessous

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

Ajouter le paramètre suivant à .vimrc

autocmd bufnewfile *.py :0r ~/.vim/templates/pythontmp.txt
autocmd bufnewfile *.php :0r ~/.vim/templates/phptmp.txt

9
2018-06-25 07:47



+1 réponses personnelles sont bonnes pour SU (c'est aussi la bonne façon de le faire). - msw


Pas sûr que vous puissiez configurer vim pour le faire sans assistance. Vous pouvez créer un script d'aide pour le faire pour vous.

En supposant un environnement Linux ... Ce script vérifie l’extension du fichier et, si nécessaire, crée le fichier avec l’en-tête avant d’appeler 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

Vous pouvez alors alias ce script pour exécuter à la place de vim.

alias vim='/path/to/script.sh'

1
2018-06-25 07:02



Vous pouvez également étudier les plugins / scripts vim - Tim Kane
Ouais je suis sur ça maintenant. ${interpreter+defined} Je dois supprimer +defined et le faire fonctionner. - SpawnST
C'est un mécanisme (utilisant l'extension des paramètres) pour tester si la variable $ interpreter a été définie. Vous pourriez aussi bien écrire $ {interpreter + blah} pour avoir le même effet. $ {var + mot} # si var est défini, utilisez "word"; sinon, rien - Tim Kane
oh je t'ai eu, merci :) - SpawnST


Il existe beaucoup de plugins qui offrent cette fonctionnalité. Certains vous permettent même de déduire automatiquement différentes choses, ou même de paramétrer votre en-tête en fonction du dossier dans lequel vous créez votre nouveau fichier (mu-template).


1
2018-06-25 09:25



+1 oui, beaucoup de plugins facilitant la gestion de "autocmd". tout fonctionne sous les termes de "templates" et "skeletons". - akira


En fait, j'aime l'approche consistant à définir une fonction vim pour faire le travail, de cette façon, il devient beaucoup plus facile de faire des choses plus compliquées. Par exemple, si le texte inséré dépend du nom du fichier, comme cela se fait généralement avec C / C ++. Mon C / C ++ One ressemble à ceci:

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

La fonction get_get_name () forme le nom de la porte à partir du nom du fichier en cours de modification et varie en fait en fonction du projet sur lequel je travaille, car certains projets veulent qu’elle soit formatée d’une certaine manière.


1
2018-06-25 14:05



Je sens que votre solution est plus puissante mais pas tout à fait comprendre la fonction. - SpawnST
En fait, jouer avec :exe+:normal (/:put) est assez lourd à maintenir en comparaison avec des solutions telles que mu-template (voir code.google.com/p/lh-vim/source/browse/mu-template/trunk/after/...). L'extraction de la fonction de génération d'en-tête est assez simple tant que le plug-in Template Expander prend en charge les appels à des fonctions viml "externes". - Luc Hermitte
Ouais le point n'est pas l'exécution et les combinaisons normales (j'ai écrit ces dernières années, et ne les ai pas changées depuis) ​​... mais juste le fait qu'en y mettant un appel de fonction, vous avez accès à toute la puissance de script de vim plutôt que d'insérer un modèle. Les plugins offrent une certaine facilité d'utilisation, mais si vous voulez avoir votre propre solution sans plugin, l'approche par fonction est un bon point de départ pour toutes les solutions. - Neg_EV
Ce qui se passe dans mon func est que j'ai un funcommable nom_fonction qui, en fonction du chemin du fichier, détermine son nom (je garde mes projets organisés sous un dossier de projets qui me permet de le faire). Ensuite, une fois que j'ai le nom, j'insère les portes (de manière très primitive) en utilisant les commandes execute normal. Une autre raison pour laquelle je fais ceci est que j'ai écrit un code de mise à jour qui, avec un fichier avec des portes existantes, je peux les mettre à jour selon mes souhaits (par exemple, si je renomme un fichier). Cela me permet de réutiliser les fonctions où une solution de modèle / plug-in peut ne pas être aussi facile à faire. - Neg_EV