2012-03-09 9 views
7

मैं एक कमांड के माध्यम से Vim में दृश्य चयन फ़िल्टर करना चाहता हूं।विम फ़िल्टर केवल दृश्य चयन नहीं है पूरी लाइन

लाइन

this is a test 

में चयन a test और

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

टाइपिंग

the result 
में परिणाम होगा: जिस तरह से मैं जानता हूँ कि हमेशा पूरा लाइनों जिस पर दृश्य चयन फैली फिल्टर

लेकिन मुझे चाहिए:

this is the result 
+1

"के संभावित डुप्लिकेट [निष्पादित vim में एक चयन पर 'बेस 64 --decode'] (http://stackoverflow.com/questions/7845671/executing-base64-decode-on-a-selection-in -vim) "। –

उत्तर

3

पर विचार करें निम्नलिखित मैपिंग कि ! linewise छानने आदेशों के व्यवहार का पालन करना (:helpg \*!\* और :help v_! देखें)।

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 
+0

बहुत अच्छा! क्षमा करें कि मेरा प्रश्न बहुत सटीक नहीं था (ditto kev)। यह वास्तव में सबसे सामान्य मामला को लक्षित कर रहा था जिसमें मैं दोनों करना चाहता हूं: 1) दृश्य चयन को कमांड में पास करें 2) कमांड का उपयोग करके इस कमांड को vim में निर्दिष्ट करें; यानी vim कमांड को आपके उदाहरण में 'base64 --decode' को तर्क के रूप में लेना चाहिए। – highsciguy

+0

दूसरे शब्दों में इसे फ़िल्टर कमांड के रूप में प्रभावी ढंग से करना चाहिए! केवल दृश्य चयन के लिए, लाइनों को पूरा नहीं करें। – highsciguy

+0

@ user429540: अब मैं देखता हूं। उस फ़िल्टरिंग आदेशों को लागू करने के प्रयास में लिखे गए मैपिंग्स को अद्यतन उत्तर सूचीबद्ध करें। –

3

आप दृश्य क्षेत्र के अंदर मैच के लिए \%V उपयोग कर सकते हैं:

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

धन्यवाद, यह काम करता है, हालांकि थोड़ा लंबा है। एक vmap lookk जैसा होगा जो शेल कमांड पैरामीटर के रूप में लेता है? – highsciguy

+1

.. और निश्चित रूप से मेरे उदाहरण में आदेश दृश्य चयन पर निर्भर नहीं है जो आम तौर पर मामला हो सकता है। तो मैं दृश्य चयन को आदेश के रूप में तर्क के रूप में कैसे पारित कर सकता हूं? – highsciguy

संबंधित मुद्दे