python - 将文字字符串从 python-vim 脚本发送到 tmux Pane

标签 python vim tmux

我通过以下方式一起使用 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/

相关文章:

python - 使用预训练的权重和偏差预测自己的图像无法正常工作

python - 用列表分隔字符串

python - 如何在不使用任何排序命令参数的情况下进行下降排序

带有 tmux 发送 key 的 BASH 函数

tmux - 创建或附加 Byobu 默认窗口

python - 最好区分字符串中的文件和目录路径

unix - Vim 在由 Expect 生成的 ssh session 中行为不正常

comments - 如何让 vim 为新文件添加标题注释?

vim - 如何让 Vim 继续要点?

linux - 如何在登录时运行命令并将其显示在控制台中?