Nom du fichier Yank / chemin du tampon courant dans Vim

suppose que le tampon courant est un fichier ouvert pour éditer, donc :e n'affiche pas E32: No file name .

je voudrais tirer un ou tous les:

  • le nom du fichier exactement tel qu'indiqué sur la ligne d'état, p.ex. ~myfile.txt
  • un chemin complet vers le fichier, p.ex. c:foobarmyfile.txt
  • juste le nom du fichier, par exemple myfile.txt
153
demandé sur dukedave 2009-05-27 20:56:30

7 réponses

TL; DR

:let @" = expand("%") >

cela va copier le nom du fichier à la unamed registre , alors vous pouvez utiliser le bon vieux p pour le coller. et bien sûr, vous pouvez mapper ce à une touche pour accélérer l'utilisation.

:nmap cp :let @" = expand("%")<cr>

vous pouvez également l'utiliser pour le chemin complet

:let @" = expand("%:p")

explication

vim utilise le unnamed register pour stocker le texte qui a été supprimé ou copié (yanked), de même quand vous le collez lit le texte de ce registre.

en utilisant let nous pouvons stocker manuellement du texte dans le registre en utilisant :let @" = "text" mais nous pouvons aussi stocker le résultat d'une expression.

Dans l'exemple ci-dessus, nous utilisons la fonction expand qui développe les caractères génériques et les mots clés. dans notre exemple, nous utilisons expand('%') pour étendre le nom de fichier courant. Nous pouvons le modifier comme expand('%:p') pour le nom complet du fichier.

voir :help let :help expand :help registers pour plus de détails

172
répondu JD Frias 2018-08-21 16:28:03

presque ce que vous demandez, et cela pourrait faire: Ctrl+R % tire le nom du fichier courant dans l'endroit où vous êtes (invite de commande, Éditer le buffer, ...). Voir cette pointe Vim pour plus.

79
répondu dwc 2009-05-27 17:05:55

si vous voulez mettre le nom du fichier buffer actuel dans votre presse-papiers au niveau du système, essayez de changer le registre en@+:

" relative path
:let @+ = expand("%")

" full path
:let @+ = expand("%:p")

" just filename
:let @+ = expand("%:t")

Modifier 20140421: Je les utilise souvent, donc j'ai créé des raccourcis. Linux Vims apparemment fonctionner un peu différemment que Mac Vims , Il ya donc un cas spécial pour cela aussi bien. Si vous mettez ce qui suit dans votre ~/.vimrc :

" copy current file name (relative/absolute) to system clipboard
if has("mac") || has("gui_macvim") || has("gui_mac")
  " relative path  (src/foo.txt)
  nnoremap <leader>cf :let @*=expand("%")<CR>

  " absolute path  (/something/src/foo.txt)
  nnoremap <leader>cF :let @*=expand("%:p")<CR>

  " filename       (foo.txt)
  nnoremap <leader>ct :let @*=expand("%:t")<CR>

  " directory name (/something/src)
  nnoremap <leader>ch :let @*=expand("%:p:h")<CR>
endif

" copy current file name (relative/absolute) to system clipboard (Linux version)
if has("gui_gtk") || has("gui_gtk2") || has("gui_gnome") || has("unix")
  " relative path (src/foo.txt)
  nnoremap <leader>cf :let @+=expand("%")<CR>

  " absolute path (/something/src/foo.txt)
  nnoremap <leader>cF :let @+=expand("%:p")<CR>

  " filename (foo.txt)
  nnoremap <leader>ct :let @+=expand("%:t")<CR>

  " directory name (/something/src)
  nnoremap <leader>ch :let @+=expand("%:p:h")<CR>
endif

puis par exemple <leader>cf copiera le chemin relatif du buffer courant (le leader par défaut est backslash ( \ )). Je les utilise souvent pour exécuter des commandes sur un fichier ou faire d'autres choses sur la ligne de commande. Je n'utilise pas souvent le dernier nom de fichier / répertoire.

vous pourriez considérer des correspondances plus intuitives comme <leader>cfr pour relatif, <leader>cfa pour absolu, <leader>cff pour juste nom de fichier, <leader>cfd Pour répertoire.

49
répondu Anthony Panozzo 2017-05-23 11:54:47

si vous faites :reg vous verrez le nom du fichier courant dans le registre % . Vous pouvez le coller avec "%p , par exemple.

si, comme moi, vous passez souvent au tampon" alternate", il est très pratique que son chemin complet et le nom du fichier soient mis dans le registre # . Vous pouvez le coller avec "#p , par exemple.

Note (juste au cas où il s'agit d'un comportement propre à mon installation): j'utilise VIM 7.4.52 sur Ubuntu 14.04.4 LTS.

5
répondu Robert 2016-03-03 09:42:16

combinant des informations de quelques autres réponses: Si vous voulez yank le chemin complet courant vers un fichier et le mettre dans la commande buffer dans une autre fenêtre, d'abord faire :let @" = expand("%:p") , puis passer à une autre fenêtre et taper Ctrl+R " .

Utile pour copier un fichier, tout en restant dans le même répertoire, et en gardant l'ancien ouvrir. Par exemple:

Démarrer : Édition src/com/benatkin/peinture/formes/Cercle.java

  1. Type :let @" = expand("%:p") (le chemin est tiré vers le tampon du bloc-notes principal.)

  2. ouvrir une nouvelle fenêtre avec :sp

  3. Type :e Ctrl+R"

  4. utilisez les flèches pour revenir au cercle et le changer en Carré, et appuyez sur

Fin : l'Édition src/com/benatkin/peinture/formes/Carré.java

4
répondu Ben Atkin 2010-05-04 03:11:26

j'utilise xclip pour accéder au presse-papiers de X, donc j'utilise:

nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>
0
répondu user189557 2013-10-02 21:21:05

voici ma solution:

" filename / dirname of the current file {{{
    " copy result to the system clipboard and echo the result
    " the cb> prompt means the clipboard
    " *f*ile *n*ame, ex. init.vim
    map <Leader>fn :let @+ = expand("%:t") \| echo 'cb> ' . @+<CR>
    " *f*ile *p*ath, ex. /home/user/nvim/init.vim
    map <Leader>fp :let @+ = expand("%:p") \| echo 'cb> ' . @+<CR>
    " *d*irectory *p*ath, ex. /home/user/nvim
    map <Leader>dp :let @+ = expand("%:p:h") \| echo 'cb> ' . @+<CR>
    " *d*irectory *n*ame, ex. nvim
    map <Leader>dn :let @+ = expand("%:p:h:t") \| echo 'cb> ' . @+<CR>
" }}}
0
répondu Jabba 2016-05-12 16:08:12