2009-04-12 9 views
26

J'essaie de trouver le nom du fichier que je suis en train d'éditer dans Vim. Donc, je peux l'utiliser pour mapper F5 pour compiler ce fichier. Serait bien sûr génial si je pouvais reconnaître le format de fichier, et choisir le compilateur en conséquence, mais vraiment pas nécessaire. Si je trouve le nom du fichier, je pourrais le faire moi-même. Mais je ne trouve vraiment aucun moyen d'obtenir le nom du fichier que je suis en train d'éditer.Obtenir le nom du fichier actuel dans Vim

Je connais la commande :make, et j'ai déjà mappé cela, mais pour les petits scripts/programmes de test, je ne veux vraiment pas d'abord devoir écrire un simple fichier makefile.

+1

similaires à http://stackoverflow.com/q/916875/80161 et http://stackoverflow.com/q/2233905/80161 –

+4

Et plus que ceux qu'il est semblable à. – martiert

+0

Aucun doute. J'aurais ajouté à la liste "liée" mais je n'ai pas encore la permission. –

Répondre

22

J'essaie de trouver le nom du fichier que je suis en train de modifier dans vim.

Pour le tampon courant, cela vous donnera le nom du fichier,

echo "You're editing " bufname("%") 

(il suffit de mettre dans certains file.vim, et la source, il « : si% ». Mais je ne pense que c'est ce que vous avez besoin.

donc je peux l'utiliser pour la carte F5 pour compiler ce fichier, à des fins de test. est-ce bien sûr génial si je pouvais reconnaître le format de fichier et choisissez compilateur en conséquence, mais vraiment pas nécessaire.Si je trouve la na moi du dossier, je pourrais le faire moi-même. Mais je ne trouve vraiment aucun moyen d'obtenir le nom du fichier que je suis en train d'éditer.

Vous pourriez faire plusieurs choses. Si vim reconnaît le type de fichier que vous éditez, vous pouvez mapper F5 avec votre commande de compilation et placer cette commande dans son répertoire ftplugin spécifique, elle ne sera donc valide que pour ce type de fichier.Par exemple, vous mettez

nmap <f5> :!compilername %<cr> 

dans cpp.vim, fortran.vim, python.vim, etc. Le % donne le nom du fichier en cours d'édition vous. Cela va exécuter le compilateur comme si vous appeliez dans l'invite de commande.

Bien sûr, compilername sera différent pour chaque type de fichier; vous n'allez pas compiler fortran avec le compilateur cpp, vous mettez fortrancompiler % dans ce cas.

C'est une option. Vous pouvez également essayer selon les commandes d'extension set autocmd dans votre .vimrc afin qu'il reconnaisse le type de fichier en fonction de l'extension du fichier. C'est tout usage standard de vim, rien de rare. Maintenant, je ne suis pas sûr de la façon dont vous aimeriez aller à ce sujet, donc je vais vous diriger vers Vim Wiki où vous pouvez trouver toutes sortes d'articles qui couvrent cela (et aussi quelques conseils pour certains compilateurs).

Je sais de la commande :make, et ont déjà tracé, mais pour les petits scripts/programmes de test, je ne veux vraiment pas d'abord à écrire un Makefile simple.

Oui, cela semble être trop. Personnellement (quand je suis sur Windows), je trouve le fichier batch simple beaucoup plus facile à écrire pour la plupart des choses sauf les grands projets. Si le programme est dans un ou deux fichiers, je le compile simplement en utilisant un mapping oneliner.

25

Vous pouvez utiliser le caractère% dans les commandes vim pour obtenir le nom de fichier actuel avec l'extension. Par exemple,

:!javac %

pour exécuter javac sur le fichier en cours.

Vous pouvez en savoir plus avec

:help filename-modifiers

2

Eh bien, il est % comme code de substitution à l'intérieur des choses comme: w. Donc : w blah% écrit une copie de votre fichier avec 'blah' ajouté. Ou !! echo% remplace la ligne courante par celle-ci. Dunno si cela répond à vos besoins ou non.

3

Comme d'autres l'ont déjà mentionné, % est développé dans le fichier en cours. Si vous voulez obtenir cette chaîne dans le script vim, utilisez expand("%"). Mais vous voudrez peut-être simplement définir makeprg à quelque chose comme "compiler-command\ %" et exécuter :make - vous obtenez un support de réparation rapide de cette façon. (ouvrir la fenêtre des erreurs/avertissements avec :copen)

5

Les autres points sont très utiles. J'ajouterais que vous voulez probablement utiliser: p, pour vous assurer que le nom de fichier est passé en tant que chemin complet. Sans cela, Vim peut le passer comme un chemin relatif au chemin actuel de Vim, qui peut être ou non le même que celui utilisé par le compilateur. Donc, une solution est:

nnoremap <silent> <f5> :!javac %:p<cr> 

Si vous voulez détecter le type de fichier que vous pouvez utiliser automatiquement AutoCommand

autocmd FileType java  nnoremap <buffer> <silent> <f5> :!javac %:p<cr> 
autocmd FileType cpp  nnoremap <buffer> <silent> <f5> :!gcc %:p<cr> 
+0

+1 pour le type de fichier autocmd. Mais vous devriez utiliser g ++ au lieu de gcc pour le fichier cpp, sinon vous aurez une erreur. – duleshi

2

Utilisez % comme un substitut à votre nom de fichier. Mais personnellement, je pense vraiment que vous pouvez pousser :make pour faire exactement ce que vous voulez. J'avais l'habitude de faire exactement ce que vous voulez éviter: juste bidouiller un Makefile de deux lignes pour chaque dossier dans lequel j'étais. J'ai aimé le support de Quickfix de :make tellement que fouetter un Makefile de deux lignes semblait comme un petit frais généraux dans la grande image.

... J'ai depuis appris mieux. Vous pouvez utiliser une commande autocmd ou ftplugin pour définir l'option makeprg, en configurant :make pour utiliser la commande de votre choix en fonction du type de fichier actuel. En soi, cela vous évite un peu de travail.

Le problème commence lorsque nous travaillons sur un outil dont les messages d'erreur ne ressemblent pas à ceux de GCC. Pour contourner ce problème, vim fournit également l'option errorformat. errorformat est très sophistiqué. Si vous voulez vraiment en savoir plus, commencez par :h error-format. À long terme, la sophistication est vraiment géniale. Cela signifie que, une fois que vous apprenez comment l'utiliser, vous pouvez analyser virtuellement toute sortie de compilateur et le formater pour l'affichage avec le correctif (:cope ou :cl).À court terme, cela peut être un peu une mauvaise chose, car cela signifie que les premières fois que vous pirater un format d'erreur vous-même, vous passerez pas mal de temps à réfléchir vimdocs et le rechargement et la construction de fichiers qui déclencheront les différents messages d'erreur que votre compilateur peut produire. Ce n'est certainement pas ce que vous voulez si vous ne travaillez que brièvement en dehors de votre zone de confort, ou si votre patron est au-dessus de votre épaule et vous demande de corriger ce bug. maintenant. Heureusement (et probablement), quelqu'un a déjà vécu cette souffrance pour vous et a configuré errorformat de manière appropriée pour votre ftplugin par défaut, ou l'a libéré dans le cadre d'un script vim qu'il attendait simplement que la communauté l'installe et adore.

Comme une démonstration rapide, voici quelques lignes que je piraté ensemble pour mon dossier .vim/ftplugin/haskell.vim:

setl makeprg=ghc\ --make\ % 
setl errorformat=%E%f:%l:%c:,%C\ %.%m,%Z,%f:%l:%c:%m 

J'utilise setl ici pour que ces options ne sont configurées pour les fichiers source haskell; Si je modifie simultanément un autre type de fichier source, il peut utiliser une autre configuration.

Si vous finissez par utiliser :make, je vous recommande également de configurer votre paramètre switchbuf. J'ai trouvé ça un peu pénible d'avoir à appuyer sur ctrl-O après un build si quickfix est excité et vous saute dans le mauvais fichier. J'utilise:

set switchbuf=useopen,usetab,newtab 
Questions connexes