web-dev-qa-db-fra.com

Nom de fichier Yank / chemin du tampon actuel dans Vim

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

Je voudrais arracher un ou tous:

  • Le nom du fichier exactement comme indiqué sur la ligne d'état, par ex. ~\myfile.txt
  • Un chemin complet vers le fichier, par ex. c:\foo\bar\myfile.txt
  • Juste le nom du fichier, par ex. myfile.txt
171
dukedave

TL; DR

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

cela copiera le nom du fichier dans le registre non nommé , puis vous pourrez utiliser le bon vieux p pour le coller. et bien sûr, vous pouvez associer 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é (retiré), de même lorsque vous le collez, il 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 également 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 développer le nom du fichier actuel. Nous pouvons le modifier comme expand('%:p') pour le nom de fichier complet.

Voir :help let:help expand:help registers Pour plus de détails

192
JD Frias

Presque ce que vous demandez, et cela pourrait faire: Ctrl+R % tire le nom de fichier actuel à l'endroit où vous vous trouvez (invite de commande, modifier le tampon, ...). Voir ce conseil Vim pour en savoir plus.

86
dwc

Si vous souhaitez placer 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 y a donc un cas spécial pour cela aussi. 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

Alors 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 faire d'autres choses sur la ligne de commande. Je n'utilise pas vraiment souvent le dernier nom de fichier/nom de répertoire.

Vous pourriez envisager des mappages plus intuitifs comme <leader>cfr pour un parent, <leader>cfa pour l'absolu, <leader>cff pour juste le nom de fichier, <leader>cfd pour le répertoire.

62
Anthony Panozzo

Si tu fais :reg vous 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 d'accès complet et son nom de fichier soient placés dans le # registre. Vous pouvez le coller avec "#p, par exemple.

Remarque (juste au cas où ce comportement est spécifique à ma configuration): J'utilise VIM 7.4.52 sur Ubuntu 14.04.4 LTS.

5
Robert

Combiner les informations de quelques autres réponses: Si vous souhaitez extraire le chemin d'accès complet actuel à un fichier et le placer dans le tampon de commande dans une autre fenêtre, faites d'abord :let @" = expand("%:p"), puis déplacez-vous dans 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émarrer: Édition src/com/benatkin/Paint/formes/Circle.Java

  1. Tapez :let @" = expand("%:p") (Le chemin d'accès est récupéré dans le tampon principal du presse-papiers.)

  2. Ouvrez une nouvelle fenêtre avec :sp

  3. Tapez :e Ctrl+R"

  4. Utilisez les touches fléchées pour revenir à Circle et changez-le en Square, puis appuyez sur <CR>

Fin: Édition src/com/benatkin/Paint/formes/Square.Java

4
Benjamin Atkin

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

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
user189557