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

beq87vna  于 2022-11-21  发布在  Python
关注(0)|答案(1)|浏览(133)

看起来vimspythonspripting是设计来编辑缓冲区和文件的,而不是很好地与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("'","''") ) )
2g32fytz

2g32fytz1#

如果你使用单引号,你所需要做的就是用两个单引号替换每一个出现的单引号。

python import vim, re
python def senclose(str): return "'"+re.sub(re.compile("'"), "''", str)+"'"
python vim.command("let @r="+senclose("string with single 'quotes'"))

Update:此方法严重依赖于(未记录的)功能之间的差异

let abc='string
with newline'

execute "let abc='string\nwith newline'"

:第一个失败,第二个成功(这不是: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'")))

相关问题