最近我花了太多时间来调试Emacs中的自动完成模式功能,这个函数似乎是不确定性的,让我彻底困惑了。
(re-search-backward "\\(\\sw\\|\\s_\\|\\s\\.\\|\\s\\\\|[#@|]\\)\\=")
命令在while循环中调用,向后搜索以找到应该自动完成的完整“单词”。供参考,实际代码。
一些背景和我的调查
我一直在尝试使用slime连接到Node.js后端来设置Javascript的自动完成。
在连接到Node.js后端的Slime REPL中进行自动完成非常完美,
在js2-mode缓冲区内使用自动完成功能,与Slime连接后无法查找来自slime的补全。在这张图片中,您可以看到它退回到已经存在于缓冲区中的单词。
我已经追踪到这个问题是由Slime的slime-beginning-of-symbol函数引起的。
假设我正在尝试完成fs.ch
,其中fs
已经被要求并且已经在范围内,在字符h
之后找到该点。
在slime repl缓冲区中,beginning函数将点向后移动,直到它遇到空格并匹配fs.ch
。
在js2-mode缓冲区中,beginning函数仅将点移动到点字符,并仅匹配ch
。
重现问题
我一直在各种缓冲区中通过eval
(re-search-backward "\\(\\sw\\|\\s_\\|\\s\\.\\|\\s\\\\|[#@|]\\)\\=")
来反复测试。对于所有示例,点都从行末开始向后移动,直到搜索失败。
- 在scratch缓冲区
fs.ch
中,光标停在c
上。 - 在slime repl
fs.ch
中,光标停在f
上。 - 在js2-mode缓冲区
fs.ch
中,光标停在c
上。 - 在emacs-lisp-mode缓冲区
fs.ch
中,光标停在f
上。
我不知道为什么会发生这种情况
我猜测这些模式中有些东西设置或取消了全局正则表达式变量,然后产生了这个效果,但到目前为止,我一直无法找到或证明任何东西。
我甚至追踪到了emacs c code,但那时我意识到我已经完全超出了自己的能力范围,决定寻求帮助。
\sCODE
匹配任何语法为CODE
的字符。语法表可以在缓冲区之间变化(语法表通常由主模式建立)。请参阅C-h i g (elisp) Regexp Backslash RET
。 - phils