diff options
author | Artur Malabarba <bruce.connor.am@gmail.com> | 2015-10-28 15:03:47 +0000 |
---|---|---|
committer | Artur Malabarba <bruce.connor.am@gmail.com> | 2015-10-28 15:40:23 +0000 |
commit | 4281f722dd782d91f4b2bbd03834cbd1d944db5c (patch) | |
tree | 280599df8bf6d01f77debaf922e39e581be8ae78 /lisp | |
parent | faace42f8a4c8f53f629419ba89a5196d62ee006 (diff) | |
download | emacs-4281f722dd782d91f4b2bbd03834cbd1d944db5c.tar.gz |
* lisp/character-fold.el: Make compatible with lax-whitespace
(character-fold-to-regexp): Rework internals to play nice with
lax-whitespacing.
When the user types a space, we want to match the table entry for
?\s, which is generally a regexp like "[ ...]". However, the
`search-spaces-regexp' variable doesn't "see" spaces inside these
regexp constructs, so we need to use "\\( \\|[ ...]\\)" instead (to
manually expose a space).
Furthermore, the lax search engine acts on a bunch of spaces, not
on individual spaces, so if the string contains sequential spaces
like " ", we need to keep them grouped together like this:
"\\( \\|[ ...][ ...]\\)".
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/character-fold.el | 30 |
1 files changed, 26 insertions, 4 deletions
diff --git a/lisp/character-fold.el b/lisp/character-fold.el index 6b242f45f4e..521e98b35c1 100644 --- a/lisp/character-fold.el +++ b/lisp/character-fold.el @@ -107,10 +107,32 @@ Any character in STRING that has an entry in `character-fold-table' is replaced with that entry (which is a regexp) and other characters are `regexp-quote'd." - (apply #'concat - (mapcar (lambda (c) (or (aref character-fold-table c) - (regexp-quote (string c)))) - string))) + (let* ((spaces 0) + (chars (mapcar #'identity string)) + (out chars)) + ;; When the user types a space, we want to match the table entry, + ;; but we also want the ?\s to be visible to `search-spaces-regexp'. + ;; See commit message for a longer description. + (while chars + (let ((c (car chars))) + (setcar chars + (cond + ((eq c ?\s) + (setq spaces (1+ spaces)) + nil) + ((> spaces 0) + (prog1 (format "\\(?:%s\\|%s\\)%s" + (make-string spaces ?\s) + (apply #'concat + (make-list spaces + (or (aref character-fold-table ?\s) " "))) + (or (aref character-fold-table c) + (regexp-quote (string c)))) + (setq spaces 0))) + (t (or (aref character-fold-table c) + (regexp-quote (string c)))))) + (setq chars (cdr chars)))) + (apply #'concat out))) ;;; Commands provided for completeness. |