【发布时间】:2014-01-16 14:54:59
【问题描述】:
我最近花了太多时间尝试在 Emacs 中调试一些自动完成模式功能,这个功能似乎是不确定的,让我完全困惑。
(re-search-backward "\\(\\sw\\|\\s_\\|\\s\\.\\|\\s\\\\|[#@|]\\)\\=")
该命令在 while 循环中调用,从当前点向后搜索以找到应自动完成的完整“单词”。供参考,the actual code。
一些背景知识和我的调查
我一直在尝试为 Javascript 设置自动完成功能,使用 slime 连接到 Node.js 后端。
连接到 Node.js 后端的 Slime REPL 中的自动完成功能非常完美,
连接到 Slime 的 js2 模式缓冲区内的自动完成无法从 slime 中查找完成。在这张图片中,您可以看到它回退到缓冲区中已经存在的单词。
我已经追踪到 Slime 的 slime-beginning-of-symbol 函数。
假设我正在尝试完成fs.ch,其中fs 是必需的并且已经在范围内,该点位于h 字符之后。
在 slime repl 缓冲区中,开始函数将点一直向后移动,直到它遇到空格并匹配 fs.ch。
在 js2-mode 缓冲区中,开始函数仅将点移动到点字符并仅匹配 ch。
重现问题
我一直在通过evaling (re-search-backward "\\(\\sw\\|\\s_\\|\\s\\.\\|\\s\\\\|[#@|]\\)\\=") 在各种缓冲区中反复进行测试。对于所有示例,该点从行尾开始并向后移动,直到搜索失败。
- 在暂存缓冲区
fs.ch中,该点以c结束。 - 在 slime repl
fs.ch中,该点结束于f。 - 在 js2 模式缓冲区
fs.ch中,该点在c上结束。 - 在 emacs-lisp-mode 缓冲区
fs.ch中,该点以f结束。
我不知道为什么会这样
我将假设在这些模式中有些东西会设置或取消设置全局正则表达式 var,然后产生这种效果,但到目前为止我无法找到或暗示任何东西。
我什至追查到了emacs c code,但那时我意识到我完全不知所措并决定寻求帮助。
帮助?
【问题讨论】:
-
Emacs 正则表达式中的
\sCODE匹配语法为CODE的任何字符。语法表可以并且将在缓冲区之间变化(语法表通常由主要模式建立)。见C-h i g (elisp) Regexp Backslash RET -
我认为你的问题是
.在这些缓冲区中有不同的语法。您可以在各自的缓冲区中检查M-x describe-syntax。也许,您需要modify-syntax-entry来纠正这个问题。也许,您需要一个使用make-syntax-table创建的临时语法表,它继承了主要模式的标准。 -
就是这样。我在#emacs 中提出了这个问题,他们也这么说。我以前不知道语法表。