将视觉选择发送到外部程序而不影响缓冲区

时间:2014-09-30 15:19:10

标签: vim

我想要实现的是将视觉选择发送到外部程序而不影响缓冲区的内容。

实施例

让以下代码块表示当前缓冲区。设[<]表示视觉选择的开始,[>]表示结束。

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;并且不会影响缓冲区的内容。

想法?

2 个答案:

答案 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>

也是您的use of cat is useless

:[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