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

Mic*_*son 10 python vim

似乎vims python sripting旨在编辑缓冲区和文件,而不是与vims寄存器很好地协同工作.你可以使用一些vim包命令来访问寄存器,但它并不漂亮.

我使用python创建一个使用寄存器的vim函数的解决方案是这样的.

function printUnnamedRegister()
python <<EOF
print vim.eval('@@')
EOF
endfunction
Run Code Online (Sandbox Code Playgroud)

使用类似的东西也可以设置寄存器

function setUnnamedRegsiter()
python <<EOF
s = "Some \"crazy\" string\nwith interesting characters"
vim.command('let @@="%s"' % myescapefn(s) )
EOF
endfunction
Run Code Online (Sandbox Code Playgroud)

然而,这感觉有点麻烦,我不确定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
Run Code Online (Sandbox Code Playgroud)

或者甚至可以使用myescapefn的漂亮版本,这将非常方便.

更新:

根据ZyX的解决方案,我正在使用这段python

def setRegister(reg, value):
  vim.command( "let @%s='%s'" % (reg, value.replace("'","''") ) )
Run Code Online (Sandbox Code Playgroud)

ZyX*_*ZyX 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'"))
Run Code Online (Sandbox Code Playgroud)

更新:此方法在很大程度上依赖于(未记录的)功能之间的区别

let abc='string
with newline'
Run Code Online (Sandbox Code Playgroud)

execute "let abc='string\nwith newline'"
Run Code Online (Sandbox Code Playgroud)

:第一次失败时第二次成功(并且它不是新行处理:execute和普通文件之间差异的单一示例).另一方面,eval()由于string("string\nwith newline")返回的内容完全相同senclose,因此更期望处理此问题,因此我现在只使用以下内容编写此内容vim.eval:

python senclose = lambda str: "'"+str.replace("'", "''")+"'"
python vim.eval("setreg('@r', {0})".format(senclose("string with single 'quotes'")))
Run Code Online (Sandbox Code Playgroud)

  • 稍微整洁的是:vim.command("让@r ='%s'"%arg.replace("'","''")) (3认同)