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:
~\myfile.txt
c:\foo\bar\myfile.txt
myfile.txt
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
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.
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.
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.
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
Tapez
:let @" = expand("%:p")
(Le chemin d'accès est récupéré dans le tampon principal du presse-papiers.)Ouvrez une nouvelle fenêtre avec
:sp
Tapez
:e Ctrl+R"
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
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 pour accéder au presse-papiers de X, donc j'utilise:
nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>