Question

Si l'on suppose le tampon courant est un fichier ouvert pour modifier, si :e n'affiche pas E32: No file name.

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 d'accès complet au fichier, par exemple, c:\foo\bar\myfile.txt
  • Juste le nom du fichier, par exemple myfile.txt
Était-ce utile?

La solution

TL; DR

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

copie le nom du fichier dans le registre unamed , vous pouvez utiliser un bon vieux p pour le coller. et bien sûr, vous pouvez mapper ce à 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 du texte qui a été supprimé ou copié (yanked), même lorsque vous collez il lit le texte de ce registre.

Utilisation let nous pouvons stocker manuellement du texte dans le registre à l'aide :let @" = "text" mais on peut aussi stocker le résultat d'une expression.

Dans l'exemple ci-dessus, nous utilisons la fonction expand qui étend les jokers et mots-clés. dans notre exemple, nous utilisons expand('%') pour développer le nom du fichier en cours. Nous pouvons le modifier comme expand('%:p') le nom complet du fichier.

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

Autres conseils

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

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: Je l'utilise souvent ces derniers, donc je créé des raccourcis. , 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 l'utilise souvent pour ces commandes en cours d'exécution sur un fichier ou faire d'autres choses sur la ligne de commande. Je ne suis pas vraiment utiliser le dernier nom de fichier / nom du répertoire souvent.

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.

Si vous :reg vous verrez le nom du fichier en cours dans le registre de %. Vous pouvez le coller avec "%p, par exemple.

Si, comme moi, vous passez souvent à la mémoire tampon « autre », il est très pratique qui sont mis dans le registre # tout son chemin et nom de fichier. Vous pouvez le coller avec "#p, par exemple.

Note (juste au cas où ce comportement est spécifique à ma configuration). J'utilise VIM 04/07/52 sur Ubuntu 14.04.4 LTS

La combinaison des informations d'un couple d'autres réponses: Si vous voulez tirer sur le chemin complet en cours dans un fichier et de le mettre dans la mémoire tampon de commande dans une autre fenêtre, d'abord faire :let @" = expand("%:p"), puis passer à une autre fenêtre et tapez Ctrl+R "

Utile pour la copie d'un fichier tout en restant dans le même répertoire et de garder 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.   
  3. Ouvrez une nouvelle fenêtre avec :sp

  4.   
  5. Type :e Ctrl+R"

  6.   
  7. Utilisez les touches fléchées pour revenir à Circle et changer à la place, et appuyez sur

  8.   
     

Fin : Modification src / com / benatkin / peinture / formes / Square.java

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

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

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