risposta-alla-domanda-sullo-sviluppo-web-bd.com

Nome del file Yank / percorso del buffer corrente in Vim

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:

  • 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
171
dukedave

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

192
JD Frias

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.

86
dwc

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.

62
Anthony Panozzo

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.

5
Robert

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. Digitare :let @" = expand("%:p") (Il percorso viene strappato al buffer degli appunti principale.)

  2. Apri una nuova finestra con :sp

  3. Digita :e Ctrl+R"

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

Fine: Modifica src/com/benatkin/Paint/shapes/Square.Java

4
Benjamin Atkin

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
Jabba

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

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