Vim фильтр только визуальный выбор, а не вся строка - PullRequest
8 голосов
/ 09 марта 2012

Я бы хотел отфильтровать визуальный выбор в Vim с помощью команды.То, как я знаю, всегда фильтрует целые строки, на которые распространяется визуальный выбор:

Выбор a test в строке

this is a test

и ввод

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

результат в

the result

Но я хочу:

this is the result

Ответы [ 2 ]

3 голосов
/ 10 марта 2012

Рассмотрим следующие сопоставления, которые соответствуют поведению ! команд фильтрации (см. :helpg \*!\* и :help v_!).

nnoremap <silent> <leader>! :set opfunc=ProgramFilter<cr>g@
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
3 голосов
/ 09 марта 2012

Вы можете использовать \%V для соответствия внутри визуальной области:

:'<,'>s/\%V.*\%V/\=system('echo -n "the result"')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...