作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有 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]
发送到标准输入,标准输出被忽略 system()
的返回值,所以 stdout 可以作为 :let @a = system(..)
保存到一个变量中{arg}
发送东西会很疯狂,原因有几个:1. 字符长度限制,2. 你必须在 vimscript* 中编写一个 shell 转义函数)
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/
我是一名优秀的程序员,十分优秀!