我通过以下方式一起使用 Vim (8.0) 和 tmux (2.3):在 tmux session 中,我将一个窗口分成 2 个 Pane ,一个 Pane 在 Vim 中打开了一些文本文件,另一个 Pane 有一些程序我想向其发送文本行。一个典型的用例是将行从 Python 脚本发送到在另一个 Pane 中运行的 IPython session 。
我正在通过使用 python 的 Vim 脚本执行此操作,代码片段示例(假设目标 tmux Pane 为 0):
py import vim
python << endpython
cmd = "print 1+2"
vim_cmd = "silent !tmux send-keys -t 0 -l \"" + cmd + "\"" # -l for literal
vim.command(vim_cmd)
endpython
这很好用,除非 cmd
有一些必须转义的字符,比如 %
、#
、$
等。cmd
变量是从 Vim 中打开的文本文件的当前行读取的,因此我可以执行类似 cmd = cmd.replace('%', '\%')
等,但这有两个缺点:首先,我不知道所有必须转义的 vim 字符,所以到目前为止一直在反复试验,其次,字符 "
没有正确转义——在 Vim 获取的字符串中,"
就消失了,即使我执行 cmd = cmd.replace('"' , '\"')
。
那么,有没有一种通用的方法告诉 Vim 不解释任何东西,只获取原始字符串并按原样发送?如果不是,为什么 "
没有正确转义?
最佳答案
虚拟脚本
您正在寻找 shellescape()
函数。如果你使用 :!
Vim 命令,{special}
参数需要为 1。
silent execute '!tmux send-keys -t 0 -l ' . shellescape(cmd, 1)
但是由于您对(显示)shell 输出不感兴趣,并且不需要与启动的脚本交互,我会从 :!
切换到较低级别的 system()
命令。
call system('tmux send-keys -t 0 -l ' . shellescape(cmd))
python
使用 Python(而不是纯 Vimscript)没有任何好处(至少在您问题的小片段中)。相反,如果您将 Python cmd
变量嵌入到 Vimscript 表达式中,现在您还需要一个 Python 函数来将值转义为 Vimscript 字符串(类似于 '%s'"% str( cmd).replace("'", "''"))
)。或者,您可以在 Vim 变量中维护该值,并通过 vim.vars
从 Python 访问它。
关于python - 将文字字符串从 python-vim 脚本发送到 tmux Pane ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47632209/