代码之家  ›  专栏  ›  技术社区  ›  Michael Anderson

可以从vim中的python函数访问寄存器吗

  •  10
  • Michael Anderson  · 技术社区  · 14 年前

    似乎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 回复  |  直到 12 年前
        1
  •  6
  •   ZyX    12 年前

    如果你使用单引号,你所需要的就是用两个单引号替换每一个单引号。 像这样的:

    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 :

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