对 Vimscript 递归错误的解决方案感到困惑
Baffled by solution to Vimscript recursion error
我想使用 gf
打开 .org
个文件中的超链接文件名(我使用 vim 插件 vim-orgmode):
我输入 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>
我得到一个递归错误:
但是如果我退出并重新打开 Vim(实际上是 MacVim),并使用 gfgf
作为我的映射,我可以只键入 gf
(一次)然后它工作正常:
nnoremap gfgf :call GFOrg()<CR>
谁能解释为什么我不需要输入两次 gf
来映射到调用,以及为什么它会停止递归错误?
您正在使用 :normal
调用 gf
,这将再次调用您映射,这会导致递归。您应该使用 :normal!
以避免重新映射。
也就是说我们可以做得更好!
- 应该是缓冲区本地映射
- 仅将此映射应用于
org
的 'filetype'
缓冲区
将以下内容添加到 ~/.vim/after/ftplugin/org.vim
:
nnoremap <buffer> gf :call search('\[\[.', 'bce', line('.'))<cr>gf
我想使用 gf
打开 .org
个文件中的超链接文件名(我使用 vim 插件 vim-orgmode):
我输入 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>
我得到一个递归错误:
但是如果我退出并重新打开 Vim(实际上是 MacVim),并使用 gfgf
作为我的映射,我可以只键入 gf
(一次)然后它工作正常:
nnoremap gfgf :call GFOrg()<CR>
谁能解释为什么我不需要输入两次 gf
来映射到调用,以及为什么它会停止递归错误?
您正在使用 :normal
调用 gf
,这将再次调用您映射,这会导致递归。您应该使用 :normal!
以避免重新映射。
也就是说我们可以做得更好!
- 应该是缓冲区本地映射
- 仅将此映射应用于
org
的
'filetype'
缓冲区
将以下内容添加到 ~/.vim/after/ftplugin/org.vim
:
nnoremap <buffer> gf :call search('\[\[.', 'bce', line('.'))<cr>gf