我想使用gf打开.org文件中的超链接文件名(我使用vim插件vim-orgmode):
python - 对Vimscript递归错误的解决方案感到困惑-LMLPHP
我输入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

现在,如果我将其映射到overridegf
nnoremap gf :call GFOrg()<CR>

我得到一个递归错误:
python - 对Vimscript递归错误的解决方案感到困惑-LMLPHP
但如果我退出并重新打开Vim(实际上是MacVim),并使用gfgf作为映射,我只需键入gf(一次),它就可以正常工作:
nnoremap gfgf :call GFOrg()<CR>

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

最佳答案

您正在使用:normal调用gf,这将再次调用导致递归的映射。您应该使用:normal!来避免重新映射。
有人说我们可以做得更好!
应该是缓冲区本地映射
仅将此映射应用于缓冲区
'filetype'中添加以下内容:

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

10-07 15:06