2012-03-09 23 views
7

Tôi muốn lọc một lựa chọn trực quan trong Vim thông qua một lệnh. Con đường tôi biết luôn lọc các dòng hoàn toàn mà lựa chọn hình ảnh mở rộng:Vim chỉ lọc lựa chọn trực quan không phải toàn bộ dòng

Chọn a test trong dòng

this is a test 

và gõ

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

sẽ dẫn đến

the result 

Nhưng tôi muốn:

this is the result 
+1

có thể trùng lặp của "[Thi 'base64 --decode' trên một lựa chọn trong vim] (http://stackoverflow.com/questions/7845671/executing-base64-decode-on-a-selection-in -vim) ". –

Trả lời

3

Hãy xem xét các ánh xạ sau đó tuân thủ các hành vi của các ! linewise lệnh lọc (xem :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

Rất tốt! Xin lỗi vì câu hỏi của tôi không quá chính xác (ditto kev). Nó đã thực sự nhắm mục tiêu trường hợp chung nhất mà tôi muốn làm cả hai: 1) vượt qua việc lựa chọn trực quan đến một lệnh 2) xác định lệnh này trong vim bằng cách sử dụng các lệnh ngắn; tức là lệnh vim sẽ lấy 'base64 --decode' trong ví dụ của bạn làm đối số. – highsciguy

+0

Nói cách khác, nó nên thực hiện tương tự như lệnh lọc!, Chỉ dành cho lựa chọn trực quan, chứ không phải các dòng hoàn chỉnh. – highsciguy

+0

@ user429540: Bây giờ tôi thấy. Hãy xem câu trả lời cập nhật liệt kê các ánh xạ được viết để cố gắng triển khai các lệnh lọc đó. –

3

Bạn có thể sử dụng \%V để phù hợp với bên trong khu vực trực quan:

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

Cảm ơn, công trình này, là một chút dài tuy nhiên. Một vmap trông như thế nào sẽ lấy lệnh shell làm tham số? – highsciguy

+1

.. và tất nhiên trong ví dụ của tôi lệnh không phụ thuộc vào lựa chọn trực quan mà có thể nói chung là trường hợp. Vì vậy, làm thế nào tôi có thể vượt qua lựa chọn hình ảnh như là đối số cho lệnh? – highsciguy

Các vấn đề liên quan