加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 22:10:15 所属栏目:安全 来源:网络整理
导读:我想要实现的是将视觉选择发送到外部程序而不影响缓冲区的内容. 例 让以下代码块表示当前缓冲区.设[]表示视觉选择的开始,[]表示结束. This is not a test 1[]This is not[] a test 2This is not a test 3This is not a test 4 由此我想将此文本发送到外部程
我想要实现的是将视觉选择发送到外部程序而不影响缓冲区的内容.

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

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>

还有你的use of cat is useless:

:[range]w ! cat | <some shell command>

应该:

:[range]w ! <some shell command>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读