Nome del file Yank / percorso del buffer corrente in Vim


188

Supponendo che il buffer corrente sia un file aperto per la modifica, quindi :enon viene visualizzato E32: No file name.

Vorrei strappare uno o tutti:

  • Il nome del file è esattamente come mostrato nella riga di stato, ad es ~\myfile.txt
  • Un percorso completo del file, ad es c:\foo\bar\myfile.txt
  • Solo il nome del file, ad es myfile.txt


Risposte:


209

TL; DR

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

questo copierà il nome del file nel registro senza nome , quindi puoi usarlo pper 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 utilizza il registro senza nome per memorizzare il testo che è stato eliminato o copiato (strappato), allo stesso modo quando lo si incolla legge il testo da questo registro.

Usando letpossiamo archiviare manualmente il testo nel registro usando :let @" = "text"ma possiamo anche memorizzare il risultato di un'espressione.

Nell'esempio sopra usiamo la funzione expandche espande caratteri jolly e parole chiave. nel nostro esempio usiamo expand('%')per espandere il nome del file corrente. Possiamo modificarlo comeexpand('%:p') per il nome file completo.

Vedi :help let :help expand :help registersper i dettagli


23
Cool ha appena aggiunto questo al mio vimrc: noremap <silent> <F4>: let @ + = expand ("%: p") <CR>
ThePosey

9
Su Windows, dovresti invece usare: let @ * = expand ("%"), se vuoi che sia negli appunti di Windows .
KFL,

15
Se si utilizza unnamedpluscome l'utilizzo clipboardlet @+ = expand("%")
Kevin Cox

4
Utilizzare "%:h"per ottenere il percorso completo senza il nome file.
Polymorphix,

Correlati, in particolare se avete bisogno della directory senza nome del file - stackoverflow.com/a/2233924/1882064
arcseldon

94

Quasi quello che stai chiedendo, e potrebbe fare: Ctrl+R %trascina il nome del file corrente nel punto in cui ti trovi (prompt dei comandi, modifica buffer, ...). Vedi questo Vim Tip per di più.


1
quando si esce dalla modalità di modifica è possibile aggiungere il nome del file: ctrl- "ctrl-% p
stefanB

13
Ctrl+R %funziona in insertmodalità - ma in editmodalità, Ctrl+Rsignifica ripetere.
Kevin Panko,

3
Il significato di stefanB era "% p per modalità normale / comando. È uguale a <Cr>% in modalità inserimento / cmdline.
graywh

Solo per riassumere o affermare diversamente: le risposte sia per graywh che per dwc sono "incolla dal registro%". Uno fa questo per la modalità di inserimento, l'altro per la modalità normale. In macvim, sembra che il registro% non possa essere sovrascritto.
Eric Hu,

c'è lo stesso semplice comando per ottenere il numero di biancheria? ) thx for solution
itsnikolay

73

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. Apparentemente Linux Vims 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>cfcopierà il percorso relativo del buffer corrente (il leader predefinito è backslash ( \)). 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>cfrper relativa, <leader>cfaper assoluta, <leader>cffper solo nome file, <leader>cfdper directory.


2
Su Windows e Mac "*e "+sono equivalenti, in modo da poter fare a meno i controlli di piattaforma e basta usare@+
Gabe Moothart

1
Stranamente questo non sembra funzionare in una funzione vimscript: "echo nomebuf ('%: p')" è vuoto, ma puoi sistemarlo con il "fnamemodify ('%') più lungo, ': p' ) "
David Ljung Madison Stellar l'

6

Se lo fai :regvedrai il nome del file corrente nel %registro. Puoi incollarlo con"%p , per esempio.

Se, come me, si passa spesso al buffer "alternativo", è molto utile che il suo percorso completo e il nome del file vengano inseriti nel #registro. 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.


4

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

  1. Tipo :let @" = expand("%:p") (il percorso viene strappato al buffer degli appunti principale).

  2. Apri una nuova finestra con :sp

  3. genere :e Ctrl+R"

  4. Utilizzare i tasti freccia per tornare a Cerchio e modificarlo in Quadrato, quindi premere <CR>

Fine : modifica di src / com / benatkin / paint / shapes / Square.java


1

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

-1

Uso xclip per accedere agli appunti di X, quindi utilizzo:

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

"+ o" * fanno la stessa cosa nativamente in vim senza dover usare un comando esterno.
Dorian B.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.