Regex Emacs Lisp和非确定性正则表达式
最近我花了太多时间调试Emacs中的一些自动完成模式功能,这个功能似乎是不确定的,让我完全困惑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
(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
帮助?您应该在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))