python - 对 Vimscript 递归错误的解决方案感到困惑
问题描述
我想用来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
to call gf
which 将再次调用您导致递归的映射。您应该使用:normal!
以避免重新映射。
话虽如此,我们可以做得更好!
- 应该是缓冲区本地映射
- 仅将此映射应用于缓冲区
'filetype'
的org
将以下内容添加到~/.vim/after/ftplugin/org.vim
:
nnoremap <buffer> gf :call search('\[\[.', 'bce', line('.'))<cr>gf
推荐阅读
- c++ - 在 c++11 中,是否有必要为移动分配大对象的函数提供右值覆盖?
- java - 如何在我的应用程序中停止随机数生成器而不使应用程序冻结
- javascript - Jest - 未导出的模拟函数
- java - wait() 和 notify() 在文件读写时没有按预期工作
- perl - 如何使 CPAN::Meta::Spec 的“先决条件”需要分发而不是包?
- node.js - 无法从“node_modules\react-native-svg\elements\Text.js”解析“../lib/util”
- events - Infragistics UltraGrid 组更改事件
- user-accounts - 有人支持 RISC 或 SecEvents 规范吗?
- spring-mvc - 如果表单动作属性中没有定义@RequestMapping("/someAction"),Spring mvc如何知道该怎么做
- android - 无法在设备上加载 APK,因为不存在的模拟器在 Android Studio 3.3 中出现和消失