我想要实现的是将视觉选择发送到外部程序而不影响缓冲区的内容。
让以下代码块表示当前缓冲区。设[<]表示视觉选择的开始,[>]表示结束。
This is not a test 1
[<]This is not[>] a test 2
This is not a test 3
This is not a test 4
由此我想将此文本发送到外部程序。 e.g:
:<some vim command>!<some shell command>
几乎可行的解决方案是:
:[range]w ! cat | <some shell command>
这适用于按行发送内容。例如:
:%w ! wc -l # produces --> '4'
:2,3w ! wc -l # produces --> '2'
:2w ! wc -w # produces --> '6'
但是,使用上面的示例缓冲区:
:'<,'>w ! wc -w # produces --> '6'
但是我想要一些可以产生&#3;&#39;并且不会影响缓冲区的内容。
想法?
答案 0 :(得分:8)
范围总是行。
无论您做什么,每个接受范围的Ex命令都总是将'<
作为开始行 并且'>
为结束行 。
将非线性选择传递给外部程序的方法如下:
system()
并输出结果这是一个函数:
function! VisualCountWords() range
let n = @n
silent! normal gv"ny
echo "Word count:" . system("echo '" . @n . "' | wc -w")
let @n = n
" bonus: restores the visual selection
normal! gv
endfunction
您可以在这样的映射中使用:
xnoremap <F6> :call VisualCountWords()<CR>
:[range]w ! cat | <some shell command>
应该是:
:[range]w ! <some shell command>
答案 1 :(得分:1)
select...
<esc>
:exe '!echo '.string(lh#visual#selection()).' | wc -w'
似乎可以做到这一点。
lh#visual#selection()
来自lh-vim-lib