Comment insérer le nom de fichier actuel dans le contenu de Vim?

39

Après quelques recherches, j'ai appris à connaître :echo @%le nom du fichier actuel dans la dernière ligne de vim-screen.

Je voudrais vider le nom de fichier (avec et sans chemin complet) dans le contenu du fichier sans quitter vim.

Est-ce qu'il y a un moyen de faire ça?

mtk
la source

Réponses:

28

Je suis sûr qu'il existe d'autres moyens de le faire ... mais la commande principale que vous voulez est celle :r[ead]qui insère le résultat d'une commande dans le tampon.

Donc, pour insérer uniquement le nom du fichier:

:r! echo %

Et pour inclure le chemin complet:

:r! echo %:p

Pour plus d'informations:

:help read
:help filename-modifiers 
JC Yamokoski
la source
37

Le nom de fichier actuel est dans le "%registre, vous pouvez donc l'insérer (en mode insertion) avec <c-r>%; le chemin complet peut être inséré avec <c-r>=expand("%:p"). Vous pouvez en faire une macro si vous l'utilisez souvent. Pour plus d’astuces similaires, voir :h expandet :h "=.

Kevin
la source
Peut-être que je me trompe, mais <c-r>la commande redo n'est-elle pas mappée?
JC Yamokoski
10
En mode insertion, <c-r>spécifie que le caractère suivant est un registre.
Kevin
Righto, merci. Totalement oublié de passer en mode insertion ...
JC Yamokoski
Vous pouvez également le faire "%pen mode normal ou visuel.
naught101
15

Comme on peut le voir :h registers, le "%registre contient le nom du fichier actuel. La :pu[t]commande insère le contenu d'un registre dans le texte.

Donc, pour insérer le nom de fichier actuel, vous pouvez taper l'un de ces éléments en mode commande:

:put %

ou

"%p

Pour insérer le nom de fichier avec le chemin complet, tapez

:put=expand('%:p')

en mode commande.


Plus d'informations:

:h pu[t]

En tapant, "rpvous pouvez coller le contenu du registre "r.

Braunmagrin
la source
3
Le :put "%:p"ne semble pas fonctionner pour moi. Cela semble fonctionner uniquement avec expand () , comme dans:: :put =expand('%:p'), ce qui ne le rend pas moins encombrant que <c-r>=expand('%:p')malheureusement.
akavel
@akavel Vous avez raison, je vais mettre à jour la réponse. Merci! ;) Et, en effet, les deux sont également verbeux.
Braunmagrin
5

Un moyen simple consiste à exécuter:

!!echo %
  • !! remplace la ligne en cours par le résultat de la commande qui la suit.

  • % est remplacé par le nom du fichier modifié dans la commande, de sorte que ce nom sera effectivement inséré dans le fichier modifié.

Le nom de fichier est celui que vous avez transmis à la commande vi (m) et peut contenir un chemin relatif ou absolu. Si vous souhaitez le supprimer et ne conserver que le nom du fichier, exécutez

!!basename %
jlliagre
la source
1

Si vous devez le faire fréquemment, il peut être utile de lier une séquence de clés à votre choix, comme indiqué à l' adresse http://vim.wikia.com/wiki/Insert_current_filename.

insère le nom de fichier actuel sans l'extension à la position du curseur, lorsque vous êtes en mode insertion.

:inoremap \fn <C-R>=expand("%:t:r")<CR>

Pour conserver l'extension utiliser:

:inoremap \fn <C-R>=expand("%:t")<CR>

Pour insérer le chemin absolu du répertoire dans lequel le fichier est utilisé:

:inoremap \fn <C-R>=expand("%:p:h")<CR>

Pour insérer le chemin relatif du répertoire dans lequel le fichier est utilisé:

:inoremap \fn <C-R>=expand("%:h")<CR>

Les précédents fonctionnent tous directement vimpour la session, ou vous pouvez les mettre dans le .vimrc(où le signe deux-points sur la ligne est facultatif).

Randall
la source
0

Je cherchais dans Google un moyen simple d'insérer le nom du fichier actuel (sans chemin ni extension) dans la position actuelle (pas de nouvelle ligne, pas de remplacement de la ligne actuelle). Donc, en combinant les réponses précédentes et ce lien , voici ce que je cherchais.

En mode insertion :

<C-R>=expand("%:t:r")

Puis la prochaine fois (avec la commande déjà dans l'historique):

<C-R>=<UP>
kub1x
la source