Yank nom de fichier / chemin du tampon actuel dans Vim

188

En supposant que le tampon actuel est un fichier ouvert pour modification, il :ene s'affiche donc pas E32: No file name.

Je voudrais retirer un ou tous:

  • Le nom du fichier exactement comme indiqué sur la ligne d'état, par exemple ~\myfile.txt
  • Un chemin complet vers le fichier, par exemple c:\foo\bar\myfile.txt
  • Juste le nom du fichier, par exemple myfile.txt
Davetapley
la source
Vers le presse-papier: vi.stackexchange.com/questions/3686/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

209

TL; DR

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

cela copiera le nom du fichier dans le registre sans nom , vous pourrez alors utiliser du bon vieux ppour le coller. et bien sûr, vous pouvez mapper cela à une clé pour une utilisation plus rapide.

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

vous pouvez également l'utiliser pour le chemin complet

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

Explication

Vim utilise le registre sans nom pour stocker le texte qui a été supprimé ou copié (arraché), de même lorsque vous le collez, il lit le texte de ce registre.

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

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

Voir :help let :help expand :help registerspour plus de détails

JD Frias
la source
23
Cool vient d'ajouter ceci à mon vimrc: noremap <silent> <F4>: let @ + = expand ("%: p") <CR>
ThePosey
9
Sous Windows, vous devez utiliser à la place: let @ * = expand ("%"), si vous voulez qu'il soit dans le presse-papiers de Windows .
KFL le
15
Si vous utilisez unnamedpluscomme presse-papierslet @+ = expand("%")
Kevin Cox
4
Utilisez "%:h"pour obtenir le chemin complet sans le nom de fichier.
Polymorphix
Associé, en particulier si vous avez besoin du répertoire sans nom de fichier - stackoverflow.com/a/2233924/1882064
arcseldon
94

Presque ce que vous demandez, et cela pourrait le faire: Ctrl+R %extrait le nom de fichier actuel là où vous vous trouvez (invite de commande, tampon d'édition, ...). Consultez cette astuce Vim pour en savoir plus.

dwc
la source
1
lorsque vous quittez le mode d'édition, vous pouvez ajouter le nom du fichier: ctrl- "ctrl-% p
stefanB
13
Ctrl+R %fonctionne en insertmode - mais en editmode, Ctrl+Rsignifie refaire.
Kevin Panko
3
Ce que stefanB voulait dire était "% p pour le mode normal / commande. C'est la même chose que <Cr>% en mode insert / cmdline-mode.
graywh
Juste pour résumer ou énoncer différemment: les réponses pour graywh et dwc sont "coller à partir du registre%". L'un fait cela pour le mode insertion, l'autre pour le mode normal. Dans macvim, il semble que le registre% ne puisse pas être écrasé.
Eric Hu
y a-t-il la même commande simple pour obtenir le numéro de lin? ) merci pour la solution
itsnikolay
73

Si vous souhaitez mettre le nom de fichier du tampon 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")

Edit 20140421: Je les utilise couramment, j'ai donc créé des raccourcis. Linux Vims fonctionne apparemment légèrement différemment de Mac Vims , il existe donc un cas particulier pour cela également. 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

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

Vous pouvez envisager des mappages plus intuitifs comme <leader>cfrpour relatif, <leader>cfapour absolu, <leader>cffpour juste nom de fichier, <leader>cfdpour répertoire.

Anthony Panozzo
la source
2
Sur Windows et Mac "*et "+sont équivalents, vous pouvez donc vous passer des vérifications de la plate-forme et simplement les utiliser@+
Gabe Moothart
1
Curieusement, cela ne semble pas fonctionner dans une fonction vimscript: "echo bufname ('%: p')" est vide, mais vous pouvez résoudre ce problème avec le plus long "fnamemodify (bufname ('%'), ': p' ) "
David Ljung Madison Stellar
6

Si vous le faites, :regvous verrez le nom du fichier actuel dans le %registre. Vous pouvez le coller avec "%p, par exemple.

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

Remarque (juste au cas où il s'agirait d'un comportement spécifique à ma configuration): j'utilise VIM 7.4.52 sur Ubuntu 14.04.4 LTS.

Robert
la source
4

Combiner les informations de quelques autres réponses: Si vous voulez extraire le chemin complet actuel d'un fichier et le mettre dans le tampon de commande dans une autre fenêtre, faites d'abord :let @" = expand("%:p"), puis passez à une autre fenêtre et tapez Ctrl+R ".

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

Début : Édition de src / com / benatkin / paint / forms / Circle.java

  1. Type :let @" = expand("%:p") (Le chemin est récupéré dans le tampon principal du presse-papiers.)

  2. Ouvrez une nouvelle fenêtre avec :sp

  3. Type :e Ctrl+R"

  4. Utilisez les touches fléchées pour revenir au cercle et le changer en carré, puis appuyez sur <CR>

Fin : Modification de src / com / benatkin / paint / forms / Square.java

Benjamin Atkin
la source
1

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>
" }}}
Jabba
la source
-1

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>
user189557
la source
"+ ou" * font la même chose de manière native dans vim sans avoir à utiliser une commande externe.
Dorian B.