Domanda

Supponendo il buffer corrente è un file aperto per la modifica, in modo da :e non visualizza E32: No file name.

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, per esempio c:\foo\bar\myfile.txt
  • Basta il nome del file, ad esempio myfile.txt
È stato utile?

Soluzione

TL; DR

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

questo copierà il nome del file per il registro unamed , quindi è possibile utilizzare il buon vecchio p per incollarlo. e, naturalmente, è possibile associare questo ad un tasto per l'utilizzo più veloce.

:nmap cp :let @" = expand("%")<cr>

è anche possibile utilizzare questo 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 si incolla legge il testo da questo registro.

Utilizzando let possiamo memorizzare manualmente il testo nel registro utilizzando :let @" = "text" ma possiamo anche memorizzare il risultato di un'espressione.

Nell'esempio precedente si usa la funzione expand che espande jolly e le parole chiave. Nel nostro esempio usiamo expand('%') per espandere il nome del file corrente. Siamo in grado di modificarlo come expand('%:p') per il nome del file completo.

Vedere :help let :help expand :help registers per i dettagli

Altri suggerimenti

Quasi quello che stai chiedendo, e potrebbe fare: Ctrl+R % tira il nome del file corrente in cui sei (prompt dei comandi, modificare tampone, ...). Vedere questo Tip Vim di più.

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

Modifica 20140421: Io comunemente uso questi, così ho creato alcune scorciatoie. Linux Vims a quanto pare funziona in modo leggermente diverso rispetto a Mac Vims , per cui v'è un caso speciale per questo pure. 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

Quindi per esempio <leader>cf copierà il percorso relativo del buffer corrente (il leader di default è backslash (\)). Io uso spesso questi per l'esecuzione di comandi su un file o fare altre cose sulla riga di comando. Io in realtà non uso l'ultimo nome di file Nome / directory 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.

Se non :reg si vedrà il nome del file corrente nel registro delle %. È possibile incollare con "%p, per esempio.

Se, come me, spesso si passa al buffer 'alternativo', è molto utile che il suo percorso e file-name-completo sono messi nel registro delle #. È possibile incollare con "#p, per esempio.

Nota (solo nel caso in cui questo è un comportamento specifico per il mio setup):. Sto usando VIM 7.4.52 su Ubuntu 14.04.4 LTS

La combinazione di informazioni da un paio di altre risposte: Se si vuole tirare il percorso completo corrente in un file e metterlo nel buffer di comando in un'altra finestra, in primo luogo fare :let @" = expand("%:p"), per poi passare ad un'altra finestra e tipo Ctrl+R "

Utile per la copia di un file durante il soggiorno nella stessa directory e mantenendo il vecchio aperto. Ad esempio:

  

Start : Modifica src / com / benatkin / pittura / forme / Circle.java

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

  2.   
  3. Aprire una nuova finestra con :sp

  4.   
  5. Tipo :e Ctrl+R"

  6.   
  7. Con i tasti freccia per tornare al cerchio e modificarlo in Piazza, e premere

  8.   
     

Fine : Modifica src / com / benatkin / pittura / forme / Square.java

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

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

nmap <localleader>d :call system("xclip -i -selection clipboard", expand("%:p"))<CR>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top