2009-05-27 12 views
145

En supposant que le tampon actuel est un fichier ouvert pour l'édition, alors :e n'affiche pas E32: No file name.Yank nom de fichier/chemin du tampon courant dans Vim

Je voudrais tirer sur 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 ex. c:\foo\bar\myfile.txt
  • Juste le nom de fichier, par ex. myfile.txt
+0

similaires à http://stackoverflow.com/q/741024/80161 et http://stackoverflow.com/q/2233905/80161 –

+0

Pour le presse-papiers: http: //vi.stackexchange.com/questions/3686/copy-the-full-path-of-current-buffer-to-clipboard –

Répondre

167

Essayez ceci:

:let @" = expand("%")

cette copie le nom du fichier au registre unamed, vous pouvez utiliser un bon vieux « p » pour le coller. et bien sûr vous pouvez mapper cela à une clé pour une utilisation plus rapide.

:nmap cp :let @" = expand("%")

vous pouvez également l'utiliser pour le chemin complet

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

utilisation: aider à développer pour plus de détails

+19

cool vient d'ajouter à mon vimrc: noremap : let @ + = expand ("%: p") ThePosey

+5

Sous Windows, vous devez plutôt utiliser: laisser @ * = expand ("%"), si vous voulez qu'il soit dans le presse-papiers _Windows_. – KFL

+8

Si vous utilisez 'unnamedplus' comme presse-papier, utilisez' let @ + = expand ("%") ' –

76

presque ce que vous demandez, et il pourrait faire: le nom du fichier Ctrl+R % tractions en cours dans lequel vous êtes (invite de commande, tampon d'édition, ...). Voir this Vim Tip pour plus.

+0

Lorsque vous quittez le mode édition, vous pouvez ajouter le nom de fichier: ctrl- "ctrl-% p – stefanB

+1

stefanB: Je n'arrive pas à faire fonctionner ça :( – dwc

+9

'Ctrl + R%' fonctionne en mode 'insert' - mais en mode' edit', 'Ctrl + R' veut dire redo –

4

des informations provenant de deux autres réponses: Si vous voulez tirer sur la totalité du courant chemin vers un fichier et placez-le dans le tampon de commande dans une autre fenêtre, commencez par :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émarrer: Modification src/com/benatkin/peinture/formes/Circle.java

  1. type :let @" = expand("%:p")(Le chemin se yanked au tampon principal du presse-papiers.)

  2. Ouvrir une nouvelle fenêtre avec :sp

  3. Type de :e Ctrl+R"

  4. Utilisez les touches fléchées pour revenir à Circle et changer à la place, et appuyez sur <CR>

Fin: Modification src/com/benatkin/peinture/formes/Carré.java

44

Si vous voulez mettre le nom du tampon courant dans votre presse-papiers au niveau du système, essayez de modifier le registre @ +:

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

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

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

Modifier 20140421: J'utilise souvent ces , donc j'ai créé quelques raccourcis. Linux Vims apparently operate slightly differently than Mac Vims, donc il y a un cas particulier 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 

Ensuite, par exemple <leader>cf copiera le chemin relatif du tampon 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 vraiment le nom du dernier nom de fichier/répertoire.

Vous pourriez envisager de correspondances plus intuitives comme <leader>cfr pour le parent, <leader>cfa d'absolu, <leader>cff pour nom de fichier juste, <leader>cfd pour le répertoire.

+1

Sur windows et mac '" * 'et' "+' sont équivalents, de sorte que vous pouvez vous passer de la plate-forme vérifie et utilise simplement '@ +' –

+0

Assez curieusement cela ne semble pas fonctionner dans une fonction vimscript: "echo bufname ('%: p')" est vide, mais vous pouvez corriger cela avec le plus long "fnamemodify (bufname ('%'), ': p') " –

0

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

nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR> 
4

Si vous :reg vous verrez le nom du fichier en cours 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 nom complet path-and-file soit placé 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.

0

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