2012-03-09 23 views
7

Vim'de görsel seçimi bir komut aracılığıyla filtrelemek istiyorum.Vim süzgeci sadece görsel seçimi değil tüm satırı değil

hattı

this is a test 

içinde a test Seçme ve

:'<,'>!echo "the result" 

yazarak

the result 
neden olacaktır: Biliyorum yolu daima görsel seçimi uzandığı üzerinde tam satırları filtreler

Ama ben istiyorum:

this is the result 
+1

Olası yinelenen ([vim bir seçime 'base64 --decode' yürütme] http://stackoverflow.com/questions/7845671/executing-base64-decode-on-a-selection-in -vim)". –

cevap

3

! linewise filtreleme komutlarının davranışını uymak aşağıdaki eşleştirmeleri düşünün (:helpg \*!\* ve :help v_! bakınız).

nnoremap <silent> <leader>! :set opfunc=ProgramFilter<cr>[email protected] 
vnoremap <silent> <leader>! :<c-u>call ProgramFilter(visualmode(), 1)<cr> 
function! ProgramFilter(vt, ...) 
    let [qr, qt] = [getreg('"'), getregtype('"')] 
    let [oai, ocin, osi, oinde] = [&ai, &cin, &si, &inde] 
    setl noai nocin nosi inde= 

    let [sm, em] = ['[<'[a:0], ']>'[a:0]] 
    exe 'norm!`' . sm . a:vt . '`' . em . 'x' 

    call inputsave() 
    let cmd = input('!') 
    call inputrestore() 

    let out = system(cmd, @") 
    let out = substitute(out, '\n$', '', '') 
    exe "norm!i\<c-r>=out\r" 

    let [&ai, &cin, &si, &inde] = [oai, ocin, osi, oinde] 
    call setreg('"', qr, qt) 
endfunction 
"nin
+0

Çok iyi! Üzgünüm benim sorum çok hassas değildi (ditto kev). Aslında her ikisini de yapmak istediğim en genel durumu hedefliyordu: 1) görsel seçimi bir komuta iletmek 2) kısa komutları kullanarak bu komutu vim olarak belirtin; yani vim komutu, örneğinizde 'base64 --decode' ifadesini argüman olarak almalıdır. – highsciguy

+0

Başka bir deyişle, sadece görsel seçim için, sadece satırlar için değil, filtre komutu ile aynı şeyi yapmalıdır. – highsciguy

+0

@ user429540: Şimdi anlıyorum. Bu filtreleme komutlarını uygulamak için yazılan eşlemeleri listeleyen güncellenmiş cevaplara bir göz atın. –

3

Visual alan içinde maç için \%V kullanabilirsiniz:

:'<,'>s/\%V.*\%V/\=system('echo -n "the result"') 
+0

Teşekkürler, bu işler, ancak biraz uzun. Kabuk komutunu parametre olarak alan bir vmap lookk ne olurdu? – highsciguy

+1

.. ve elbette benim örneğimde komut, genel olarak duruma göre görsel seçime bağlı değildir. Peki görsel seçimi komuta argüman olarak nasıl iletebilirim? – highsciguy

İlgili konular