我想要实现的是将视觉选择发送到外部程序而不影响缓冲区的内容.
例
让以下代码块表示当前缓冲区.设[<]表示视觉选择的开始,[>]表示结束.
This is not a test 1 [<]This is not[>] a test 2 This is not a test 3 This is not a test 4
由此我想将此文本发送到外部程序.例如:
:<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’并且不影响缓冲区内容的东西.
想法?
解决方法
范围总是线性的.
无论你做什么,每个接受范围的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>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。