58 votes

Obtenir le nom de fichier sans extension dans une fonction Vim

Je veux obtenir le nom du fichier sans l'extension dans Vim.

J'ai écrit la fonction suivante dans mon .vimrc pour compiler et exécuter le programme Java :

:function! JAVA_RUN()
:!javac %^M
:endfunction

map <F3> :execute JAVA_RUN()<CR> :source $HOME/.vimrc<CR>

Comment puis-je obtenir le nom du fichier sans l'extension dans la fonction ?

1 votes

Vous n'avez pas besoin de créer une fonction pour faire cela. (map <F#> :!java %:r <Enter>)

107voto

tonio Points 5773

:help expand() devrait vous donner la réponse, voir [expand()](http://vimdoc.sourceforge.net/htmldoc/eval.html#expand()) .

Vous devez utiliser le r modificateur pour %, avec %:r au lieu de % pour obtenir le nom du fichier sans extension.

Si vous voulez écrire des fonctions pour construire et exécuter des fichiers, vous devriez également jeter un coup d'œil à la documentation de l'application [shellescape](http://vimdoc.sourceforge.net/htmldoc/eval.html#shellescape()) afin d'éviter les problèmes liés aux espaces dans le nom ou le chemin du fichier.

1 votes

Merci beaucoup pour ça ! Je l'ai utilisé comme un moyen facile de convertir les formats de fichiers actuels sans sortir de vim.

1 votes

Y a-t-il une différence entre %:r y %< ?

1 votes

Oui, il y en a un, mais il est subtil. %< est toujours supporté pour des raisons de rétrocompatibilité avec la version 3.0, et est équivalent à %:r . Le site :r est préférable. Elle peut être combinée avec les autres modificateurs, et peut également être utilisée plusieurs fois, par exemple si vous avez plusieurs extensions, telles que .tar.gz .

10voto

hcris Points 9359

Si vous voulez développer un nom de fichier (autre que % etc.), jetez un coup d'œil à fnamemodify()

fnamemodify({fname}, {mods})                *fnamemodify()*
        Modify file name {fname} according to {mods}.  {mods} is a
        string of characters like it is used for file names on the
        command line.  See |filename-modifiers|.

fnamemodify("main.java", ":r") renvoie à main .

4voto

Andre Points 21

Je viens littéralement de lire une question similaire à celle-ci (dans le sens où quelqu'un d'autre semblait essayer de configurer vim pour qu'il se construise automatiquement pour lui avec la touche F), et j'ai écrit une réponse sur la façon dont vous pouvez tirer parti de la puissance de vim. :make sans même avoir besoin d'écrire un Makefile. Dans votre cas, c'est moins directement lié à la question, mais j'ai pensé le mentionner au cas où vous seriez intéressé.

De plus, quelqu'un semble avoir écrit quelque chose sur Wiki d'astuces Vim sur la façon de mettre en place l'interface de vim :make pour travailler spécifiquement avec les projets Java construits avec ant. Je n'ai pas travaillé avec Java depuis un certain temps moi-même, mais dans votre cas spécifique, cela pourrait être un bon endroit pour commencer.

3voto

Peter Perháč Points 8007

Je suis venu ici pour chercher une réponse à une question similaire. Je voulais être capable d'extraire le nom de la classe actuelle du fichier java en cours d'édition. J'ai trouvé un moyen très astucieux de le faire dans vim avec une abréviation :

ab xclass <C-R>=expand('%:t:r')<CR>

Placez cette ligne dans votre .vimrc (ou similaire) pour que cela fonctionne. Une abréviation se déclenchera automatiquement dès que vous appuierez sur la touche espace, et c'est pourquoi je les préfixe habituellement avec 'x' pour éviter leur expansion accidentelle.

L'astuce ici est la combinaison de :t y :r dans l'argument de expand() . % est le "nom du fichier actuel", :t sélectionne uniquement le t tout le chemin ("dernier composant du chemin seulement") et :r sélectionne uniquement le r oot ("one extension removed"). (les parties citées sont tirées du document officiel expand() documentation.)

Ainsi, lorsque vous créez une nouvelle classe dans le fichier /a/b/ClassIAmAboutToCreate.java que vous taperez :

public class xclass {

au moment où vous appuyez sur l'espace après "xclass", l'abréviation sera étendue à public class ClassIAmAboutToCreate ce qui est exactement ce dont vous avez besoin.

Notez également qu'une abréviation peut être déclenchée en appuyant sur Ctrl + ] ce qui évite d'insérer un espace après le nom de la classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X