Supponendo che il buffer corrente sia un file aperto per la modifica, quindi :e
non visualizza E32: No file name
.
Vorrei strappare uno o tutti:
~\myfile.txt
c:\foo\bar\myfile.txt
myfile.txt
TL; DR
:let @" = expand("%")
>
questo copierà il nome del file nel registro senza nome , quindi puoi usare il buon vecchio p
per incollarlo. e ovviamente puoi associarlo a una chiave per un uso più rapido.
:nmap cp :let @" = expand("%")<cr>
puoi anche usarlo per il percorso completo
:let @" = expand("%:p")
Spiegazione
Vim usa il registro senza nome per memorizzare il testo che è stato eliminato o copiato (strappato), allo stesso modo quando lo incolli legge il testo da questo registro.
Usando let
possiamo memorizzare manualmente il testo nel registro usando :let @" = "text"
Ma possiamo anche memorizzare il risultato di un'espressione.
Nell'esempio sopra usiamo la funzione expand
che espande caratteri jolly e parole chiave. nel nostro esempio usiamo expand('%')
per espandere il nome del file corrente. Possiamo modificarlo come expand('%:p')
per il nome file completo.
Vedi :help let
:help expand
:help registers
Per i dettagli
Quasi quello che stai chiedendo e potrebbe fare: Ctrl+R %
trascina il nome del file corrente nel punto in cui ti trovi (comando Prompt, modifica buffer, ...). Vedi questo suggerimento Vim per ulteriori informazioni.
Se si desidera inserire il nome file del buffer corrente negli Appunti a livello di sistema, provare a cambiare il registro in @ +:
" relative path
:let @+ = expand("%")
" full path
:let @+ = expand("%:p")
" just filename
:let @+ = expand("%:t")
Modifica 20140421: li uso comunemente, quindi ho creato alcune scorciatoie. Linux Vims apparentemente funziona in modo leggermente diverso rispetto a Mac Vims , quindi esiste anche un caso speciale. Se inserisci quanto segue nel tuo ~/.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
Quindi ad esempio <leader>cf
copierà il percorso relativo del buffer corrente (il leader predefinito è una barra rovesciata (\
)). Li uso spesso per eseguire comandi su un file o fare altre cose sulla riga di comando. In realtà non uso spesso l'ultimo nome file/directory.
Potresti prendere in considerazione mappature più intuitive come <leader>cfr
per parente, <leader>cfa
per assoluto, <leader>cff
solo per il nome file, <leader>cfd
per directory.
Se fate :reg
vedrai il nome del file corrente nel %
Registrati. Puoi incollarlo con "%p
, per esempio.
Se, come me, si passa spesso al buffer "alternativo", è molto utile che il nome completo del percorso e del file sia inserito in #
Registrati. Puoi incollarlo con "#p
, per esempio.
Nota (nel caso in cui si tratti di un comportamento specifico della mia configurazione): sto usando VIM 7.4.52 su Ubuntu 14.04.4 LTS.
Combinazione di informazioni da un paio di altre risposte: se si desidera strappare il percorso completo corrente a un file e inserirlo nel buffer dei comandi in un'altra finestra, innanzitutto eseguire :let @" = expand("%:p")
, quindi passare a un'altra finestra e digitare Ctrl+R "
.
Utile per copiare un file rimanendo nella stessa directory e mantenendo aperto quello vecchio. Per esempio:
Inizio: Modifica src/com/benatkin/Paint/shapes/Circle.Java
Digitare
:let @" = expand("%:p")
(Il percorso viene strappato al buffer degli appunti principale.)Apri una nuova finestra con
:sp
Digita
:e Ctrl+R"
Utilizzare i tasti freccia per tornare a Cerchio e modificarlo in Quadrato, quindi premere <CR>
Fine: Modifica src/com/benatkin/Paint/shapes/Square.Java
Ecco la mia soluzione:
" 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>
" }}}
Uso xclip per accedere agli appunti di X, quindi utilizzo:
nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>