2009-05-27 15 views
145

Supponendo che il buffer corrente sia un file aperto per la modifica, quindi non viene visualizzato E32: No file name.Nome file Yank/percorso del buffer corrente in Vim

vorrei tirare una o tutte:

  • Il nome del file esattamente come mostra sulla riga di stato, ad esempio, ~\myfile.txt
  • Un percorso completo del file, ad es. c:\foo\bar\myfile.txt
  • Solo il nome del file, ad es. myfile.txt
+0

Simile a http://stackoverflow.com/q/741024/80161 e http://stackoverflow.com/q/2233905/80161 –

+0

negli Appunti: http: //vi.stackexchange.com/questions/3686/copy-the-full-path-of-current-buffer-to-clipboard –

risposta

167

Prova questa:

:let @" = expand("%")

questo copierà il nome del file per il registro unamed, quindi è possibile utilizzare il buon vecchio 'p' per incollarlo. e naturalmente puoi mapparlo a una chiave per un utilizzo più rapido.

:nmap cp :let @" = expand("%")

si può anche utilizzare questo per il percorso completo

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

uso: aiutare ad espandere per maggiori dettagli

+19

fresco appena aggiunto questo al mio vimrc: noremap : lasciare @ + = ampliata ("%: p") ThePosey

+5

Su Windows, si dovrebbe invece usare: lasciare @ * = ampliata ("%"), se vuoi che sia negli appunti _Windows_. – KFL

+8

Se si usa 'unnamedplus' come appunti usa' let @ + = expand ("%") ' –

76

Quasi quello che stai chiedendo, e potrebbe fare: Ctrl+R % tira il nome del file corrente in cui sei (prompt dei comandi, modificare tampone, ...). Vedi this Vim Tip per ulteriori informazioni.

+0

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

+1

stefanB: Non riesco a farlo funzionare :( – dwc

+9

'Ctrl + R%' funziona in modalità 'insert' - ma in modalità 'edit',' Ctrl + R' significa redo. –

4

combinando le informazioni da un paio di altre risposte: Se si vuole tirare la piena corrente percorso di un file e inserirlo nel buffer di comando in un'altra finestra, prima fare :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: Editing src/com/benatkin/pittura/forme/Circle.java

  1. Tipo :let @" = expand("%:p")(Il sentiero si fa uno strattone al buffer appunti principale.)

  2. Aprire una nuova finestra con :sp

  3. Tipo :e Ctrl+R"

  4. Utilizzare i tasti freccia per tornare al cerchio e modificarlo in Piazza, e premere <CR>

Fine: Editing src/com/benatkin/vernice/forme/Square.java

44

Se si desidera inserire il nome del file buffer corrente nella clipboard a livello di sistema, provare a cambiare il registro per @ +:

" relative path 
:let @+ = expand("%") 

" full path 
:let @+ = expand("%:p") 

" just filename 
:let @+ = expand("%:t") 

Edit 20.140.421: Ho comunemente uso questi , quindi ho creato alcune scorciatoie. Linux Vims apparently operate slightly differently than Mac Vims, quindi c'è anche un caso speciale. Se si mette il seguente nella vostra ~/.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 

Poi per esempio <leader>cf copierà il percorso relativo del buffer corrente (il leader di default è backslash (\)). Li uso spesso per eseguire comandi su un file o fare altre cose sulla riga di comando. In realtà non utilizzo l'ultimo nome di file/nome spesso.

si potrebbe considerare mappature più intuitivi come <leader>cfr per il parente, <leader>cfa per assoluta, <leader>cff solo per il nome del file, <leader>cfd per directory.

+1

Su windows e mac '" * 'e' "+' sono equivalenti, quindi puoi fare a meno della piattaforma controlla e basta usare '@ +' –

+0

Stranamente questo non sembra funzionare in una funzione di vimscript: "echo bufname ('%: p')" è vuoto, ma puoi aggiustarlo con il più lungo "fnamemodify (bufname ('%'), ': p')" –

0

Io uso XRITAGLIA per accedere appunti di X, per cui uso:

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

Se fai :reg vedrete il nome del file corrente nel registro delle %. 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 nel registro #. Puoi incollarlo con "#p, per esempio.

Nota (nel caso in cui questo sia un comportamento specifico della mia configurazione): Sto utilizzando VIM 7.4.52 su Ubuntu 14.04.4 LTS.

0

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