似乎vims python sripting旨在编辑缓冲区和文件,而不是与vims寄存器很好地协同工作。你可以使用一些vim包命令来访问寄存器,但它并不漂亮。
我使用使用寄存器的python创建vim函数的解决方案 是这样的。
function printUnnamedRegister()
python <<EOF
print vim.eval('@@')
EOF
endfunction
使用
之类的东西也可以设置寄存器function setUnnamedRegsiter()
python <<EOF
s = "Some \"crazy\" string\nwith interesting characters"
vim.command('let @@="%s"' % myescapefn(s) )
EOF
endfunction
然而,这感觉有点麻烦,我不确定myescapefn到底应该是什么。 所以我从来没有能够让设置版本正常工作。
所以,如果有办法做更像
的事情function printUnnamedRegister()
python <<EOF
print vim.getRegister('@')
EOF
endfunction
function setUnnamedRegsiter()
python <<EOF
s = "Some \"crazy\" string\nwith interesting characters"
vim.setRegister('@',s)
EOF
endfunction
甚至可以使用myescapefn的漂亮版本,这样会非常方便。
更新:
根据ZyX的解决方案我正在使用这段python
def setRegister(reg, value):
vim.command( "let @%s='%s'" % (reg, value.replace("'","''") ) )
答案 0 :(得分:6)
如果您使用单引号,您需要的是用两个单引号替换每个单引号。 这样的事情:
python import vim, re
python def senclose(str): return "'"+re.sub(re.compile("'"), "''", str)+"'"
python vim.command("let @r="+senclose("string with single 'quotes'"))
更新:此方法在很大程度上依赖于(未记录的)功能之间的差异
let abc='string
with newline'
和
execute "let abc='string\nwith newline'"
:第一个失败时第二个成功(并且它不是:execute
中的换行处理与普通文件之间差异的唯一示例)。另一方面,由于eval()
返回与string("string\nwith newline")
完全相同的事情,因此senclose
会更期望处理此问题,因此我现在仅使用vim.eval
来编写此内容:< / p>
python senclose = lambda str: "'"+str.replace("'", "''")+"'"
python vim.eval("setreg('@r', {0})".format(senclose("string with single 'quotes'")))