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
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
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.
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.
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.
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
Type
:let @" = expand("%:p")
(le chemin est tiré vers le tampon du bloc-notes principal.)ouvrir une nouvelle fenêtre avec
:sp
Type
:e Ctrl+R"
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
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>
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>
" }}}