Function: cperl-beautify-regexp-piece
cperl-beautify-regexp-piece is a byte-compiled function defined in
cperl-mode.el.gz.
Signature
(cperl-beautify-regexp-piece B E EMBED LEVEL)
Documentation
Beautify part of a regexp from B to E.
If EMBED is nil, process the whole regular expression. Recurse to depth LEVEL.
Source Code
;; Defined in /usr/src/emacs/lisp/progmodes/cperl-mode.el.gz
(defun cperl-beautify-regexp-piece (b e embed level)
"Beautify part of a regexp from B to E.
If EMBED is nil, process the whole regular expression. Recurse to depth
LEVEL."
;; b is before the starting delimiter, e before the ending
;; e should be a marker, may be changed, but remains "correct".
;; The REx is guaranteed to have //x
;; position at enter and at leave is not defined
(let (s c tmp (m (make-marker)) (m1 (make-marker)) c1 spaces inline pos)
(if embed
(progn
(goto-char b)
(setq c (if (eq embed t) (current-indentation) (current-column)))
(cond ((looking-at "(\\?\\\\#") ; (?#) wrongly commented when //x-ing
(forward-char 2)
(delete-char 1)
(forward-char 1))
((looking-at "(\\?[^a-zA-Z]")
(forward-char 3))
((looking-at "(\\?") ; (?i)
(forward-char 2))
(t
(forward-char 1))))
(goto-char (1+ b))
(setq c (1- (current-column))))
(setq c1 (+ c (or cperl-regexp-indent-step cperl-indent-level)))
(or (looking-at "[ \t]*[\n#]")
(progn
(insert "\n")))
(goto-char e)
(beginning-of-line)
(if (re-search-forward "[^ \t]" e t)
(progn ; Something before the ending delimiter
(goto-char e)
(delete-horizontal-space)
(insert "\n")
(cperl-make-indent c)
(set-marker e (point))))
(goto-char b)
(end-of-line 2)
(while (< (point) (marker-position e))
(beginning-of-line)
(setq s (point)
inline t)
(skip-chars-forward " \t")
(delete-region s (point))
(cperl-make-indent c1)
(while (and
inline
(looking-at
(concat "\\([a-zA-Z0-9]+[^*+{?]\\)" ; 1 word
"\\|" ; Embedded variable
"\\$\\([a-zA-Z0-9_]+\\([[{]\\)?\\|[^\n \t)|]\\)" ; 2 3
"\\|" ; $ ^
"[$^]"
"\\|" ; simple-code simple-code*?
"\\(\\\\.\\|[^][()#|*+?$^\n]\\)\\([*+{?]\\??\\)?" ; 4 5
"\\|" ; Class
"\\(\\[\\)" ; 6
"\\|" ; Grouping
"\\((\\(\\?\\)?\\)" ; 7 8
"\\|" ; |
"\\(|\\)"))) ; 9
(goto-char (match-end 0))
(setq spaces t)
(cond ((match-beginning 1) ; Alphanum word + junk
(forward-char -1))
((or (match-beginning 3) ; $ab[12]
(and (match-beginning 5) ; X* X+ X{2,3}
(eq (preceding-char) ?\{)))
(forward-char -1)
(forward-sexp 1))
((and ; [], already syntaxified
(match-beginning 6)
cperl-regexp-scan
cperl-use-syntax-table-text-property)
(forward-char -1)
(forward-sexp 1)
(or (eq (preceding-char) ?\])
(error "[]-group not terminated"))
(re-search-forward
"\\=\\([*+?]\\|{[0-9]+\\(,[0-9]*\\)?}\\)\\??" e t))
((match-beginning 6) ; []
(setq tmp (point))
(if (looking-at "\\^?\\]")
(goto-char (match-end 0)))
;; XXXX POSIX classes?!
(while (and (not pos)
(re-search-forward "\\[:\\|\\]" e t))
(if (eq (preceding-char) ?:)
(or (re-search-forward ":\\]" e t)
(error "[:POSIX:]-group in []-group not terminated"))
(setq pos t)))
(or (eq (preceding-char) ?\])
(error "[]-group not terminated"))
(re-search-forward
"\\=\\([*+?]\\|{[0-9]+\\(,[0-9]*\\)?}\\)\\??" e t))
((match-beginning 7) ; ()
(goto-char (match-beginning 0))
(setq pos (current-column))
(or (eq pos c1)
(progn
(delete-horizontal-space)
(insert "\n")
(cperl-make-indent c1)))
(setq tmp (point))
(forward-sexp 1)
;; (or (forward-sexp 1)
;; (progn
;; (goto-char tmp)
;; (error "()-group not terminated")))
(set-marker m (1- (point)))
(set-marker m1 (point))
(if (= level 1)
(if (progn ; indent rigidly if multiline
;; In fact does not make a lot of sense, since
;; the starting position can be already lost due
;; to insertion of "\n" and " "
(goto-char tmp)
(search-forward "\n" m1 t))
(indent-rigidly (point) m1 (- c1 pos)))
(setq level (1- level))
(cond
((not (match-beginning 8))
(cperl-beautify-regexp-piece tmp m t level))
((eq (char-after (+ 2 tmp)) ?\{) ; Code
t)
((eq (char-after (+ 2 tmp)) ?\() ; Conditional
(goto-char (+ 2 tmp))
(forward-sexp 1)
(cperl-beautify-regexp-piece (point) m t level))
((eq (char-after (+ 2 tmp)) ?<) ; Lookbehind
(goto-char (+ 3 tmp))
(cperl-beautify-regexp-piece (point) m t level))
(t
(cperl-beautify-regexp-piece tmp m t level))))
(goto-char m1)
(cond ((looking-at "[*+?]\\??")
(goto-char (match-end 0)))
((eq (following-char) ?\{)
(forward-sexp 1)
(if (eq (following-char) ?\?)
(forward-char))))
(skip-chars-forward " \t")
(setq spaces nil)
(if (looking-at "[#\n]")
(progn
(or (eolp) (indent-for-comment))
(beginning-of-line 2))
(delete-horizontal-space)
(insert "\n"))
(end-of-line)
(setq inline nil))
((match-beginning 9) ; |
(forward-char -1)
(setq tmp (point))
(beginning-of-line)
(if (re-search-forward "[^ \t]" tmp t)
(progn
(goto-char tmp)
(delete-horizontal-space)
(insert "\n"))
;; first at line
(delete-region (point) tmp))
(cperl-make-indent c)
(forward-char 1)
(skip-chars-forward " \t")
(setq spaces nil)
(if (looking-at "[#\n]")
(beginning-of-line 2)
(delete-horizontal-space)
(insert "\n"))
(end-of-line)
(setq inline nil)))
(or (looking-at "[ \t\n]")
(not spaces)
(insert " "))
(skip-chars-forward " \t"))
(or (looking-at "[#\n]")
(error "Unknown code `%s' in a regexp"
(buffer-substring (point) (1+ (point)))))
(and inline (end-of-line 2)))
;; Special-case the last line of group
(if (and (>= (point) (marker-position e))
(/= (current-indentation) c))
(progn
(beginning-of-line)
(cperl-make-indent c)))))