Yank dosya adı / Vim'deki geçerli arabelleğin yolu


188

Geçerli arabelleğin düzenleme için açık bir dosya olduğu varsayıldığında, :egörüntülenmez E32: No file name.

Şunlardan birini ya da hepsini çekmek istiyorum:

  • Dosya adı tam olarak durum satırında gösterildiği gibi, ör. ~\myfile.txt
  • Dosyanın tam yolu, ör. c:\foo\bar\myfile.txt
  • Yalnızca dosya adı, ör. myfile.txt


Yanıtlar:


209

TL; DR

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

bu, dosya adını adlandırılmamış kayıt defterine kopyalar , daha sonra pyapıştırmak için eskiyi kullanabilirsiniz . ve elbette bunu daha hızlı kullanmak için bir anahtarla eşleştirebilirsiniz.

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

bunu tam yol için de kullanabilirsiniz

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

açıklama

Vim isimsiz kaydı kullanıyor silinen veya kopyalanan (çekilen) metinleri depolamak yapıştırdığınızda da bu kayıttaki metni okur.

Kullanarak letmetni kullanarak kayıt defterinde manuel olarak saklayabiliriz, :let @" = "text"ancak bir ifadenin sonucunu da saklayabiliriz.

Yukarıdaki örnekte expand, joker karakterleri ve anahtar kelimeleri genişleten işlevi kullanıyoruz . örneğimizde expand('%')geçerli dosya adını genişletmek için kullanıyoruz . expand('%:p')Tam dosya adı için olduğu gibi değiştirebiliriz .

Ayrıntılar :help let :help expand :help registersiçin bakınız


23
Cool bunu vimrc'ye ekledi: noremap <silent> <F4>: let @ + = genişletin ("%: p") <CR>
ThePosey

9
Windows'ta bunun yerine şunu kullanmalısınız: Windows panosunda olmasını istiyorsanız, let @ * = expand ("%") .
KFL

15
Eğer kullanıyorsanız unnamedplussizin pano kullanımı gibilet @+ = expand("%")
Kevin Cox

4
"%:h"Dosya adı olmadan tam yolu almak için kullanın .
Polymorphix

İlgili, özellikle dosya adı olmadan dizine ihtiyacınız varsa - stackoverflow.com/a/2233924/1882064
arcseldon

94

Neredeyse istediğin şey ve bunu yapabilir: Ctrl+R %geçerli dosya adını bulunduğun yere çeker (komut istemi, arabelleği düzenle, ...). Daha fazla bilgi için bu Vim İpucuna bakın .


1
düzenleme modundan çıktığınızda dosya adını ekleyebilirsiniz: ctrl- "ctrl-% p
stefanB

13
Ctrl+R %insertmoddayken çalışır - ancak editmodda Ctrl+Ryineleme anlamına gelir.
Kevin Panko

3
StefanB ne demek "normal / komut modu için% p. Bu insert / cmdline-modunda% <Cr> ile aynı.
graywh

Sadece yeniden özetlemek veya farklı bir şekilde ifade etmek için: hem gri hem de dwc için cevaplar "% register 'dan yapıştır" şeklindedir. Biri ekleme modu için, diğeri normal mod için bunu yapar. Macvim'de,% register'ın üzerine yazılamayacağı anlaşılıyor.
Eric Hu

linenumber almak için aynı basit komut var mı? ) çözüm için thx
itsnikolay

73

Geçerli arabellek dosya adını sistem düzeyi panonuza koymak istiyorsanız, kaydı @ + olarak değiştirmeyi deneyin:

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

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

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

Edit 20140421: Bunları yaygın olarak kullanıyorum, bu yüzden bazı kısayollar oluşturdum. Linux Vims görünüşe göre Mac Vims'den biraz farklı çalışıyor , bu yüzden de bunun için özel bir durum var. Şunlara aşağıdakileri koyarsanız ~/.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

Sonra örneğin <leader>cf geçerli arabellek göreli yolunu kopyalar (varsayılan lider ters eğik çizgi ( \)). Bunları genellikle bir dosyada komut çalıştırmak veya komut satırında başka şeyler yapmak için kullanırım. Son dosya adını / dizin adını sık sık kullanmıyorum.

<leader>cfrİçin göreli, <leader>cfamutlak, <leader>cffsadece dosya adı, <leader>cfddizin gibi daha sezgisel eşlemeler düşünebilirsiniz .


2
Windows ve Mac'te "*ve "+eşdeğerdir, böylece platform kontrollerinden vazgeçebilir ve sadece kullanabilirsiniz@+
Gabe Moothart

1
Garip bir şekilde bu bir vimscript işlevinde çalışmıyor gibi görünüyor: "echo bufname ('%: p')" boş, ancak bunu daha uzun "fnamemodify (bufname ('%'), ': p' ile düzeltebilirsiniz. ) "
David Ljung Madison Stellar

6

Bunu yaparsanız :reg, %kayıtta geçerli dosyanın adını göreceksiniz . İle yapıştırabilirsiniz"%pÖrneğin, .

Benim gibi, genellikle 'alternatif' arabelleğe geçerseniz, tam yol ve dosya adının #kayıt defterine yerleştirilmesi çok kullanışlıdır . İle yapıştırabilirsiniz"#pÖrneğin, .

Not (bunun kurulumuma özgü bir davranış olması durumunda): Ubuntu 14.04.4 LTS'de VIM 7.4.52 kullanıyorum.


4

Diğer birkaç yanıttan gelen bilgileri birleştirme: Geçerli tam yolu bir dosyaya çekmek ve başka bir pencerede komut arabelleğine koymak istiyorsanız, önce yapın :let @" = expand("%:p"), sonra başka bir pencereye geçin ve yazınCtrl+R " .

Aynı dizinde kalırken ve eskisini açık tutarken bir dosyayı kopyalamak için kullanışlıdır. Örneğin:

Başlangıç : src / com / benatkin / paint / şekiller / Circle.java

  1. Tür :let @" = expand("%:p") (Yol, ana pano arabelleğine çekilir.)

  2. İle yeni bir pencere aç :sp

  3. tip :e Ctrl+R"

  4. Daire'ye geri dönüp Kare olarak değiştirmek için ok tuşlarını kullanın ve <CR> tuşuna basın

Son : src / com / benatkin / boya / şekiller / Square.java


1

İşte benim çözümüm:

" 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

X'in panosuna erişmek için xclip kullanıyorum, bu yüzden kullanıyorum:

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

"+ veya" * harici bir komut kullanmak zorunda kalmadan aynı şeyi vim'de de doğal olarak yapar.
Dorian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.