你可以在vim中从python函数访问寄存器吗?

时间:2010-04-23 00:29:59

标签: python vim

似乎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("'","''") ) )

1 个答案:

答案 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'")))