Mercurial > emacs
diff lisp/progmodes/cperl-mode.el @ 89909:68c22ea6027c
Sync to HEAD
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Fri, 16 Apr 2004 12:51:06 +0000 |
parents | 375f2633d815 |
children | 4c90ffeb71c5 |
line wrap: on
line diff
--- a/lisp/progmodes/cperl-mode.el Thu Apr 15 01:08:34 2004 +0000 +++ b/lisp/progmodes/cperl-mode.el Fri Apr 16 12:51:06 2004 +0000 @@ -1,6 +1,6 @@ ;;; cperl-mode.el --- Perl code editing commands for Emacs -;; Copyright (C) 1985, 86, 87, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2003 +;; Copyright (C) 1985,86,87,91,92,93,94,95,96,97,98,99,2000,03,2004 ;; Free Software Foundation, Inc. ;; Author: Ilya Zakharevich and Bob Olson @@ -1064,9 +1064,6 @@ 'indent-sexp 'cperl-indent-exp cperl-mode-map global-map) (substitute-key-definition - 'fill-paragraph 'cperl-fill-paragraph - cperl-mode-map global-map) - (substitute-key-definition 'indent-region 'cperl-indent-region cperl-mode-map global-map) (substitute-key-definition @@ -1086,7 +1083,7 @@ ["End of function" end-of-defun t] ["Mark function" mark-defun t] ["Indent expression" cperl-indent-exp t] - ["Fill paragraph/comment" cperl-fill-paragraph t] + ["Fill paragraph/comment" fill-paragraph t] "----" ["Line up a construction" cperl-lineup (cperl-use-region-p)] ["Invert if/unless/while etc" cperl-invert-if-unless t] @@ -1464,6 +1461,7 @@ (setq paragraph-separate paragraph-start) (make-local-variable 'paragraph-ignore-fill-prefix) (setq paragraph-ignore-fill-prefix t) + (set (make-local-variable 'fill-paragraph-function) 'cperl-fill-paragraph) (make-local-variable 'indent-line-function) (setq indent-line-function 'cperl-indent-line) (make-local-variable 'require-final-newline) @@ -2695,168 +2693,168 @@ (cperl-calculate-indent)) (current-indentation)))))))))))))) -(defvar cperl-indent-alist - '((string nil) - (comment nil) - (toplevel 0) - (toplevel-after-parenth 2) - (toplevel-continued 2) - (expression 1)) - "Alist of indentation rules for CPerl mode. -The values mean: - nil: do not indent; - number: add this amount of indentation. - -Not finished, not used.") - -(defun cperl-where-am-i (&optional parse-start start-state) - ;; Unfinished - "Return a list of lists ((TYPE POS)...) of good points before the point. -POS may be nil if it is hard to find, say, when TYPE is `string' or `comment'. - -Not finished, not used." - (save-excursion - (let* ((start-point (point)) - (s-s (cperl-get-state)) - (start (nth 0 s-s)) - (state (nth 1 s-s)) - (prestart (nth 3 s-s)) - (containing-sexp (car (cdr state))) - (case-fold-search nil) - (res (list (list 'parse-start start) (list 'parse-prestart prestart)))) - (cond ((nth 3 state) ; In string - (setq res (cons (list 'string nil (nth 3 state)) res))) ; What started string - ((nth 4 state) ; In comment - (setq res (cons '(comment) res))) - ((null containing-sexp) - ;; Line is at top level. - ;; Indent like the previous top level line - ;; unless that ends in a closeparen without semicolon, - ;; in which case this line is the first argument decl. - (cperl-backward-to-noncomment (or parse-start (point-min))) - ;;(skip-chars-backward " \t\f\n") - (cond - ((or (bobp) - (memq (preceding-char) (append ";}" nil))) - (setq res (cons (list 'toplevel start) res))) - ((eq (preceding-char) ?\) ) - (setq res (cons (list 'toplevel-after-parenth start) res))) - (t - (setq res (cons (list 'toplevel-continued start) res))))) - ((/= (char-after containing-sexp) ?{) - ;; line is expression, not statement: - ;; indent to just after the surrounding open. - ;; skip blanks if we do not close the expression. - (setq res (cons (list 'expression-blanks - (progn - (goto-char (1+ containing-sexp)) - (or (looking-at "[ \t]*\\(#\\|$\\)") - (skip-chars-forward " \t")) - (point))) - (cons (list 'expression containing-sexp) res)))) - ((progn - ;; Containing-expr starts with \{. Check whether it is a hash. - (goto-char containing-sexp) - (not (cperl-block-p))) - (setq res (cons (list 'expression-blanks - (progn - (goto-char (1+ containing-sexp)) - (or (looking-at "[ \t]*\\(#\\|$\\)") - (skip-chars-forward " \t")) - (point))) - (cons (list 'expression containing-sexp) res)))) - (t - ;; Statement level. - (setq res (cons (list 'in-block containing-sexp) res)) - ;; Is it a continuation or a new statement? - ;; Find previous non-comment character. - (cperl-backward-to-noncomment containing-sexp) - ;; Back up over label lines, since they don't - ;; affect whether our line is a continuation. - ;; Back up comma-delimited lines too ????? - (while (or (eq (preceding-char) ?\,) - (save-excursion (cperl-after-label))) - (if (eq (preceding-char) ?\,) - ;; Will go to beginning of line, essentially - ;; Will ignore embedded sexpr XXXX. - (cperl-backward-to-start-of-continued-exp containing-sexp)) - (beginning-of-line) - (cperl-backward-to-noncomment containing-sexp)) - ;; Now we get the answer. - (if (not (memq (preceding-char) (append ";}{" '(nil)))) ; Was ?\, - ;; This line is continuation of preceding line's statement. - (list (list 'statement-continued containing-sexp)) - ;; This line starts a new statement. - ;; Position following last unclosed open. - (goto-char containing-sexp) - ;; Is line first statement after an open-brace? - (or - ;; If no, find that first statement and indent like - ;; it. If the first statement begins with label, do - ;; not believe when the indentation of the label is too - ;; small. - (save-excursion - (forward-char 1) - (let ((colon-line-end 0)) - (while (progn (skip-chars-forward " \t\n" start-point) - (and (< (point) start-point) - (looking-at - "#\\|[a-zA-Z_][a-zA-Z0-9_]*:[^:]"))) - ;; Skip over comments and labels following openbrace. - (cond ((= (following-char) ?\#) - ;;(forward-line 1) - (end-of-line)) - ;; label: - (t - (save-excursion (end-of-line) - (setq colon-line-end (point))) - (search-forward ":")))) - ;; Now at the point, after label, or at start - ;; of first statement in the block. - (and (< (point) start-point) - (if (> colon-line-end (point)) - ;; Before statement after label - (if (> (current-indentation) - cperl-min-label-indent) - (list (list 'label-in-block (point))) - ;; Do not believe: `max' is involved - (list - (list 'label-in-block-min-indent (point)))) - ;; Before statement - (list 'statement-in-block (point)))))) - ;; If no previous statement, - ;; indent it relative to line brace is on. - ;; For open brace in column zero, don't let statement - ;; start there too. If cperl-indent-level is zero, - ;; use cperl-brace-offset + cperl-continued-statement-offset instead. - ;; For open-braces not the first thing in a line, - ;; add in cperl-brace-imaginary-offset. - - ;; If first thing on a line: ????? - (+ (if (and (bolp) (zerop cperl-indent-level)) - (+ cperl-brace-offset cperl-continued-statement-offset) - cperl-indent-level) - ;; Move back over whitespace before the openbrace. - ;; If openbrace is not first nonwhite thing on the line, - ;; add the cperl-brace-imaginary-offset. - (progn (skip-chars-backward " \t") - (if (bolp) 0 cperl-brace-imaginary-offset)) - ;; If the openbrace is preceded by a parenthesized exp, - ;; move to the beginning of that; - ;; possibly a different line - (progn - (if (eq (preceding-char) ?\)) - (forward-sexp -1)) - ;; Get initial indentation of the line we are on. - ;; If line starts with label, calculate label indentation - (if (save-excursion - (beginning-of-line) - (looking-at "[ \t]*[a-zA-Z_][a-zA-Z_0-9]*:[^:]")) - (if (> (current-indentation) cperl-min-label-indent) - (- (current-indentation) cperl-label-offset) - (cperl-calculate-indent)) - (current-indentation)))))))) - res))) +;; (defvar cperl-indent-alist +;; '((string nil) +;; (comment nil) +;; (toplevel 0) +;; (toplevel-after-parenth 2) +;; (toplevel-continued 2) +;; (expression 1)) +;; "Alist of indentation rules for CPerl mode. +;; The values mean: +;; nil: do not indent; +;; number: add this amount of indentation. + +;; Not finished, not used.") + +;; (defun cperl-where-am-i (&optional parse-start start-state) +;; ;; Unfinished +;; "Return a list of lists ((TYPE POS)...) of good points before the point. +;; ;; POS may be nil if it is hard to find, say, when TYPE is `string' or `comment'. + +;; ;; Not finished, not used." +;; (save-excursion +;; (let* ((start-point (point)) +;; (s-s (cperl-get-state)) +;; (start (nth 0 s-s)) +;; (state (nth 1 s-s)) +;; (prestart (nth 3 s-s)) +;; (containing-sexp (car (cdr state))) +;; (case-fold-search nil) +;; (res (list (list 'parse-start start) (list 'parse-prestart prestart)))) +;; (cond ((nth 3 state) ; In string +;; (setq res (cons (list 'string nil (nth 3 state)) res))) ; What started string +;; ((nth 4 state) ; In comment +;; (setq res (cons '(comment) res))) +;; ((null containing-sexp) +;; ;; Line is at top level. +;; ;; Indent like the previous top level line +;; ;; unless that ends in a closeparen without semicolon, +;; ;; in which case this line is the first argument decl. +;; (cperl-backward-to-noncomment (or parse-start (point-min))) +;; ;;(skip-chars-backward " \t\f\n") +;; (cond +;; ((or (bobp) +;; (memq (preceding-char) (append ";}" nil))) +;; (setq res (cons (list 'toplevel start) res))) +;; ((eq (preceding-char) ?\) ) +;; (setq res (cons (list 'toplevel-after-parenth start) res))) +;; (t +;; (setq res (cons (list 'toplevel-continued start) res))))) +;; ((/= (char-after containing-sexp) ?{) +;; ;; line is expression, not statement: +;; ;; indent to just after the surrounding open. +;; ;; skip blanks if we do not close the expression. +;; (setq res (cons (list 'expression-blanks +;; (progn +;; (goto-char (1+ containing-sexp)) +;; (or (looking-at "[ \t]*\\(#\\|$\\)") +;; (skip-chars-forward " \t")) +;; (point))) +;; (cons (list 'expression containing-sexp) res)))) +;; ((progn +;; ;; Containing-expr starts with \{. Check whether it is a hash. +;; (goto-char containing-sexp) +;; (not (cperl-block-p))) +;; (setq res (cons (list 'expression-blanks +;; (progn +;; (goto-char (1+ containing-sexp)) +;; (or (looking-at "[ \t]*\\(#\\|$\\)") +;; (skip-chars-forward " \t")) +;; (point))) +;; (cons (list 'expression containing-sexp) res)))) +;; (t +;; ;; Statement level. +;; (setq res (cons (list 'in-block containing-sexp) res)) +;; ;; Is it a continuation or a new statement? +;; ;; Find previous non-comment character. +;; (cperl-backward-to-noncomment containing-sexp) +;; ;; Back up over label lines, since they don't +;; ;; affect whether our line is a continuation. +;; ;; Back up comma-delimited lines too ????? +;; (while (or (eq (preceding-char) ?\,) +;; (save-excursion (cperl-after-label))) +;; (if (eq (preceding-char) ?\,) +;; ;; Will go to beginning of line, essentially +;; ;; Will ignore embedded sexpr XXXX. +;; (cperl-backward-to-start-of-continued-exp containing-sexp)) +;; (beginning-of-line) +;; (cperl-backward-to-noncomment containing-sexp)) +;; ;; Now we get the answer. +;; (if (not (memq (preceding-char) (append ";}{" '(nil)))) ; Was ?\, +;; ;; This line is continuation of preceding line's statement. +;; (list (list 'statement-continued containing-sexp)) +;; ;; This line starts a new statement. +;; ;; Position following last unclosed open. +;; (goto-char containing-sexp) +;; ;; Is line first statement after an open-brace? +;; (or +;; ;; If no, find that first statement and indent like +;; ;; it. If the first statement begins with label, do +;; ;; not believe when the indentation of the label is too +;; ;; small. +;; (save-excursion +;; (forward-char 1) +;; (let ((colon-line-end 0)) +;; (while (progn (skip-chars-forward " \t\n" start-point) +;; (and (< (point) start-point) +;; (looking-at +;; "#\\|[a-zA-Z_][a-zA-Z0-9_]*:[^:]"))) +;; ;; Skip over comments and labels following openbrace. +;; (cond ((= (following-char) ?\#) +;; ;;(forward-line 1) +;; (end-of-line)) +;; ;; label: +;; (t +;; (save-excursion (end-of-line) +;; (setq colon-line-end (point))) +;; (search-forward ":")))) +;; ;; Now at the point, after label, or at start +;; ;; of first statement in the block. +;; (and (< (point) start-point) +;; (if (> colon-line-end (point)) +;; ;; Before statement after label +;; (if (> (current-indentation) +;; cperl-min-label-indent) +;; (list (list 'label-in-block (point))) +;; ;; Do not believe: `max' is involved +;; (list +;; (list 'label-in-block-min-indent (point)))) +;; ;; Before statement +;; (list 'statement-in-block (point)))))) +;; ;; If no previous statement, +;; ;; indent it relative to line brace is on. +;; ;; For open brace in column zero, don't let statement +;; ;; start there too. If cperl-indent-level is zero, +;; ;; use cperl-brace-offset + cperl-continued-statement-offset instead. +;; ;; For open-braces not the first thing in a line, +;; ;; add in cperl-brace-imaginary-offset. + +;; ;; If first thing on a line: ????? +;; (+ (if (and (bolp) (zerop cperl-indent-level)) +;; (+ cperl-brace-offset cperl-continued-statement-offset) +;; cperl-indent-level) +;; ;; Move back over whitespace before the openbrace. +;; ;; If openbrace is not first nonwhite thing on the line, +;; ;; add the cperl-brace-imaginary-offset. +;; (progn (skip-chars-backward " \t") +;; (if (bolp) 0 cperl-brace-imaginary-offset)) +;; ;; If the openbrace is preceded by a parenthesized exp, +;; ;; move to the beginning of that; +;; ;; possibly a different line +;; (progn +;; (if (eq (preceding-char) ?\)) +;; (forward-sexp -1)) +;; ;; Get initial indentation of the line we are on. +;; ;; If line starts with label, calculate label indentation +;; (if (save-excursion +;; (beginning-of-line) +;; (looking-at "[ \t]*[a-zA-Z_][a-zA-Z_0-9]*:[^:]")) +;; (if (> (current-indentation) cperl-min-label-indent) +;; (- (current-indentation) cperl-label-offset) +;; (cperl-calculate-indent)) +;; (current-indentation)))))))) +;; res))) (defun cperl-calculate-indent-within-comment () "Return the indentation amount for line, assuming that @@ -4255,11 +4253,11 @@ ;; Stolen from lisp-mode with a lot of improvements (defun cperl-fill-paragraph (&optional justify iteration) - "Like \\[fill-paragraph], but handle CPerl comments. + "Like `fill-paragraph', but handle CPerl comments. If any of the current line is a comment, fill the comment or the block of it that point is in, preserving the comment's initial indentation and initial hashes. Behaves usually outside of comment." - (interactive "P") + ;; (interactive "P") ; Only works when called from fill-paragraph. -stef (let (;; Non-nil if the current line contains a comment. has-comment @@ -4315,11 +4313,12 @@ (looking-at "^[ \t]*#+[ \t]*[^ \t\n#]"))) (point))) ;; Remove existing hashes - (goto-char (point-min)) - (while (progn (forward-line 1) (< (point) (point-max))) - (skip-chars-forward " \t") - (and (looking-at "#+") - (delete-char (- (match-end 0) (match-beginning 0))))) + (save-excursion + (goto-char (point-min)) + (while (progn (forward-line 1) (< (point) (point-max))) + (skip-chars-forward " \t") + (and (looking-at "#+") + (delete-char (- (match-end 0) (match-beginning 0)))))) ;; Lines with only hashes on them can be paragraph boundaries. (let ((paragraph-start (concat paragraph-start "\\|^[ \t#]*$")) @@ -4346,9 +4345,11 @@ (let ((c (save-excursion (beginning-of-line) (cperl-to-comment-or-eol) (point))) (s (memq (following-char) '(?\ ?\t))) marker) - (if (>= c (point)) nil + (if (>= c (point)) + ;; Don't break line inside code: only inside comment. + nil (setq marker (point-marker)) - (cperl-fill-paragraph) + (fill-paragraph nil) (goto-char marker) ;; Is not enough, sometimes marker is a start of line (if (bolp) (progn (re-search-forward "#+[ \t]*") @@ -7271,4 +7272,5 @@ (provide 'cperl-mode) +;;; arch-tag: 42e5b19b-e187-4537-929f-1a7408980ce6 ;;; cperl-mode.el ends here