在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)))