在elisp中匹配WORD的第一个字符
match the first character of WORD in elisp
我想找到一个 elisp 正则表达式,它只能找到 word(一组非空白字符)的第一个字符。
这是我的:
\(^\|\(:?\[[: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 中匹配 word 的第一个字符?
更一般的问题:在 elisp 中处理您不想捕获整个匹配项的情况的正确方法是什么?
可能最简单的正则表达式是先匹配单词边界再匹配单词字符:
"\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))
无法在 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)))
我想找到一个 elisp 正则表达式,它只能找到 word(一组非空白字符)的第一个字符。
这是我的:
\(^\|\(:?\[[: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 中匹配 word 的第一个字符?
更一般的问题:在 elisp 中处理您不想捕获整个匹配项的情况的正确方法是什么?
可能最简单的正则表达式是先匹配单词边界再匹配单词字符:
"\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))
无法在 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)))