Commit 4281f722 authored by Artur Malabarba's avatar Artur Malabarba

* 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:
"\\(  \\|[ ...][ ...]\\)".
parent faace42f
......@@ -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.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment