2013-11-28 4 views
5

Herkesin bildiği gibi :so % tarafından :source güncel arabellek yapabiliriz.Vim: Nasıl yapılır: arabelleğin bir parçasını kaynak

Ancak bazen arabelleğin tamamını değil, arabelleğin yalnızca bir bölümünü :source istiyorum. Diyelim ki, .vimrc'a bir şey ekledim ve bu parçayı kaynaklamak istiyorum, ancak tüm diğer şeyleri yeniden kaynaklamak istemiyorum.

Seçkin metinleri denedim ve :so (aslında :'<,'>so), ancak aralığın izin verilmediğini bildirdi. Peki, bu nasıl yapılabilir?

Tabii ki gerekli parçayı geçici dosyaya kaydedebilir ve kaynatabilirim, ancak açıkça sinir bozucu.

cevap

2

Teşekkür, onun ana fikrini almış ve onu geliştirdik. Ben geliştirmek istedik Ne:

  • Biz ek kullanıcı tarafından belirtilen komutu :Execute yerine standart :so kullanmak zorunda (Tamam, biz, kullanıcı tarafından belirlenen komutu :So adlandırabilir, yine de komuta yeni harfle sürümünü kullanmaya can sıkıcı)
  • Küçük bir yan etkisi var: komutu çalıştırdıktan sonra @z kayıt bozuk. Aşağıda senaryom ile

, biz daha önce olduğu gibi :so {file} komutunu kullanabilirsiniz ve biz de aralığı ile kullanmak mümkün şunlardır:

: :'<,'>so İşte


(aslında :'<,'>Source genişler olan)

" This script provides :Source command, a drop-in replacement for 
" built-in :source command, but this one also can take range and execute just 
" a part of the buffer. 
" 


" Sources given range of the buffer 
function! <SID>SourcePart(line1, line2) 
    let tmp = @z 
    silent exec a:line1.",".a:line2."yank z" 
    let @z = substitute(@z, '\n\s*\\', '', 'g') 
    @z 
    let @z = tmp 
endfunction 



" if some argument is given, this command calls built-in command :source with 
" given arguments; otherwise calls function <SID>SourcePart() which sources 
" visually selected lines of the buffer. 
command! -nargs=? -bar -range Source if empty("<args>") | call <SID>SourcePart(<line1>, <line2>) | else | exec "so <args>" | endif 



" in order to achieve _real_ drop-in replacement, I like to abbreviate 
" existing :so[urce] command to the new one. 
" 
" So, we can call :so % just as before, and we are also call '<,'>so 

cnoreabbr so  Source 
cnoreabbr sou Source 
cnoreabbr sour Source 
cnoreabbr sourc Source 
cnoreabbr source Source 
+1

'cnoreabbr'leri kullanırken dikkatli olmalısınız. Beklenmedik yerlerde genişlerler örn. aramak. Daha fazla bilgi için bu yayına bakın http://stackoverflow.com/questions/7513380/vim-change-x-function-to-delete-buffer-instead-of-save-quit –

+0

@PeterRincker, notunuz için teşekkür ederiz. . –

3

Geçerli hattı veya geçirilen dizi faaliyet aşağıdaki komutu, tanımlayabilirsiniz: Ingo Karkat için

":[range]Execute Execute text lines as ex commands. 
"   Handles |line-continuation|. 
command! -bar -range Execute silent <line1>,<line2>yank z | let @z = substitute(@z, '\n\s*\\', '', 'g') | @z 
+0

Çok teşekkür ederim, ana fikrinizi aldım ve geliştirdim, ilgilenirseniz cevabımı görün. –

1

Yalnızca bir satır seçtiyseniz, aşağıdaki işlemler çalışır:

yq:p<enter> 

Bu aynı zamanda çalışacaktır:

y:<control-r>"<enter> 
4

Neden Aşağıdaki eşleştirmeleri yok bir dosya (veya bir dizi) kaynak için: Şimdi

" source the current file 
nmap <leader>vs :source %<CR> 
" source a visual range 
vmap <leader>vs y:@"<CR> 

, sizin mapleader , olup olmadığını (,vs basabilirsiniz) ve seçilen aralık, kaynaklı veya normal modda, geçerli dosya kaynaklı olacaktır.