我想找到一个elisp正则表达式,它只找到单词的第一个字符(一组非空白字符)。
这就是我所拥有的:
\\(^\\|\\(:?\[[:space:]\]\\)\\)\[^\n[:space:]\]
它接近但不完全正确。 它捕获任何具有空格或位于行开头的非空白字符。但它也捕获了空白和行的开头。
我已经为特定的emacs方法编写了这个方法,该方法将elisp正则表达式作为参数,特别是avy - generic-jump。
这就是avy-generic-jump的样子:
'(avy--generic-jump REGEX WINDOW-FLIP STYLE &optional BEG END)'
这就是我现在所拥有的:
(avy--generic-jump "\\(?:^\\|\\(:?[[:space:]]\\)\\)[^\n[:space:]]" nil 'at))
主要问题:我可以做些什么来匹配elisp中单词的第一个字符?
更一般的问题:在你不想捕获整场比赛的情况下,处理elisp案件的正确方法是什么?
答案 0 :(得分:0)
最简单的正则表达式可能与单词边界匹配,然后是单词字符:
"\\b\\w"
使用isearch-forward-regexp
C-M-s \b\w
如果要考虑符号的边界,可以使用:
"\\_<\\w"
尝试
C-M-s \_<\w
像phils说的那样,它取决于avy--generic-jump
函数的作用。看起来它只是使用了Emacs Lisp函数re-search-forward
,所以我认为上面应该有用。
请注意,您需要在Emacs正则表达式中使用双斜杠。所以你的第一次尝试应该是:
(avy--generic-jump "\\(?:^\\|\\(:?[[:space:]]\\)\\)[^\n[:space:]]" nil 'at))
答案 1 :(得分:0)
尝试在emacs中创建新的零宽度断言是不可能的。你基本上需要环顾四周的支持。你可以试试这个patch,或者不那么突兀,建议使用avy - generic-jump函数将结果位置候选者调整一个。
这是一个让avy跳出来的例子。
(defun avy--regex-candidates (regex &optional beg end pred group)
"Return all elements that match REGEX.
Each element of the list is ((BEG . END) . WND)
When PRED is non-nil, it's a filter for matching point positions.
When GROUP is non-nil, (BEG . END) should delimit that regex group."
(setq group (or group 0))
(let ((case-fold-search (or avy-case-fold-search
(string= regex (downcase regex))))
candidates)
(avy-dowindows current-prefix-arg
(dolist (pair (avy--find-visible-regions
(or beg (window-start))
(or end (window-end (selected-window) t))))
(save-excursion
(goto-char (car pair))
(while (re-search-forward regex (cdr pair) t)
(unless (get-char-property (1- (point)) 'invisible)
(when (or (null pred)
(funcall pred))
(push (cons (cons (1+ (match-beginning group))
(1+ (match-end group)))
wnd) candidates)))))))
(nreverse candidates)))