aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2007-09-07 04:23:47 +0000
committerStefan Monnier2007-09-07 04:23:47 +0000
commit565bb227093683334f55c0cbadf8192abd4e30b9 (patch)
treee871b21b7d007715834cc78c122bd04f775d9e30
parentce74bf0dd76cde112e501117291f550a76779884 (diff)
downloademacs-other-branches/ILYA.tar.gz
emacs-other-branches/ILYA.zip
-rw-r--r--lisp/progmodes/cperl-mode.el264
1 files changed, 61 insertions, 203 deletions
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index d7006585805..e79528643fe 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -45,7 +45,7 @@
45 45
46;;; Commentary: 46;;; Commentary:
47 47
48;; $Id: cperl-mode.el,v 5.22 2006/10/03 08:16:35 vera Exp vera $ 48;; $Id: cperl-mode.el,v 5.23 2007/02/15 11:34:23 vera Exp vera $
49 49
50;;; If your Emacs does not default to `cperl-mode' on Perl files: 50;;; If your Emacs does not default to `cperl-mode' on Perl files:
51;;; To use this mode put the following into 51;;; To use this mode put the following into
@@ -1489,6 +1489,20 @@
1489;;; `cperl-comment-indent': Test for `cperl-indent-comment-at-column-0' 1489;;; `cperl-comment-indent': Test for `cperl-indent-comment-at-column-0'
1490;;; was inverted; 1490;;; was inverted;
1491;;; Support `comment-column' = 0 1491;;; Support `comment-column' = 0
1492
1493;;; After 5.22:
1494;;; `cperl-where-am-i': Remove function
1495;;; `cperl-backward-to-noncomment': Would go too far when skipping POD/HEREs
1496;;; `cperl-sniff-for-indent': [string] and [comment] were inverted
1497;;; When looking for label, skip s:m:y:tr
1498;;; `cperl-indent-line': Likewise.
1499;;; `cperl-mode': `font-lock-multiline' was assumed auto-local
1500;;; `cperl-windowed-init': Wrong `ps-print' handling
1501;;; (both thanks to Chong Yidong)
1502;;; `cperl-look-at-leading-count': Could fail with unfinished RExen
1503;;; `cperl-find-pods-heres': If the second part of s()[] is missing,
1504;;; could try to highlight delimiters...
1505
1492;;; Code: 1506;;; Code:
1493 1507
1494(if (fboundp 'eval-when-compile) 1508(if (fboundp 'eval-when-compile)
@@ -3354,7 +3368,7 @@ or as help on variables `cperl-tips', `cperl-problems',
3354 (if (boundp 'font-lock-multiline) ; Newer font-lock; use its facilities 3368 (if (boundp 'font-lock-multiline) ; Newer font-lock; use its facilities
3355 (progn 3369 (progn
3356 (setq cperl-font-lock-multiline t) ; Not localized... 3370 (setq cperl-font-lock-multiline t) ; Not localized...
3357 (set 'font-lock-multiline t)) ; not present with old Emacs; auto-local 3371 (set (make-local-variable 'font-lock-multiline) t))
3358 (make-local-variable 'font-lock-fontify-region-function) 3372 (make-local-variable 'font-lock-fontify-region-function)
3359 (set 'font-lock-fontify-region-function ; not present with old Emacs 3373 (set 'font-lock-fontify-region-function ; not present with old Emacs
3360 'cperl-font-lock-fontify-region-function)) 3374 'cperl-font-lock-fontify-region-function))
@@ -4136,7 +4150,8 @@ Return the amount the indentation changed by."
4136 (t 4150 (t
4137 (skip-chars-forward " \t") 4151 (skip-chars-forward " \t")
4138 (if (listp indent) (setq indent (car indent))) 4152 (if (listp indent) (setq indent (car indent)))
4139 (cond ((looking-at "[A-Za-z_][A-Za-z_0-9]*:[^:]") 4153 (cond ((and (looking-at "[A-Za-z_][A-Za-z_0-9]*:[^:]")
4154 (not (looking-at "[smy]:\\|tr:")))
4140 (and (> indent 0) 4155 (and (> indent 0)
4141 (setq indent (max cperl-min-label-indent 4156 (setq indent (max cperl-min-label-indent
4142 (+ indent cperl-label-offset))))) 4157 (+ indent cperl-label-offset)))))
@@ -4311,9 +4326,9 @@ Will not look before LIM."
4311 (vector 'indentable 'first-line p)))) 4326 (vector 'indentable 'first-line p))))
4312 ((get-text-property char-after-pos 'REx-part2) 4327 ((get-text-property char-after-pos 'REx-part2)
4313 (vector 'REx-part2 (point))) 4328 (vector 'REx-part2 (point)))
4314 ((nth 3 state)
4315 [comment])
4316 ((nth 4 state) 4329 ((nth 4 state)
4330 [comment])
4331 ((nth 3 state)
4317 [string]) 4332 [string])
4318 ;; XXXX Do we need to special-case this? 4333 ;; XXXX Do we need to special-case this?
4319 ((null containing-sexp) 4334 ((null containing-sexp)
@@ -4419,7 +4434,9 @@ Will not look before LIM."
4419 (let ((colon-line-end 0)) 4434 (let ((colon-line-end 0))
4420 (while 4435 (while
4421 (progn (skip-chars-forward " \t\n") 4436 (progn (skip-chars-forward " \t\n")
4422 (looking-at "#\\|[a-zA-Z0-9_$]*:[^:]\\|=[a-zA-Z]")) 4437 ;; s: foo : bar :x is NOT label
4438 (and (looking-at "#\\|\\([a-zA-Z0-9_$]+\\):[^:]\\|=[a-zA-Z]")
4439 (not (looking-at "[sym]:\\|tr:"))))
4423 ;; Skip over comments and labels following openbrace. 4440 ;; Skip over comments and labels following openbrace.
4424 (cond ((= (following-char) ?\#) 4441 (cond ((= (following-char) ?\#)
4425 (forward-line 1)) 4442 (forward-line 1))
@@ -4490,8 +4507,7 @@ Will not look before LIM."
4490 (vector 'code-start-in-block containing-sexp char-after 4507 (vector 'code-start-in-block containing-sexp char-after
4491 (and delim (not is-block)) ; is a HASH 4508 (and delim (not is-block)) ; is a HASH
4492 old-indent ; brace first thing on a line 4509 old-indent ; brace first thing on a line
4493 nil (point) ; nothing interesting before 4510 nil (point))))))))))))))) ; nothing interesting before
4494 ))))))))))))))
4495 4511
4496(defvar cperl-indent-rules-alist 4512(defvar cperl-indent-rules-alist
4497 '((pod nil) ; via `syntax-type' property 4513 '((pod nil) ; via `syntax-type' property
@@ -4505,9 +4521,7 @@ Will not look before LIM."
4505 "Alist of indentation rules for CPerl mode. 4521 "Alist of indentation rules for CPerl mode.
4506The values mean: 4522The values mean:
4507 nil: do not indent; 4523 nil: do not indent;
4508 number: add this amount of indentation. 4524 number: add this amount of indentation.")
4509
4510Not finished.")
4511 4525
4512(defun cperl-calculate-indent (&optional parse-data) ; was parse-start 4526(defun cperl-calculate-indent (&optional parse-data) ; was parse-start
4513 "Return appropriate indentation for current line as Perl code. 4527 "Return appropriate indentation for current line as Perl code.
@@ -4632,8 +4646,8 @@ and closing parentheses and brackets."
4632 ;; 4646 ;;
4633 ((eq 'have-prev-sibling (elt i 0)) 4647 ((eq 'have-prev-sibling (elt i 0))
4634 ;; [have-prev-sibling sibling-beg colon-line-end block-start] 4648 ;; [have-prev-sibling sibling-beg colon-line-end block-start]
4635 (goto-char (elt i 1)) 4649 (goto-char (elt i 1)) ; sibling-beg
4636 (if (> (elt i 2) (point)) ; colon-line-end; After-label, same line 4650 (if (> (elt i 2) (point)) ; colon-line-end; have label before point
4637 (if (> (current-indentation) 4651 (if (> (current-indentation)
4638 cperl-min-label-indent) 4652 cperl-min-label-indent)
4639 (- (current-indentation) cperl-label-offset) 4653 (- (current-indentation) cperl-label-offset)
@@ -4685,170 +4699,6 @@ and closing parentheses and brackets."
4685 (t 4699 (t
4686 (error (format "Got strange value of indent: " i))))))) 4700 (error (format "Got strange value of indent: " i)))))))
4687 4701
4688(defvar cperl-indent-alist
4689 '((string nil)
4690 (comment nil)
4691 (toplevel 0)
4692 (toplevel-after-parenth 2)
4693 (toplevel-continued 2)
4694 (expression 1))
4695 "Alist of indentation rules for CPerl mode.
4696The values mean:
4697 nil: do not indent;
4698 number: add this amount of indentation.
4699
4700Not finished, not used.")
4701
4702(defun cperl-where-am-i (&optional parse-start start-state)
4703 ;; Unfinished
4704 "Return a list of lists ((TYPE POS)...) of good points before the point.
4705POS may be nil if it is hard to find, say, when TYPE is `string' or `comment'.
4706
4707Not finished, not used."
4708 (save-excursion
4709 (let* ((start-point (point)) unused
4710 (s-s (cperl-get-state))
4711 (start (nth 0 s-s))
4712 (state (nth 1 s-s))
4713 (prestart (nth 3 s-s))
4714 (containing-sexp (car (cdr state)))
4715 (case-fold-search nil)
4716 (res (list (list 'parse-start start) (list 'parse-prestart prestart))))
4717 (cond ((nth 3 state) ; In string
4718 (setq res (cons (list 'string nil (nth 3 state)) res))) ; What started string
4719 ((nth 4 state) ; In comment
4720 (setq res (cons '(comment) res)))
4721 ((null containing-sexp)
4722 ;; Line is at top level.
4723 ;; Indent like the previous top level line
4724 ;; unless that ends in a closeparen without semicolon,
4725 ;; in which case this line is the first argument decl.
4726 (cperl-backward-to-noncomment (or parse-start (point-min)))
4727 ;;(skip-chars-backward " \t\f\n")
4728 (cond
4729 ((or (bobp)
4730 (memq (preceding-char) (append ";}" nil)))
4731 (setq res (cons (list 'toplevel start) res)))
4732 ((eq (preceding-char) ?\) )
4733 (setq res (cons (list 'toplevel-after-parenth start) res)))
4734 (t
4735 (setq res (cons (list 'toplevel-continued start) res)))))
4736 ((/= (char-after containing-sexp) ?{)
4737 ;; line is expression, not statement:
4738 ;; indent to just after the surrounding open.
4739 ;; skip blanks if we do not close the expression.
4740 (setq res (cons (list 'expression-blanks
4741 (progn
4742 (goto-char (1+ containing-sexp))
4743 (or (looking-at "[ \t]*\\(#\\|$\\)")
4744 (skip-chars-forward " \t"))
4745 (point)))
4746 (cons (list 'expression containing-sexp) res))))
4747 ((progn
4748 ;; Containing-expr starts with \{. Check whether it is a hash.
4749 (goto-char containing-sexp)
4750 (not (cperl-block-p)))
4751 (setq res (cons (list 'expression-blanks
4752 (progn
4753 (goto-char (1+ containing-sexp))
4754 (or (looking-at "[ \t]*\\(#\\|$\\)")
4755 (skip-chars-forward " \t"))
4756 (point)))
4757 (cons (list 'expression containing-sexp) res))))
4758 (t
4759 ;; Statement level.
4760 (setq res (cons (list 'in-block containing-sexp) res))
4761 ;; Is it a continuation or a new statement?
4762 ;; Find previous non-comment character.
4763 (cperl-backward-to-noncomment containing-sexp)
4764 ;; Back up over label lines, since they don't
4765 ;; affect whether our line is a continuation.
4766 ;; Back up comma-delimited lines too ?????
4767 (while (or (eq (preceding-char) ?\,)
4768 (save-excursion (cperl-after-label)))
4769 (if (eq (preceding-char) ?\,)
4770 ;; Will go to beginning of line, essentially
4771 ;; Will ignore embedded sexpr XXXX.
4772 (cperl-backward-to-start-of-continued-exp containing-sexp))
4773 (beginning-of-line)
4774 (cperl-backward-to-noncomment containing-sexp))
4775 ;; Now we get the answer.
4776 (if (not (memq (preceding-char) (append ";}{" '(nil)))) ; Was ?\,
4777 ;; This line is continuation of preceding line's statement.
4778 (list (list 'statement-continued containing-sexp))
4779 ;; This line starts a new statement.
4780 ;; Position following last unclosed open.
4781 (goto-char containing-sexp)
4782 ;; Is line first statement after an open-brace?
4783 (or
4784 ;; If no, find that first statement and indent like
4785 ;; it. If the first statement begins with label, do
4786 ;; not believe when the indentation of the label is too
4787 ;; small.
4788 (save-excursion
4789 (forward-char 1)
4790 (let ((colon-line-end 0))
4791 (while (progn (skip-chars-forward " \t\n" start-point)
4792 (and (< (point) start-point)
4793 (looking-at
4794 "#\\|[a-zA-Z_][a-zA-Z0-9_]*:[^:]")))
4795 ;; Skip over comments and labels following openbrace.
4796 (cond ((= (following-char) ?\#)
4797 ;;(forward-line 1)
4798 (end-of-line))
4799 ;; label:
4800 (t
4801 (save-excursion (end-of-line)
4802 (setq colon-line-end (point)))
4803 (search-forward ":"))))
4804 ;; Now at the point, after label, or at start
4805 ;; of first statement in the block.
4806 (and (< (point) start-point)
4807 (if (> colon-line-end (point))
4808 ;; Before statement after label
4809 (if (> (current-indentation)
4810 cperl-min-label-indent)
4811 (list (list 'label-in-block (point)))
4812 ;; Do not believe: `max' is involved
4813 (list
4814 (list 'label-in-block-min-indent (point))))
4815 ;; Before statement
4816 (list 'statement-in-block (point))))))
4817 ;; If no previous statement,
4818 ;; indent it relative to line brace is on.
4819 ;; For open brace in column zero, don't let statement
4820 ;; start there too. If cperl-indent-level is zero,
4821 ;; use cperl-brace-offset + cperl-continued-statement-offset instead.
4822 ;; For open-braces not the first thing in a line,
4823 ;; add in cperl-brace-imaginary-offset.
4824
4825 ;; If first thing on a line: ?????
4826 (setq unused ; This is not finished...
4827 (+ (if (and (bolp) (zerop cperl-indent-level))
4828 (+ cperl-brace-offset cperl-continued-statement-offset)
4829 cperl-indent-level)
4830 ;; Move back over whitespace before the openbrace.
4831 ;; If openbrace is not first nonwhite thing on the line,
4832 ;; add the cperl-brace-imaginary-offset.
4833 (progn (skip-chars-backward " \t")
4834 (if (bolp) 0 cperl-brace-imaginary-offset))
4835 ;; If the openbrace is preceded by a parenthesized exp,
4836 ;; move to the beginning of that;
4837 ;; possibly a different line
4838 (progn
4839 (if (eq (preceding-char) ?\))
4840 (forward-sexp -1))
4841 ;; Get initial indentation of the line we are on.
4842 ;; If line starts with label, calculate label indentation
4843 (if (save-excursion
4844 (beginning-of-line)
4845 (looking-at "[ \t]*[a-zA-Z_][a-zA-Z_0-9]*:[^:]"))
4846 (if (> (current-indentation) cperl-min-label-indent)
4847 (- (current-indentation) cperl-label-offset)
4848 (cperl-calculate-indent))
4849 (current-indentation)))))))))
4850 res)))
4851
4852(defun cperl-calculate-indent-within-comment () 4702(defun cperl-calculate-indent-within-comment ()
4853 "Return the indentation amount for line, assuming that 4703 "Return the indentation amount for line, assuming that
4854the current line is to be regarded as part of a block comment." 4704the current line is to be regarded as part of a block comment."
@@ -5243,8 +5093,10 @@ Should be called with the point before leading colon of an attribute."
5243 (set-syntax-table reset-st)))) 5093 (set-syntax-table reset-st))))
5244 5094
5245(defsubst cperl-look-at-leading-count (is-x-REx e) 5095(defsubst cperl-look-at-leading-count (is-x-REx e)
5246 (if (re-search-forward (concat "\\=" (if is-x-REx "[ \t\n]*" "") "[{?+*]") 5096 (if (and
5247 (1- e) t) ; return nil on failure, no moving 5097 (< (point) e)
5098 (re-search-forward (concat "\\=" (if is-x-REx "[ \t\n]*" "") "[{?+*]")
5099 (1- e) t)) ; return nil on failure, no moving
5248 (if (eq ?\{ (preceding-char)) nil 5100 (if (eq ?\{ (preceding-char)) nil
5249 (cperl-postpone-fontification 5101 (cperl-postpone-fontification
5250 (1- (point)) (point) 5102 (1- (point)) (point)
@@ -6288,8 +6140,8 @@ the sections using `cperl-pod-head-face', `cperl-pod-face',
6288 (if (and is-REx is-x-REx) 6140 (if (and is-REx is-x-REx)
6289 (put-text-property (1+ b) (1- e) 6141 (put-text-property (1+ b) (1- e)
6290 'syntax-subtype 'x-REx))) 6142 'syntax-subtype 'x-REx)))
6291 (if i2 6143 (if (and i2 e1 b1 (> e1 b1))
6292 (progn 6144 (progn ; No errors finding the second part...
6293 (cperl-postpone-fontification 6145 (cperl-postpone-fontification
6294 (1- e1) e1 'face my-cperl-delimiters-face) 6146 (1- e1) e1 'face my-cperl-delimiters-face)
6295 (if (assoc (char-after b) cperl-starters) 6147 (if (assoc (char-after b) cperl-starters)
@@ -6383,14 +6235,16 @@ the sections using `cperl-pod-head-face', `cperl-pod-face',
6383 (beginning-of-line) 6235 (beginning-of-line)
6384 (if (memq (setq pr (get-text-property (point) 'syntax-type)) 6236 (if (memq (setq pr (get-text-property (point) 'syntax-type))
6385 '(pod here-doc here-doc-delim)) 6237 '(pod here-doc here-doc-delim))
6386 (cperl-unwind-to-safe nil) 6238 (progn
6387 (or (and (looking-at "^[ \t]*\\(#\\|$\\)") 6239 (cperl-unwind-to-safe nil)
6388 (not (memq pr '(string prestring)))) 6240 (setq pr (get-text-property (point) 'syntax-type))))
6389 (progn (cperl-to-comment-or-eol) (bolp)) 6241 (or (and (looking-at "^[ \t]*\\(#\\|$\\)")
6390 (progn 6242 (not (memq pr '(string prestring))))
6391 (skip-chars-backward " \t") 6243 (progn (cperl-to-comment-or-eol) (bolp))
6392 (if (< p (point)) (goto-char p)) 6244 (progn
6393 (setq stop t))))))) 6245 (skip-chars-backward " \t")
6246 (if (< p (point)) (goto-char p))
6247 (setq stop t))))))
6394 6248
6395;; Used only in `cperl-calculate-indent'... 6249;; Used only in `cperl-calculate-indent'...
6396(defun cperl-block-p () ; Do not C-M-q ! One string contains ";" ! 6250(defun cperl-block-p () ; Do not C-M-q ! One string contains ";" !
@@ -7243,19 +7097,23 @@ indentation and initial hashes. Behaves usually outside of comment."
7243 7097
7244(defun cperl-windowed-init () 7098(defun cperl-windowed-init ()
7245 "Initialization under windowed version." 7099 "Initialization under windowed version."
7246 (if (or (featurep 'ps-print) cperl-faces-init) 7100 (cond ((featurep 'ps-print)
7247 ;; Need to init anyway: 7101 (or cperl-faces-init
7248 (or cperl-faces-init (cperl-init-faces)) 7102 (progn
7249 (add-hook 'font-lock-mode-hook 7103 (and (boundp 'font-lock-multiline)
7250 (function 7104 (setq cperl-font-lock-multiline t))
7251 (lambda () 7105 (cperl-init-faces))))
7252 (if (memq major-mode '(perl-mode cperl-mode)) 7106 ((not cperl-faces-init)
7253 (progn 7107 (add-hook 'font-lock-mode-hook
7254 (or cperl-faces-init (cperl-init-faces))))))) 7108 (function
7255 (if (fboundp 'eval-after-load) 7109 (lambda ()
7256 (eval-after-load 7110 (if (memq major-mode '(perl-mode cperl-mode))
7257 "ps-print" 7111 (progn
7258 '(or cperl-faces-init (cperl-init-faces)))))) 7112 (or cperl-faces-init (cperl-init-faces)))))))
7113 (if (fboundp 'eval-after-load)
7114 (eval-after-load
7115 "ps-print"
7116 '(or cperl-faces-init (cperl-init-faces)))))))
7259 7117
7260(defun cperl-load-font-lock-keywords () 7118(defun cperl-load-font-lock-keywords ()
7261 (or cperl-faces-init (cperl-init-faces)) 7119 (or cperl-faces-init (cperl-init-faces))
@@ -10573,7 +10431,7 @@ do extra unwind via `cperl-unwind-to-safe'."
10573 (cperl-fontify-syntaxically to))))) 10431 (cperl-fontify-syntaxically to)))))
10574 10432
10575(defvar cperl-version 10433(defvar cperl-version
10576 (let ((v "$Revision: 5.22 $")) 10434 (let ((v "$Revision: 5.23 $"))
10577 (string-match ":\\s *\\([0-9.]+\\)" v) 10435 (string-match ":\\s *\\([0-9.]+\\)" v)
10578 (substring v (match-beginning 1) (match-end 1))) 10436 (substring v (match-beginning 1) (match-end 1)))
10579 "Version of IZ-supported CPerl package this file is based on.") 10437 "Version of IZ-supported CPerl package this file is based on.")