似乎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)
如果您使用单引号,您需要的是用两个单引号替换每个单引号.像这样的东西:
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)
| 归档时间: |
|
| 查看次数: |
757 次 |
| 最近记录: |