对Vimscript递归错误的解决方案感到困惑

时间:2018-05-04 20:51:17

标签: python vim org-mode

我想使用gf打开.org个文件中的超链接文件名(我使用vim插件vim-orgmode):

enter image description here

我输入gf,文件应该打开。为了避免不得不超过前两个[[,我创建了以下脚本来完成这项工作:

function! GFOrg()
python << EOF
import vim  
try:
    filename=vim.eval("@%")
    if filename.endswith(".org"):
        line = vim.current.line
        linkstart=line.find("[[")
        if linkstart != -1:
            row, start = vim.current.window.cursor
            vim.current.window.cursor = row, linkstart+2
    vim.command("normal gf")
except Exception as e:
    print("Error: {}".format(e))
EOF
endfunction

现在,如果我将其映射到覆盖gf

nnoremap gf :call GFOrg()<CR>

我收到了一个递归错误:

enter image description here

但是如果我退出并重新打开Vim(实际上是MacVim),并使用gfgf作为我的映射,我只需输入gf(一次)就可以了。它可以正常工作:

nnoremap gfgf :call GFOrg()<CR>

任何人都可以解释为什么我不需要两次输入gf来映射到调用,以及为什么它会停止递归错误?

1 个答案:

答案 0 :(得分:4)

您正在使用:normal来调用gf,它会再次调用您的映射,这会导致递归。您应该使用:normal!来避免重新映射。

据说我们可以做得更好!

  • 应该是缓冲区本地映射
  • 仅将此映射应用于缓冲区'filetype'的{​​{1}}

将以下内容添加到org

~/.vim/after/ftplugin/org.vim