gpt4 book ai didi

shell - 如何在 vim 中将当前缓冲区或行作为 stdin 发送到 system()?

转载 作者:行者123 更新时间:2023-12-01 01:02:57 25 4
gpt4 key购买 nike

有 3 个密切相关的 vim 命令可让您调用外部程序:

  • :[range]!{filter-cmd} {arg} (前命令,:help :range!)
  • :[range]write !{cmd} (前命令,:help :w_c)
  • system({expr}, {arg}) (vimscript 函数, :help system() )

  • (我将 !:!cmd 作为 1 的一部分。)

    在我看来,存在三个重要区别:
  • [range]发送到标准输入中,标准输出替换 [range]
  • [range]发送到标准输入,标准输出被忽略
  • stdout 是 system() 的返回值,所以 stdout 可以作为 :let @a = system(..) 保存到一个变量中

  • 真的没有办法将当前缓冲区或当前行作为标准输入发送到外部命令并且可以不受限制地访问标准输出吗?

    如果您想编写,例如,需要解析行/缓冲区的复杂移动命令(解析最好不要用 vimscript 编写),这似乎非常令人惊讶。

    (尝试通过 {arg} 发送东西会很疯狂,原因有几个:1. 字符长度限制,2. 你必须在 vimscript* 中编写一个 shell 转义函数)

    这是我能找到的唯一其他相关问题。它将一个字符串变量作为 shell 参数发送到 (unix) 'echo',然后将它作为标准输入发送到您的程序: Can I pass a string as stdin to a system call from vim?

    *如果vim功能 shellescape()做你想做的,很好,但在 Windows 上,它甚至不能很好地保护来自 cmd.exe 的输入。来自 CommandLineToArgvW .事实上,在 Windows 上,vim 通过 cmd.exe 发送任何单个 shell 字符串。两次。

    最佳答案

    好吧,我在一个非常重要的细节上犯了错误:system({expr},{input}) 的第二个参数不被视为 shell 输入,而是作为标准输入发送。所以你会做这样的事情:

    :let stdin = join(getline(1,'$'), "\n")
    :let a = system('C:/main.exe',stdin)

    几乎所有 system(..) 的例子使用并警告 shell 转义,但这是针对 {expr}参数(如果 {expr} 不是动态字符串,则此转义问题要小得多)。

    关于shell - 如何在 vim 中将当前缓冲区或行作为 stdin 发送到 system()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21530456/

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