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

Python 对Vimscript递归错误的解决方案感到困惑,python,vim,org-mode,Python,Vim,Org Mode,我想使用gf打开.org文件中的超链接文件名(我使用vim插件): 我键入gf,文件应该打开。为了避免超过前两个[[,我创建了以下脚本来执行此任务: function! GFOrg() python << EOF import vim try: filename=vim.eval("@%") if filename.endswith(".org"): line = vim.current.line linkstart=line.f

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

我键入
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
我得到一个递归错误:

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

nnoremap gfgf :call GFOrg()<CR>
nnoremap gfgfgf:call GFOrg()

有人能解释一下为什么我不需要键入两次
gf
来映射到调用,以及为什么它会停止递归错误吗?

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

那就是说我们可以做得更好

  • 应该使用缓冲区本地映射吗
  • 仅将此映射应用于
    组织的
    'filetype'
将以下内容添加到
~/.vim/after/ftplugin/org.vim

nnoremap <buffer> gf :call search('\[\[.', 'bce', line('.'))<cr>gf 
nnoremap gf:call search('\[\[.','bce',line('.')gf

噢,该死,我试过
normal!gf
没有意识到空间的重要性。我想给你两张改进方案的投票,但只能给你一张。我将把答案留给任何人,谁能解释为什么
gfgf
gf
无关:如果你在一行上有两个链接,并且要打开第二个吗?我将更新脚本以覆盖该用例,以便它从游标进行搜索:
linkstart=line.find(“[[”,vim.current.window.cursor[1]-1)
nnoremap <buffer> gf :call search('\[\[.', 'bce', line('.'))<cr>gf