2012-03-09 2 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 -정력)". –

답변

3

! 라인 방식 필터링 명령의 동작을 준수 다음과 같은 매핑을 고려 (: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

아주 좋습니다! 미안하지만 내 질문이 너무 정확하지 않았다. 실제로 나는 둘 다하고 싶은 가장 일반적인 경우를 목표로했습니다 : 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