Afficher le nom de fichier actuel pour l'édition dans la ligne de commande

10

Comment puis-je afficher le chemin d'accès au fichier actuel dans la ligne de commande, afin de taper un nom de fichier similaire? Je ne veux pas d'une abréviation qui serait remplacée par le nom du fichier actuel, je veux modifier le nom du fichier, avec son chemin de répertoire. Par exemple, je veux :editun fichier avec un nom similaire, ou dans un répertoire similaire, par exemple

vim src/submodule/frontend/frobnicate2.c

et maintenant je veux éditer ../trunk/src/submodule/frontend/frobnicate.c, et je veux seulement insérer ../trunket supprimer le 2, pas retaper le chemin complet.

Je peux bien sûr revenir au shell et utiliser son historique de commandes, ou je pourrais copier-coller le chemin via l'interface graphique, mais je cherche un moyen plus efficace qui ne nécessite pas de quitter Vim.

Gilles 'SO- arrête d'être méchant'
la source

Réponses:

11

En plus d'insérer le %registre tel que vous l'avez découvert vous-même, vous pouvez également l'utiliser :edit %<Tab>.

De :help cmdline-special:

In Ex commands, at places where a file name can be used, the following
characters have a special meaning.  These can also be used in the expression
function `expand()`.

        %       Is replaced with the current file name.           :_% c_%

Vous pouvez donc, par exemple, utiliser:

:edit %.orig

pour éditer file.txt.orig. Pour votre exemple, vous devez taper :e ../trunk/%, appuyer sur <Tab>pour obtenir le nom du fichier avec le chemin d'accès relatif et supprimer le 2avant d'appuyer sur <Enter>.

Vous pouvez ajouter des modificateurs au chemin pour le modifier; Je l'ai trouvé :hparticulièrement utile, il obtient le "dirname" (ou "head" en Vim-speak ") du chemin actuel:

:edit file/in/a/deeply/nested/subdirectory/here.txt
:edit %:h/in_same_dir_as_above.txt

Vous pouvez même l'utiliser :hplusieurs fois. Par exemple:

:edit %:h:h:h/file.txt

S'ouvrira file/in/a/deeply/file.txt

Il y a aussi :pce qui vous donne le chemin complet et qui pourrait être utile dans votre cas: tapez :e %:p, appuyez sur <Tab>et modifiez le chemin comme vous le souhaitez. Vous pouvez même utiliser plusieurs modificateurs, par exemple: :e %:p:h.

Voir :help filename-modifierspour la liste complète.

Remarque: si vous <Tab>, Vim étendra le %. Si vous utilisez <C-d>, Vim ne développera pas le %(mais le remplacera %en complétant le chemin).

Martin Tournoij
la source
5

Oh. Recherchez «nom de fichier» dans :help :! Il est simple: insérer le spécial r egistrecanadiendesins , ce qui signifie le nom du fichier en cours.CTRL-R %%

Gilles 'SO- arrête d'être méchant'
la source
1
Donc, en s'appuyant sur votre réponse: pour obtenir le chemin complet tel que demandé par l'OP, vous feriez quelque chose comme Ctrl-r =expand('%:p'). Cela utilise le registre = .
lcd047
3

Si vous avez défini votre pathvariable vim , vous avez toute la puissance de la :findcommande, à savoir la complétion par tabulation des noms de fichiers (sans avoir besoin de spécifier la partie répertoire!)

Dans votre cas, quelque chose comme

set path=./**

peut être tout ce dont vous avez besoin pour :fin frob<tab>travailler. Pour les détails sordides, :help find, :help file-searching.

Jens
la source
0

Voici une cartographie que vous pouvez essayer:

cnoremap <a-q> <c-c>:let @a=expand('%')<CR>:<Up><c-r>a

Cela enregistre la commande en cours, puis définit le registre «a» sur le nom du fichier en cours. Ensuite, la dernière commande est rappelée et ajoutée avec le contenu du registre «a». Bien sûr, si vous avez quelque chose d'utile dans le registre «a», cela le remplacera.

Vous souhaiterez peut-être remplacer les caractères mappés par autre chose. J'aime utiliser la touche Alt mais cela ne fonctionne pas dans certains terminaux.

Comme l'a souligné Carpetsmoker dans sa réponse, vous pouvez remplacer l'appel de fonction par

expand('%:p')

pour forcer le chemin complet.

Franc
la source
1
Cela effacerait inutilement le registre a. Essayez plutôt quelque chose comme ceci:cnoremap <M-q> <C-r>=fnameescape(expand('%:p'))<CR>
lcd047