Regex Emacs Lisp和非确定性正则表达式

Regex Emacs Lisp和非确定性正则表达式,regex,emacs,elisp,Regex,Emacs,Elisp,最近我花了太多时间调试Emacs中的一些自动完成模式功能,这个功能似乎是不确定的,让我完全困惑 (re-search-backward "\\(\\sw\\|\\s_\\|\\s\\.\\|\\s\\\\|[#@|]\\)\\=") 该命令在while循环中调用,从当前点向后搜索,以查找应自动完成的完整“单词”。供参考 一点背景和我的调查 我一直在尝试为Javascript设置自动完成,使用slime连接到Node.js后端 连接到Node.js后端的Slime REPL中的Autocomp

最近我花了太多时间调试Emacs中的一些自动完成模式功能,这个功能似乎是不确定的,让我完全困惑

 (re-search-backward "\\(\\sw\\|\\s_\\|\\s\\.\\|\\s\\\\|[#@|]\\)\\=")
该命令在while循环中调用,从当前点向后搜索,以查找应自动完成的完整“单词”。供参考

一点背景和我的调查 我一直在尝试为Javascript设置自动完成,使用slime连接到Node.js后端

连接到Node.js后端的Slime REPL中的Autocomplete是完美的

连接到Slime的js2模式缓冲区中的Autocomplete无法从Slime中查找完成。在这幅图中,您可以看到它返回到缓冲区中已经存在的单词

我已经找到了Slime的功能

假设我正在尝试完成
fs.ch
,其中
fs
是必需的,并且已经在范围内,该点位于
h
字符之后

在slime repl缓冲区中,开始函数将点一直向后移动,直到它碰到空白并匹配
fs.ch

在js2模式缓冲区中,开始函数仅将点移动到点字符,并仅匹配
ch

重现问题 我一直在通过
eval
ing
(在各种缓冲区中反复向后搜索“\\(\\sw\\\\\\s\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\=”
来测试这一点。对于所有示例,该点从线的末端开始,并向后移动,直到搜索失败

  • 在暂存缓冲区
    fs.ch
    中,点在
    c
    上结束
  • 在slime repl
    fs.ch
    中,点在
    f
    上结束
  • 在js2模式缓冲区
    fs.ch
    中,点在
    c
    上结束
  • 在emacs lisp模式缓冲区
    fs.ch
    中,点在
    f
    上结束
我不知道为什么会这样 我将假设在这些模式中有某种东西,设置或取消设置一个全局正则表达式var,然后产生这种效果,但到目前为止,我无法找到或暗示任何东西

我甚至把这件事追查到了医院,但那时我意识到我完全不知所措,决定寻求帮助


帮助?您应该在regexp中将
\\s\\.
替换为
\\s.

我通过重新定义添加到auto complete的
交流源中的源来“修复”问题

我仍在学习如何使用elisp,因此这可能是实现我所需的最像黑客的方法,但它很有效

我将正则表达式更改为:

\\(\\sw\\|\\s_\\|\\s\\.\\|\\s\\\\|[#@|]\\)\\=

(请注意将
\\s\\.\
更改为
\\s.\\\

然后覆盖my init.el中的自动完成设置。(当我真正了解elisp时,我可能会找到上百种方法来改进它)

(defun js slime符号的开头()
“移动到点处CL样式符号的开头。”
(同时(向后重新搜索“\\(\\sw\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\s.\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\=”
(当(>(点)2000)((点)2000))
t) )

(在Emacs regexp中向前搜索“\\=\\\\\\\\\\\[-+。
\sCODE
与语法为
code
的任何字符匹配。语法表在缓冲区之间可以也将有所不同(语法表通常由主模式建立)。请参阅
C-h i g(elisp)Regexp Backslash RET
我认为您的问题是
在这些缓冲区中有不同的语法。您可以在相应的缓冲区中使用
M-x descripe syntax
进行检查。可能,您需要
修改语法条目
来更正此问题。可能,您需要使用
生成语法表
创建一个临时语法表继承了主模式的标准。就是这样。我在#emacs中提出了这个问题,他们也这么说。我以前不知道语法表。
\\(\\sw\\|\\s_\\|\\s.\\|\\s\\\\|[#@|]\\)\\=
(defun js-slime-beginning-of-symbol ()
  "Move to the beginning of the CL-style symbol at point."
  (while (re-search-backward "\\(\\sw\\|\\s_\\|\\s.\\|\\s\\\\|[#@|]\\)\\="
                             (when (> (point) 2000) (- (point) 2000))
                             t))
  (re-search-forward "\\=#[-+.<|]" nil t)
  (when (and (looking-at "@") (eq (char-before) ?\,))
    (forward-char)))

(defun js-slime-symbol-start-pos ()
  "Return the starting position of the symbol under point.
The result is unspecified if there isn't a symbol under the point."
  (save-excursion (js-slime-beginning-of-symbol) (point)))

(defvar ac-js-source-slime-simple
  '((init . ac-slime-init)
    (candidates . ac-source-slime-simple-candidates)
    (candidate-face . ac-slime-menu-face)
    (selection-face . ac-slime-selection-face)
    (prefix . js-slime-symbol-start-pos)
    (symbol . "l")
    (document . ac-slime-documentation)
    (match . ac-source-slime-case-correcting-completions))
  "Source for slime completion.")

(defun set-up-slime-js-ac (&optional fuzzy)
  "Add an optionally-fuzzy slime completion source to `ac-sources'."
  (interactive)
  (add-to-list 'ac-sources ac-js-source-slime-simple))