Concerning factorization, couldn't one use [\n\r] in all cases rather
than a switch based on some input argument ?
It should be possible, but it slightly changes the behavior of file-local variables. I wouldn't expect anything to break though.
I was also wondering whether it is not possible to have a single regexp
for the whole Local Variable section. The following `doit' function is a
trial to do so. `M-x doit' will seach forward the whole Local Variables
section and display "ok" if found, "nak" otherwise.
(defun doit ()
(interactive)
(let* ((eol "\\(\r\n?\\|\n\\)")
(eol-again "\\1")
(space-maybe "[ \t]*")
;; suffix may be the empty string
(suffix "\\([^ \r\n]+\\(?:[^\r\n]*[^ \r\n]\\)?\\|\\)")
(prefix "\\([ \t]*[^ \r\n]+\\(?:[^\r\n]*[^ \r\n]\\)?\\)")
(prefix-again "\\2")
(suffix-again "\\3")
(symbol: "\\(?:\\(?:[^][()'\" \t\r\n]\\|\\\\[][()'\" \t]\\)+[ \t]*:\\)")
(sexp (concat "\\(?:" (substring prefix 2))))
(message (if (and (re-search-forward
(concat eol
prefix space-maybe "Local Variables:" space-maybe suffix space-maybe eol-again
"\\(?:" prefix space-maybe symbol: sexp space-maybe suffix-again space-maybe eol-again "\\)*"
prefix space-maybe "End:" space-maybe suffix space-maybe "\\(" eol-again "\\)?"
)
nil t)
;; when the tailing eol is not there we must be at EOB.
(or (match-string 3) (eobp)))
"ok" "nak"))))
Looks good. Consider using `rx' for complex regexes, in my experiences it increases readability a lot.