gpt4 book ai didi

vim - 在不影响缓冲区的情况下将视觉选择发送到外部程序

转载 作者:行者123 更新时间:2023-12-04 13:54:35 24 4
gpt4 key购买 nike

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

例子

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

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>

    关于vim - 在不影响缓冲区的情况下将视觉选择发送到外部程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26124424/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com