summaryrefslogtreecommitdiff
path: root/emacs/cperl-mode.el
diff options
context:
space:
mode:
Diffstat (limited to 'emacs/cperl-mode.el')
-rw-r--r--emacs/cperl-mode.el787
1 files changed, 583 insertions, 204 deletions
diff --git a/emacs/cperl-mode.el b/emacs/cperl-mode.el
index 3d7be098c0..371d420321 100644
--- a/emacs/cperl-mode.el
+++ b/emacs/cperl-mode.el
@@ -46,9 +46,9 @@
;;; Commentary:
-;; $Id: cperl-mode.el 4.5 1998/07/28 08:55:41 vera Exp vera $
+;; $Id: cperl-mode.el,v 4.19 1998/12/10 03:31:23 ilya Exp ilya $
-;;; Before (future?) RMS Emacs 20.3: To use this mode put the following into
+;;; Before RMS Emacs 20.3: To use this mode put the following into
;;; your .emacs file:
;; (autoload 'perl-mode "cperl-mode" "alternate mode for editing Perl programs" t)
@@ -66,7 +66,7 @@
;;; `cperl-non-problems', `cperl-praise', `cperl-speed'. <<<<<<
;;; Additional useful commands to put into your .emacs file (before
-;;; (future?) RMS Emacs 20.3):
+;;; RMS Emacs 20.3):
;; (setq auto-mode-alist
;; (append '(("\\.\\([pP][Llm]\\|al\\)$" . perl-mode)) auto-mode-alist ))
@@ -501,12 +501,12 @@
;;; Debugging code in `cperl-electric-keywords' was leaking a message;
;;;; After 1.41:
-;;; RMS changes for (future?) 20.3 merged
+;;; RMS changes for 20.3 merged
;;;; 2.0.1.0: RMS mode (has 3 misprints)
;;;; After 2.0:
-;;; RMS whitespace changes for (future?) 20.3 merged
+;;; RMS whitespace changes for 20.3 merged
;;;; After 2.1:
;;; History updated
@@ -800,6 +800,114 @@
;;; `constant-face' was backward.
;;; (`font-lock-other-type-face'): Done via `defface' too.
+;;;; After 4.5:
+;;; (`cperl-init-faces-weak'): use `cperl-force-face'.
+;;; (`cperl-after-block-p'): After END/BEGIN we are a block.
+;;; (`cperl-mode'): `font-lock-unfontify-region-function'
+;;; was set to a wrong function.
+;;; (`cperl-comment-indent'): Commenting __END__ was not working.
+;;; (`cperl-indent-for-comment'): Likewise.
+;;; (Indenting is still misbehaving at toplevel.)
+
+;;;; After 4.5:
+;;; (`cperl-unwind-to-safe'): Signature changed, unwinds end too.
+;;; (`cperl-find-pods-heres'): mark qq[]-etc sections as syntax-type=string
+;;; (`cperl-fontify-syntaxically'): Unwinds start and end to go out of
+;;; long strings (not very successful).
+
+;;; >>>> CPerl should be usable in write mode too now <<<<
+
+;;; (`cperl-syntaxify-by-font-lock'): Better default - off in text-mode.
+;;; (`cperl-tips'): Updated docs.
+;;; (`cperl-problems'): Updated docs.
+
+;;;; After 4.6:
+;;; (`cperl-calculate-indent'): Did not consider `,' as continuation mark for statements.
+;;; (`cperl-write-tags'): Correct for XEmacs's `visit-tags-table-buffer'.
+
+;;;; After 4.7:
+;;; (`cperl-calculate-indent'): Avoid parse-data optimization at toplevel.
+;;; Should indent correctly at toplevel too.
+;;; (`cperl-tags-hier-init'): Gross hack to pretend we work (are we?).
+;;; (`cperl-find-pods-heres'): Was not processing sub protos after a comment ine.
+;;; Was treating $a++ <= 5 as a glob.
+
+;;;; After 4.8:
+;;; (toplevel): require custom unprotected => failure on 19.28.
+;;; (`cperl-xemacs-p') defined when compile too
+;;; (`cperl-tags-hier-init'): Another try to work around XEmacs problems
+;;; Better progress messages.
+;;; (`cperl-find-tags'): Was writing line/pos in a wrong order,
+;;; pos off by 1 and not at beg-of-line.
+;;; (`cperl-etags-snarf-tag'): New macro
+;;; (`cperl-etags-goto-tag-location'): New macro
+;;; (`cperl-write-tags'): When removing old TAGS info was not
+;;; relativizing filename
+
+;;;; After 4.9:
+;;; (`cperl-version'): New variable. New menu entry
+
+;;;; After 4.10:
+;;; (`cperl-tips'): Updated.
+;;; (`cperl-non-problems'): Updated.
+;;; random: References to future 20.3 removed.
+
+;;;; After 4.11:
+;;; (`perl-font-lock-keywords'): Would not highlight `sub foo($$);'.
+;;; Docstrings: Menu was described as `CPerl' instead of `Perl'
+
+;;;; After 4.12:
+;;; (`cperl-toggle-construct-fix'): Was toggling to t instead of 1.
+;;; (`cperl-ps-print-init'): Associate `cperl-array-face', `cperl-hash-face'
+;;; remove `font-lock-emphasized-face'.
+;;; remove `font-lock-other-emphasized-face'.
+;;; remove `font-lock-reference-face'.
+;;; remove `font-lock-keyword-face'.
+;;; Use `eval-after-load'.
+;;; (`cperl-init-faces'): remove init `font-lock-other-emphasized-face'.
+;;; remove init `font-lock-emphasized-face'.
+;;; remove init `font-lock-keyword-face'.
+;;; (`cperl-tips-faces'): New variable and an entry into Mini-docs.
+;;; (`cperl-indent-region'): Do not indent whitespace lines
+;;; (`cperl-indent-exp'): Was not processing else-blocks.
+;;; (`cperl-calculate-indent'): Remove another parse-data optimization
+;;; at toplevel: would indent correctly.
+;;; (`cperl-get-state'): NOP line removed.
+
+;;;; After 4.13:
+;;; (`cperl-ps-print-init'): Remove not-CPerl-related faces.
+;;; (`cperl-ps-print'): New function and menu entry.
+;;; (`cperl-ps-print-face-properties'): New configuration variable.
+;;; (`cperl-invalid-face'): New configuration variable.
+;;; (`cperl-nonoverridable-face'): New face. Renamed from
+;;; `font-lock-other-type-face'.
+;;; (`perl-font-lock-keywords'): Highlight trailing whitespace
+;;; (`cperl-contract-levels'): Documentation corrected.
+;;; (`cperl-contract-level'): Likewise.
+
+;;;; After 4.14:
+;;; (`cperl-ps-print'): `ps-print-face-extension-alist' was not in old Emaxen,
+;;; same with `ps-extend-face-list'
+;;; (`cperl-ps-extend-face-list'): New macro.
+
+;;;; After 4.15:
+;;; (`cperl-init-faces'): Interpolate `cperl-invalid-face'.
+;;; (`cperl-forward-re'): Emit a meaningful error instead of a cryptic
+;;; one for uncomplete REx near end-of-buffer.
+;;; (`cperl-find-pods-heres'): Tolerate unfinished REx at end-of-buffer.
+
+;;;; After 4.16:
+;;; (`cperl-find-pods-heres'): `unwind-protect' was left commented.
+
+;;;; After 4.17:
+;;; (`cperl-invalid-face'): Change to ''underline.
+
+;;;; After 4.18:
+;;; (`cperl-find-pods-heres'): / and ? after : start a REx.
+;;; (`cperl-after-expr-p'): Skip labels when checking
+;;; (`cperl-calculate-indent'): Correct for labels when calculating
+;;; indentation of continuations.
+;;; Docstring updated.
;;; Code:
@@ -808,6 +916,7 @@
(condition-case nil
(require 'custom)
(error nil))
+ (defconst cperl-xemacs-p (string-match "XEmacs\\|Lucid" emacs-version))
(or (fboundp 'defgroup)
(defmacro defgroup (name val doc &rest arr)
nil))
@@ -826,6 +935,11 @@
((fboundp 'valid-color-name-p) (` (valid-color-name-p (, col))))
;; XEmacs 19.11
(t (` (x-valid-color-name-p (, col)))))))
+ (if (fboundp 'ps-extend-face-list)
+ (defmacro cperl-ps-extend-face-list (arg)
+ (` (ps-extend-face-list (, arg))))
+ (defmacro cperl-ps-extend-face-list (arg)
+ (` (error "This version of Emacs has no `ps-extend-face-list'."))))
(defmacro cperl-is-face (arg) ; Takes quoted arg
(cond ((fboundp 'find-face)
(` (find-face (, arg))))
@@ -846,9 +960,31 @@
(or (cperl-is-face (quote (, arg)))
(cperl-make-face (, arg) (, descr)))
(or (boundp (quote (, arg))) ; We use unquoted variants too
- (defconst (, arg) (quote (, arg)) (, descr))))))))
+ (defconst (, arg) (quote (, arg)) (, descr))))))
+ (if cperl-xemacs-p
+ (defmacro cperl-etags-snarf-tag (file line)
+ (` (progn
+ (beginning-of-line 2)
+ (list (, file) (, line)))))
+ (defmacro cperl-etags-snarf-tag (file line)
+ (` (etags-snarf-tag))))
+ (if cperl-xemacs-p
+ (defmacro cperl-etags-goto-tag-location (elt)
+ (` ;;(progn
+ ;; (switch-to-buffer (get-file-buffer (elt (, elt) 0)))
+ ;; (set-buffer (get-file-buffer (elt (, elt) 0)))
+ ;; Probably will not work due to some save-excursion???
+ ;; Or save-file-position?
+ ;; (message "Did I get to line %s?" (elt (, elt) 1))
+ (goto-line (string-to-int (elt (, elt) 1)))))
+ ;;)
+ (defmacro cperl-etags-goto-tag-location (elt)
+ (` (etags-goto-tag-location (, elt)))))))
+
+(condition-case nil
+ (require 'custom)
+ (error nil)) ; Already fixed by eval-when-compile
-(require 'custom)
(defun cperl-choose-color (&rest list)
(let (answer)
(while list
@@ -1100,6 +1236,11 @@ Font for POD headers."
:type 'face
:group 'cperl-faces)
+(defcustom cperl-invalid-face ''underline ; later evaluated by `font-lock'
+ "*The result of evaluation of this expression highlights trailing whitespace."
+ :type 'face
+ :group 'cperl-faces)
+
(defcustom cperl-pod-here-fontify '(featurep 'font-lock)
"*Not-nil after evaluation means to highlight pod and here-docs sections."
:type 'boolean
@@ -1214,7 +1355,8 @@ may be merged to be on the same line when indenting a region."
:group 'cperl-indentation-details)
(defcustom cperl-syntaxify-by-font-lock
- (boundp 'parse-sexp-lookup-properties)
+ (and window-system
+ (boundp 'parse-sexp-lookup-properties))
"*Non-nil means that CPerl uses `font-lock's routines for syntaxification.
Having it TRUE may be not completely debugged yet."
:type '(choice (const message) boolean)
@@ -1227,6 +1369,25 @@ when syntaxifying a chunk of buffer."
:type 'boolean
:group 'cperl-speed)
+(defcustom cperl-ps-print-face-properties
+ '((font-lock-keyword-face nil nil bold shadow)
+ (font-lock-variable-name-face nil nil bold)
+ (font-lock-function-name-face nil nil bold italic box)
+ (font-lock-constant-face nil "LightGray" bold)
+ (cperl-array-face nil "LightGray" bold underline)
+ (cperl-hash-face nil "LightGray" bold italic underline)
+ (font-lock-comment-face nil "LightGray" italic)
+ (font-lock-string-face nil nil italic underline)
+ (cperl-nonoverridable-face nil nil italic underline)
+ (font-lock-type-face nil nil underline)
+ (underline nil "LightGray" strikeout))
+ "List given as an argument to `ps-extend-face-list' in `cperl-ps-print'."
+ :type '(repeat (cons symbol
+ (cons (choice (const nil) string)
+ (cons (choice (const nil) string)
+ (repeat symbol)))))
+ :group 'cperl-faces)
+
(if window-system
(progn
(defvar cperl-dark-background
@@ -1234,7 +1395,7 @@ when syntaxifying a chunk of buffer."
(defvar cperl-dark-foreground
(cperl-choose-color "orchid1" "orange"))
- (defface font-lock-other-type-face
+ (defface cperl-nonoverridable-face
(` ((((class grayscale) (background light))
(:background "Gray90" :italic t :underline t))
(((class grayscale) (background dark))
@@ -1285,6 +1446,13 @@ and/or
Subdirectory `cperl-mode' may contain yet newer development releases and/or
patches to related files.
+For best results apply to an older Emacs the patches from
+ ftp://ftp.math.ohio-state.edu/pub/users/ilya/cperl-mode/patches
+\(this upgrades syntax-parsing abilities of RMS Emaxen v19.34 and
+v20.2 up to the level of RMS Emacs v20.3 - a must for a good Perl
+mode.) You will not get much from XEmacs, it's syntax abilities are
+too primitive.
+
Get support packages choose-color.el (or font-lock-extra.el before
19.30), imenu-go.el from the same place. \(Look for other files there
too... ;-). Get a patch for imenu.el in 19.29. Note that for 19.30 and
@@ -1300,20 +1468,25 @@ older version was on
http://www.metronet.com:70/9/perlinfo/perl5/manual/perl5-info.tar.gz
If you use imenu-go, run imenu on perl5-info buffer (you can do it
-from CPerl menu). If many files are related, generate TAGS files from
-Tools/Tags submenu in CPerl menu.
+from Perl menu). If many files are related, generate TAGS files from
+Tools/Tags submenu in Perl menu.
If some class structure is too complicated, use Tools/Hierarchy-view
-from CPerl menu, or hierarchic view of imenu. The second one uses the
+from Perl menu, or hierarchic view of imenu. The second one uses the
current buffer only, the first one requires generation of TAGS from
-CPerl/Tools/Tags menu beforehand.
+Perl/Tools/Tags menu beforehand.
+
+Run Perl/Tools/Insert-spaces-if-needed to fix your lazy typing.
+
+Switch auto-help on/off with Perl/Tools/Auto-help.
-Run CPerl/Tools/Insert-spaces-if-needed to fix your lazy typing.
+Though with contemporary Emaxen CPerl mode should maintain the correct
+parsing of Perl even when editing, sometimes it may be lost. Fix this by
-Switch auto-help on/off with CPerl/Tools/Auto-help.
+ M-x norm RET
-Before reporting (non-)problems look in the problem section on what I
-know about them.")
+Before reporting (non-)problems look in the problem section of online
+micro-docs on what I know about CPerl problems.")
(defvar cperl-problems 'please-ignore-this-line
"Some faces will not be shown on some versions of Emacs unless you
@@ -1322,13 +1495,14 @@ install choose-color.el, available from
Emacs had a _very_ restricted syntax parsing engine until RMS's Emacs
20.1. Most problems below are corrected starting from this version of
-Emacs, and all of them should go with (future) RMS's version 20.3.
+Emacs, and all of them should go with RMS's version 20.3.
+(Or apply patches to Emacs 19.33/34 - see tips.)
Note that even with newer Emacsen interaction of `font-lock' and
syntaxification is not cleaned up. You may get slightly different
colors basing on the order of fontification and syntaxification. This
might be corrected by setting `cperl-syntaxify-by-font-lock' to t, but
-the corresponding code is still extremely buggy.
+the corresponding code may still contain some bugs.
Even with older Emacsen CPerl mode tries to corrects some Emacs
misunderstandings, however, for efficiency reasons the degree of
@@ -1350,9 +1524,10 @@ to insert it as $ {aaa} (legal in perl5, not in perl4).
Similar problems arise in regexps, when /(\\s|$)/ should be rewritten
as /($|\\s)/. Note that such a transposition is not always possible.
-The solution is to upgrade your Emacs. Note that RMS's 20.2 has some
-bugs related to `syntax-table' text properties. Patches are available
-on the main CPerl download site, and on CPAN.
+The solution is to upgrade your Emacs or patch an older one. Note
+that RMS's 20.2 has some bugs related to `syntax-table' text
+properties. Patches are available on the main CPerl download site,
+and on CPAN.
If these bugs cannot be fixed on your machine (say, you have an inferior
environment and cannot recompile), you may still disable all the fancy stuff
@@ -1360,7 +1535,9 @@ via `cperl-use-syntax-table-text-property'." )
(defvar cperl-non-problems 'please-ignore-this-line
"As you know from `problems' section, Perl syntax is too hard for CPerl on
-older Emacsen.
+older Emacsen. Here is what you can do if you cannot upgrade, or if
+you want to switch off these capabilities on RMS Emacs 20.2 (+patches) or 20.3
+or better. Please skip this docs if you run a capable Emacs already.
Most of the time, if you write your own code, you may find an equivalent
\(and almost as readable) expression (what is discussed below is usually
@@ -1419,8 +1596,11 @@ as far as bugs reports I see are concerned.")
1) It does 99% of Perl syntax correct (as opposed to 80-90% in Perl
mode - but the latter number may have improved too in last years) even
-without `syntax-table' property; When using this property, it should
-handle 99.995% of lines correct - or somesuch.
+with old Emaxen which do not support `syntax-table' property.
+
+When using `syntax-table' property for syntax assist hints, it should
+handle 99.995% of lines correct - or somesuch. It automatically
+updates syntax assist hints when you edit your script.
2) It is generally believed to be \"the most user-friendly Emacs
package\" whatever it may mean (I doubt that the people who say similar
@@ -1471,6 +1651,7 @@ voice);
n) Highlights (by user-choice) either 3-delimiters constructs
(such as tr/a/b/), or regular expressions and `y/tr'.
+ m) Highlights trailing whitespace.
5) The indentation engine was very smart, but most of tricks may be
not needed anymore with the support for `syntax-table' property. Has
@@ -1533,6 +1714,41 @@ B) Speed of editing operations.
of, say, long POD sections.
")
+(defvar cperl-tips-faces 'please-ignore-this-line
+ "CPerl mode uses following faces for highlighting:
+
+ cperl-array-face Array names
+ cperl-hash-face Hash names
+ font-lock-comment-face Comments, PODs and whatever is considered
+ syntaxically to be not code
+ font-lock-constant-face HERE-doc delimiters, labels, delimiters of
+ 2-arg operators s/y/tr/ or of RExen,
+ font-lock-function-name-face Special-cased m// and s//foo/, _ as
+ a target of a file tests, file tests,
+ subroutine names at the moment of definition
+ (except those conflicting with Perl operators),
+ package names (when recognized), format names
+ font-lock-keyword-face Control flow switch constructs, declarators
+ cperl-nonoverridable-face Non-overridable keywords, modifiers of RExen
+ font-lock-string-face Strings, qw() constructs, RExen, POD sections,
+ literal parts and the terminator of formats
+ and whatever is syntaxically considered
+ as string literals
+ font-lock-type-face Overridable keywords
+ font-lock-variable-name-face Variable declarations, indirect array and
+ hash names, POD headers/item names
+ cperl-invalid-face Trailing whitespace
+
+Note that in several situations the highlighting tries to inform about
+possible confusion, such as different colors for function names in
+declarations depending on what they (do not) override, or special cases
+m// and s/// which do not do what one would expect them to do.
+
+Help with best setup of these faces for printout requested (for each of
+the faces: please specify bold, italic, underline, shadow and box.)
+
+\(Not finished.)")
+
;;; Portability stuff:
@@ -1774,6 +1990,8 @@ B) Speed of editing operations.
["Insert spaces if needed" cperl-find-bad-style t]
["Class Hierarchy from TAGS" cperl-tags-hier-init t]
;;["Update classes" (cperl-tags-hier-init t) tags-table-list]
+ ["CPerl pretty print (exprmntl)" cperl-ps-print
+ (fboundp 'ps-extend-face-list)]
["Imenu on info" cperl-imenu-on-info (featurep 'imenu)]
("Tags"
;;; ["Create tags for current file" cperl-etags t]
@@ -1832,7 +2050,11 @@ B) Speed of editing operations.
["Non-problems" (describe-variable 'cperl-non-problems) t]
["Speed" (describe-variable 'cperl-speed) t]
["Praise" (describe-variable 'cperl-praise) t]
- ["CPerl mode" (describe-function 'cperl-mode) t]))))
+ ["Faces" (describe-variable 'cperl-tips-faces) t]
+ ["CPerl mode" (describe-function 'cperl-mode) t]
+ ["CPerl version"
+ (message "The version of master-file for this CPerl is %s"
+ cperl-version) t]))))
(error nil))
(autoload 'c-macro-expand "cmacexp"
@@ -2147,7 +2369,7 @@ or as help on variables `cperl-tips', `cperl-problems',
;; Fix broken font-lock:
(or (boundp 'font-lock-unfontify-region-function)
(set 'font-lock-unfontify-region-function
- 'font-lock-default-unfontify-buffer))
+ 'font-lock-default-unfontify-region))
(make-variable-buffer-local 'font-lock-unfontify-region-function)
(set 'font-lock-unfontify-region-function
'cperl-font-lock-unfontify-region-function)
@@ -2225,13 +2447,28 @@ or as help on variables `cperl-tips', `cperl-problems',
;; based on its context. Do fallback if comment is found wrong.
(defvar cperl-wrong-comment)
+(defvar cperl-st-cfence '(14)) ; Comment-fence
+(defvar cperl-st-sfence '(15)) ; String-fence
+(defvar cperl-st-punct '(1))
+(defvar cperl-st-word '(2))
+(defvar cperl-st-bra '(4 . ?\>))
+(defvar cperl-st-ket '(5 . ?\<))
+
(defun cperl-comment-indent ()
- (let ((p (point)) (c (current-column)) was)
+ (let ((p (point)) (c (current-column)) was phony)
(if (looking-at "^#") 0 ; Existing comment at bol stays there.
;; Wrong comment found
(save-excursion
- (setq was (cperl-to-comment-or-eol))
+ (setq was (cperl-to-comment-or-eol)
+ phony (eq (get-text-property (point) 'syntax-table)
+ cperl-st-cfence))
+ (if phony
+ (progn
+ (re-search-forward "#\\|$") ; Hmm, what about embedded #?
+ (if (eq (preceding-char) ?\#)
+ (forward-char -1))
+ (setq was nil)))
(if (= (point) p)
(progn
(skip-chars-backward " \t")
@@ -2935,11 +3172,13 @@ Return the amount the indentation changed by."
(looking-at "[a-zA-Z_][a-zA-Z0-9_]*:[^:]"))))
(defun cperl-get-state (&optional parse-start start-state)
- ;; returns list (START STATE DEPTH PRESTART), START is a good place
- ;; to start parsing, STATE is what is returned by
- ;; `parse-partial-sexp'. DEPTH is true is we are immediately after
- ;; end of block which contains START. PRESTART is the position
- ;; basing on which START was found.
+ ;; returns list (START STATE DEPTH PRESTART),
+ ;; START is a good place to start parsing, or equal to
+ ;; PARSE-START if preset,
+ ;; STATE is what is returned by `parse-partial-sexp'.
+ ;; DEPTH is true is we are immediately after end of block
+ ;; which contains START.
+ ;; PRESTART is the position basing on which START was found.
(save-excursion
(let ((start-point (point)) depth state start prestart)
(if (and parse-start
@@ -2960,7 +3199,6 @@ Return the amount the indentation changed by."
(beginning-of-line 2))) ; Go to the next line.
(if start (goto-char start))) ; Not at the start of file
(setq start (point))
- (if (< start start-point) (setq parse-start start))
(or state (setq state (parse-partial-sexp start start-point -1 nil start-state)))
(list start state depth prestart))))
@@ -2990,7 +3228,10 @@ Return the amount the indentation changed by."
(defun cperl-calculate-indent (&optional parse-data) ; was parse-start
"Return appropriate indentation for current line as Perl code.
In usual case returns an integer: the column to indent to.
-Returns nil if line starts inside a string, t if in a comment."
+Returns nil if line starts inside a string, t if in a comment.
+
+Will not correct the indentation for labels, but will correct it for braces
+and closing parentheses and brackets.."
(save-excursion
(if (or
(memq (get-text-property (point) 'syntax-type)
@@ -3030,19 +3271,21 @@ Returns nil if line starts inside a string, t if in a comment."
(goto-char pre-indent-point)
(let* ((case-fold-search nil)
(s-s (cperl-get-state (car parse-data) (nth 1 parse-data)))
- (start (nth 0 s-s))
+ (start (or (nth 2 parse-data)
+ (nth 0 s-s)))
(state (nth 1 s-s))
(containing-sexp (car (cdr state)))
- (start-indent (save-excursion
- (goto-char start)
- (- (current-indentation)
- (if (nth 2 s-s) cperl-indent-level 0))))
old-indent)
- (if parse-data
+ (if (and
+ ;;containing-sexp ;; We are buggy at toplevel :-(
+ parse-data)
(progn
(setcar parse-data pre-indent-point)
(setcar (cdr parse-data) state)
- (setq old-indent (nth 2 parse-data))))
+ (or (nth 2 parse-data)
+ (setcar (cddr parse-data) start))
+ ;; Before this point: end of statement
+ (setq old-indent (nth 3 parse-data))))
;; (or parse-start (null symbol)
;; (setq parse-start (symbol-value symbol)
;; start-indent (nth 2 parse-start)
@@ -3092,7 +3335,10 @@ Returns nil if line starts inside a string, t if in a comment."
;; unless that ends in a closeparen without semicolon,
;; in which case this line is the first argument decl.
(skip-chars-forward " \t")
- (+ start-indent
+ (+ (save-excursion
+ (goto-char start)
+ (- (current-indentation)
+ (if (nth 2 s-s) cperl-indent-level 0)))
(if (= char-after ?{) cperl-continued-brace-offset 0)
(progn
(cperl-backward-to-noncomment (or old-indent (point-min)))
@@ -3101,10 +3347,12 @@ Returns nil if line starts inside a string, t if in a comment."
;; or function's arg decls. Set basic-indent accordingly.
;; Now add a little if this is a continuation line.
(if (or (bobp)
+ (eq (point) old-indent) ; old-indent was at comment
(eq (preceding-char) ?\;)
;; Had ?\) too
(and (eq (preceding-char) ?\})
- (cperl-after-block-and-statement-beg start))
+ (cperl-after-block-and-statement-beg
+ (point-min))) ; Was start - too close
(memq char-after (append ")]}" nil))
(and (eq (preceding-char) ?\:) ; label
(progn
@@ -3114,7 +3362,7 @@ Returns nil if line starts inside a string, t if in a comment."
(progn
(if (and parse-data
(not (eq char-after ?\C-j)))
- (setcdr (cdr parse-data)
+ (setcdr (cddr parse-data)
(list pre-indent-point)))
0)
cperl-continued-statement-offset))))
@@ -3146,11 +3394,13 @@ Returns nil if line starts inside a string, t if in a comment."
(cperl-backward-to-noncomment containing-sexp)
;; Back up over label lines, since they don't
;; affect whether our line is a continuation.
- (while (or (eq (preceding-char) ?\,)
+ ;; (Had \, too)
+ (while ;;(or (eq (preceding-char) ?\,)
(and (eq (preceding-char) ?:)
(or;;(eq (char-after (- (point) 2)) ?\') ; ????
(memq (char-syntax (char-after (- (point) 2)))
- '(?w ?_)))))
+ '(?w ?_))))
+ ;;)
(if (eq (preceding-char) ?\,)
;; Will go to beginning of line, essentially.
;; Will ignore embedded sexpr XXXX.
@@ -3166,12 +3416,22 @@ Returns nil if line starts inside a string, t if in a comment."
;; This line is continuation of preceding line's statement;
;; indent `cperl-continued-statement-offset' more than the
;; previous line of the statement.
+ ;;
+ ;; There might be a label on this line, just
+ ;; consider it bad style and ignore it.
(progn
(cperl-backward-to-start-of-continued-exp containing-sexp)
(+ (if (memq char-after (append "}])" nil))
0 ; Closing parenth
cperl-continued-statement-offset)
- (current-column)
+ (if (looking-at "\\w+[ \t]*:")
+ (if (> (current-indentation) cperl-min-label-indent)
+ (- (current-indentation) cperl-label-offset)
+ ;; Do not move `parse-data', this should
+ ;; be quick anyway (this comment comes
+ ;;from different location):
+ (cperl-calculate-indent))
+ (current-column))
(if (eq char-after ?\{)
cperl-continued-brace-offset 0)))
;; This line starts a new statement.
@@ -3487,13 +3747,6 @@ Returns true if comment is found."
(defsubst cperl-1+ (p)
(min (point-max) (1+ p)))
-(defvar cperl-st-cfence '(14)) ; Comment-fence
-(defvar cperl-st-sfence '(15)) ; String-fence
-(defvar cperl-st-punct '(1))
-(defvar cperl-st-word '(2))
-(defvar cperl-st-bra '(4 . ?\>))
-(defvar cperl-st-ket '(5 . ?\<))
-
(defsubst cperl-modify-syntax-type (at how)
(if (< at (point-max))
(progn
@@ -3537,7 +3790,7 @@ Returns true if comment is found."
(skip-chars-forward " \t")
;; ender means matching-char matcher.
(setq b (point)
- starter (char-after b)
+ starter (if (eobp) 0 (char-after b))
ender (cdr (assoc starter cperl-starters)))
;; What if starter == ?\\ ????
(if set-st
@@ -3642,11 +3895,15 @@ Returns true if comment is found."
;; Start-to-end is marked `here-doc-group' ==> t
;; The body is marked `syntax-type' ==> `here-doc'
;; The delimiter is marked `syntax-type' ==> `here-doc-delim'
-;; a) FORMATs:
+;; c) FORMATs:
;; After-initial-line--to-end is marked `syntax-type' ==> `format'
+;; d) 'Q'uoted string:
+;; part between markers inclusive is marked `syntax-type' ==> `string'
-(defun cperl-unwind-to-safe (before)
- (let ((pos (point)))
+(defun cperl-unwind-to-safe (before &optional end)
+ ;; if BEFORE, go to the previous start-of-line on each step of unwinding
+ (let ((pos (point)) opos)
+ (setq opos pos)
(while (and pos (get-text-property pos 'syntax-type))
(setq pos (previous-single-property-change pos 'syntax-type))
(if pos
@@ -3657,7 +3914,14 @@ Returns true if comment is found."
(setq pos (point)))
(goto-char (setq pos (cperl-1- pos))))
;; Up to the start
- (goto-char (point-min))))))
+ (goto-char (point-min))))
+ (if end
+ ;; Do the same for end, going small steps
+ (progn
+ (while (and end (get-text-property end 'syntax-type))
+ (setq pos end
+ end (next-single-property-change end 'syntax-type)))
+ (or end pos)))))
(defun cperl-find-pods-heres (&optional min max non-inter end ignore-max)
"Scans the buffer for hard-to-parse Perl constructions.
@@ -3693,10 +3957,10 @@ the sections using `cperl-pod-head-face', `cperl-pod-face',
(if (boundp 'font-lock-function-name-face)
font-lock-function-name-face
'font-lock-function-name-face))
- (font-lock-other-type-face
- (if (boundp 'font-lock-other-type-face)
- font-lock-other-type-face
- 'font-lock-other-type-face))
+ (cperl-nonoverridable-face
+ (if (boundp 'cperl-nonoverridable-face)
+ cperl-nonoverridable-face
+ 'cperl-nonoverridable-face))
(stop-point (if ignore-max
(point-max)
max))
@@ -3970,6 +4234,7 @@ the sections using `cperl-pod-head-face', `cperl-pod-face',
i b
c (char-after (match-beginning b1))
bb (char-after (1- (match-beginning b1))) ; tmp holder
+ ;; bb == "Not a stringy"
bb (if (eq b1 10) ; user variables/whatever
(or
(memq bb '(?\$ ?\@ ?\% ?\* ?\#)) ; $#y
@@ -3980,6 +4245,7 @@ the sections using `cperl-pod-head-face', `cperl-pod-face',
?\&))))
;; <file> or <$file>
(and (eq c ?\<)
+ ;; Do not stringify <FH> :
(save-match-data
(looking-at
"\\s *\\$?\\([_a-zA-Z:][_a-zA-Z0-9:]*\\s *\\)?>"))))
@@ -3995,10 +4261,10 @@ the sections using `cperl-pod-head-face', `cperl-pod-face',
;; What is below: regexp-p?
(and
(or (memq (preceding-char)
- (append (if (eq c ?\?)
+ (append (if (memq c '(?\? ?\<))
;; $a++ ? 1 : 2
- "~{(=|&*!,;"
- "~{(=|&+-*!,;") nil))
+ "~{(=|&*!,;:"
+ "~{(=|&+-*!,;:") nil))
(and (eq (preceding-char) ?\})
(cperl-after-block-p (point-min)))
(and (eq (char-syntax (preceding-char)) ?w)
@@ -4069,9 +4335,11 @@ the sections using `cperl-pod-head-face', `cperl-pod-face',
;; Considered as 1arg form
(progn
(cperl-commentify b (point) t)
+ (put-text-property b (point) 'syntax-type 'string)
(and go
- (setq e1 (1+ e1))
- (forward-char 1)))
+ (setq e1 (cperl-1+ e1))
+ (or (eobp)
+ (forward-char 1))))
(cperl-commentify b i t)
(if (looking-at "\\sw*e") ; s///e
(progn
@@ -4083,8 +4351,10 @@ the sections using `cperl-pod-head-face', `cperl-pod-face',
(if (and tag (eq (preceding-char) ?\>))
(progn
(cperl-modify-syntax-type (1- (point)) cperl-st-ket)
- (cperl-modify-syntax-type i cperl-st-bra))))
+ (cperl-modify-syntax-type i cperl-st-bra)))
+ (put-text-property b i 'syntax-type 'string))
(cperl-commentify b1 (point) t)
+ (put-text-property b (point) 'syntax-type 'string)
(if qtag
(cperl-modify-syntax-type (1+ i) cperl-st-punct))
(setq tail nil)))
@@ -4094,7 +4364,7 @@ the sections using `cperl-pod-head-face', `cperl-pod-face',
(forward-word 1) ; skip modifiers s///s
(if tail (cperl-commentify tail (point) t))
(cperl-postpone-fontification
- e1 (point) 'face font-lock-other-type-face)))
+ e1 (point) 'face cperl-nonoverridable-face)))
;; Check whether it is m// which means "previous match"
;; and highlight differently
(if (and (eq e (+ 2 b))
@@ -4118,7 +4388,7 @@ the sections using `cperl-pod-head-face', `cperl-pod-face',
(not (eq ?\< (char-after b)))))))
(progn
(cperl-postpone-fontification
- b (1+ b) 'face font-lock-constant-face)
+ b (cperl-1+ b) 'face font-lock-constant-face)
(cperl-postpone-fontification
(1- e) e 'face font-lock-constant-face))))
(if i2
@@ -4136,8 +4406,8 @@ the sections using `cperl-pod-head-face', `cperl-pod-face',
'(?\$ ?\@ ?\% ?\& ?\*))
nil
(setq state (parse-partial-sexp
- state-point (1- b) nil nil state)
- state-point (1- b))
+ state-point b nil nil state)
+ state-point b)
(if (or (nth 3 state) (nth 4 state))
nil
;; Mark as string
@@ -4233,7 +4503,7 @@ the sections using `cperl-pod-head-face', `cperl-pod-face',
(if (eq (char-syntax (preceding-char)) ?w) ; else {}
(save-excursion
(forward-sexp -1)
- (or (looking-at "\\(else\\|grep\\|map\\)\\>")
+ (or (looking-at "\\(else\\|grep\\|map\\|BEGIN\\|END\\)\\>")
;; sub f {}
(progn
(cperl-backward-to-noncomment lim)
@@ -4257,11 +4527,19 @@ CHARS is a string that contains good characters to have before us (however,
(setq p (point))
(beginning-of-line)
(if (looking-at "^[ \t]*\\(#\\|$\\)") nil ; Only comment, skip
- ;; Else: last iteration (What to do with labels?)
+ ;; Else: last iteration, or a label
(cperl-to-comment-or-eol)
(skip-chars-backward " \t")
(if (< p (point)) (goto-char p))
- (setq stop t)))
+ (setq p (point))
+ (if (and (eq (preceding-char) ?:)
+ (progn
+ (forward-char -1)
+ (skip-chars-backward " \t\n\f" lim)
+ (eq (char-syntax (preceding-char)) ?w)))
+ (forward-sexp -1) ; Possibly label. Skip it
+ (goto-char p)
+ (setq stop t))))
(or (bobp) ; ???? Needed
(eq (point) lim)
(progn
@@ -4300,8 +4578,9 @@ CHARS is a string that contains good characters to have before us (however,
(defun cperl-indent-exp ()
"Simple variant of indentation of continued-sexp.
-Should be slow. Will not indent comment if it starts at `comment-indent'
-or looks like continuation of the comment on the previous line.
+
+Will not indent comment if it starts at `comment-indent' or looks like
+continuation of the comment on the previous line.
If `cperl-indent-region-fix-constructs', will improve spacing on
conditional/loop constructs."
@@ -4319,7 +4598,10 @@ conditional/loop constructs."
(while (< (point) tmp-end)
(parse-partial-sexp (point) tmp-end nil t) ; To start-sexp or eol
(or (eolp) (forward-sexp 1)))
- (if (> (point) tmp-end) (progn (end-of-line) (setq tmp-end (point)))
+ (if (> (point) tmp-end)
+ (save-excursion
+ (end-of-line)
+ (setq tmp-end (point)))
(setq done t)))
(goto-char tmp-end)
(setq tmp-end (point-marker)))
@@ -4328,16 +4610,18 @@ conditional/loop constructs."
(cperl-indent-region (point) tmp-end))))
(defun cperl-fix-line-spacing (&optional end parse-data)
- "Improve whitespace in a conditional/loop construct."
+ "Improve whitespace in a conditional/loop construct.
+Returns some position at the last line."
(interactive)
(or end
(setq end (point-max)))
- (let (p pp ml have-brace
+ (let (p pp ml have-brace ret
(ee (save-excursion (end-of-line) (point)))
(cperl-indent-region-fix-constructs
(or cperl-indent-region-fix-constructs 1)))
(save-excursion
(beginning-of-line)
+ (setq ret (point))
;; }? continue
;; blah; }
(if (not
@@ -4429,8 +4713,11 @@ conditional/loop constructs."
(progn
(delete-horizontal-space)
(insert "\n")
+ (setq ret (point))
(if (cperl-indent-line parse-data)
- (cperl-fix-line-spacing end parse-data)))
+ (progn
+ (cperl-fix-line-spacing end parse-data)
+ (setq ret (point)))))
(insert
(make-string cperl-indent-region-fix-constructs ?\ ))))
((and (looking-at "[ \t]*\n")
@@ -4457,8 +4744,9 @@ conditional/loop constructs."
(goto-char (1+ pp))
(delete-horizontal-space)
(insert "\n")
+ (setq ret (point))
(if (cperl-indent-line parse-data)
- (cperl-fix-line-spacing end parse-data))))))))))
+ (setq ret (cperl-fix-line-spacing end parse-data)))))))))))
(beginning-of-line)
(setq p (point) pp (save-excursion (end-of-line) (point))) ; May be different from ee.
;; Now check whether there is a hanging `}'
@@ -4494,10 +4782,12 @@ conditional/loop constructs."
(and (eq (preceding-char) ?\} )
(cperl-after-block-p (point-min)))
(insert ";"))
- (insert "\n"))
+ (insert "\n")
+ (setq ret (point)))
(if (cperl-indent-line parse-data)
- (cperl-fix-line-spacing end parse-data))
- (beginning-of-line)))))))
+ (setq ret (cperl-fix-line-spacing end parse-data)))
+ (beginning-of-line)))))
+ ret))
(defvar cperl-update-start) ; Do not need to make them local
(defvar cperl-update-end)
@@ -4518,9 +4808,9 @@ conditional/loop constructs."
(cperl-update-syntaxification end end)
(save-excursion
(let (cperl-update-start cperl-update-end (h-a-c after-change-functions))
- (let (st comm old-comm-indent new-comm-indent p pp i
+ (let (st comm old-comm-indent new-comm-indent p pp i empty
(indent-info (if cperl-emacs-can-parse
- (list nil nil) ; Cannot use '(), since will modify
+ (list nil nil nil) ; Cannot use '(), since will modify
nil))
after-change-functions ; Speed it up!
(pm 0) (imenu-scanning-message "Indenting... (%3d%%)"))
@@ -4539,13 +4829,18 @@ conditional/loop constructs."
(imenu-progress-message
pm (/ (* 100 (- (point) start)) (- end start -1))))
(setq st (point))
- (if (and (setq comm (looking-at "[ \t]*#"))
- (or (eq (current-indentation) (or old-comm-indent
- comment-column))
- (setq old-comm-indent nil)))
+ (if (or
+ (setq empty (looking-at "[ \t]*\n"))
+ (and (setq comm (looking-at "[ \t]*#"))
+ (or (eq (current-indentation) (or old-comm-indent
+ comment-column))
+ (setq old-comm-indent nil))))
(if (and old-comm-indent
+ (not empty)
(= (current-indentation) old-comm-indent)
- (not (eq (get-text-property (point) 'syntax-type) 'pod)))
+ (not (eq (get-text-property (point) 'syntax-type) 'pod))
+ (not (eq (get-text-property (point) 'syntax-table)
+ cperl-st-cfence)))
(let ((comment-column new-comm-indent))
(indent-for-comment)))
(progn
@@ -4554,12 +4849,15 @@ conditional/loop constructs."
(not i)
(progn
(if cperl-indent-region-fix-constructs
- (cperl-fix-line-spacing end indent-info))
+ (goto-char (cperl-fix-line-spacing end indent-info)))
(if (setq old-comm-indent
(and (cperl-to-comment-or-eol)
(not (memq (get-text-property (point)
'syntax-type)
'(pod here-doc)))
+ (not (eq (get-text-property (point)
+ 'syntax-table)
+ cperl-st-cfence))
(current-column)))
(progn (indent-for-comment)
(skip-chars-backward " \t")
@@ -4917,7 +5215,10 @@ indentation and initial hashes. Behaves usually outside of comment."
(defun cperl-init-faces-weak ()
;; Allow `cperl-find-pods-heres' to run.
(or (boundp 'font-lock-constant-face)
- (setq font-lock-constant-face 'font-lock-constant-face)))
+ (cperl-force-face font-lock-constant-face
+ "Face for constant and label names")
+ ;;(setq font-lock-constant-face 'font-lock-constant-face)
+ ))
(defun cperl-init-faces ()
(condition-case errs
@@ -4932,6 +5233,7 @@ indentation and initial hashes. Behaves usually outside of comment."
(setq
t-font-lock-keywords
(list
+ (list "[ \t]+$" 0 cperl-invalid-face t)
(cons
(concat
"\\(^\\|[^$@%&\\]\\)\\<\\("
@@ -5038,14 +5340,14 @@ indentation and initial hashes. Behaves usually outside of comment."
"u\\(se\\|n\\(shift\\|ti\\(l\\|e\\)\\|def\\|less\\)\\)\\|"
"while\\|y\\|__\\(END\\|DATA\\)__" ;__DATA__ added manually
"\\|[sm]" ; Added manually
- "\\)\\>") 2 'font-lock-other-type-face)
+ "\\)\\>") 2 'cperl-nonoverridable-face)
;; (mapconcat 'identity
;; '("#endif" "#else" "#ifdef" "#ifndef" "#if"
;; "#include" "#define" "#undef")
;; "\\|")
'("-[rwxoRWXOezsfdlpSbctugkTBMAC]\\>\\([ \t]+_\\>\\)?" 0
font-lock-function-name-face keep) ; Not very good, triggers at "[a-z]"
- '("\\<sub[ \t]+\\([^ \t{;]+\\)[ \t]*\\(([^()]*)[ \t]*\\)?[#{\n]" 1
+ '("\\<sub[ \t]+\\([^ \t{;()]+\\)[ \t]*\\(([^()]*)[ \t]*\\)?[#{\n]" 1
font-lock-function-name-face)
'("\\<\\(package\\|require\\|use\\|import\\|no\\|bootstrap\\)[ \t]+\\([a-zA-z_][a-zA-z_0-9:]*\\)[ \t;]" ; require A if B;
2 font-lock-function-name-face)
@@ -5140,12 +5442,6 @@ indentation and initial hashes. Behaves usually outside of comment."
nil
[nil nil t t t]
nil)
- (list 'font-lock-keyword-face
- ["Purple" "LightSteelBlue" "DimGray" "Gray90"]
- nil
- [nil nil t t t]
- nil
- nil)
(list 'font-lock-function-name-face
(vector
"Blue" "LightSkyBlue" "Gray50" "LightGray"
@@ -5178,7 +5474,7 @@ indentation and initial hashes. Behaves usually outside of comment."
nil
[nil nil t t t]
)
- (list 'font-lock-other-type-face
+ (list 'cperl-nonoverridable-face
["chartreuse3" ("orchid1" "orange")
nil "Gray80"]
[nil nil "gray90"]
@@ -5216,12 +5512,10 @@ indentation and initial hashes. Behaves usually outside of comment."
"Face for variable names")
(cperl-force-face font-lock-type-face
"Face for data types")
- (cperl-force-face font-lock-other-type-face
+ (cperl-force-face cperl-nonoverridable-face
"Face for data types from another group")
(cperl-force-face font-lock-comment-face
"Face for comments")
- (cperl-force-face font-lock-keyword-face
- "Face for keywords")
(cperl-force-face font-lock-function-name-face
"Face for function names")
(cperl-force-face cperl-hash-face
@@ -5234,9 +5528,9 @@ indentation and initial hashes. Behaves usually outside of comment."
;; (defconst font-lock-type-face
;; 'font-lock-type-face
;; "Face to use for data types."))
- ;;(or (boundp 'font-lock-other-type-face)
- ;; (defconst font-lock-other-type-face
- ;; 'font-lock-other-type-face
+ ;;(or (boundp 'cperl-nonoverridable-face)
+ ;; (defconst cperl-nonoverridable-face
+ ;; 'cperl-nonoverridable-face
;; "Face to use for data types from another group."))
;;(if (not cperl-xemacs-p) nil
;; (or (boundp 'font-lock-comment-face)
@@ -5260,6 +5554,11 @@ indentation and initial hashes. Behaves usually outside of comment."
(cperl-is-face 'font-lock-other-emphasized-face))
(copy-face 'font-lock-other-emphasized-face
'cperl-hash-face))
+ (if (and
+ (not (cperl-is-face 'cperl-nonoverridable-face))
+ (cperl-is-face 'font-lock-other-type-face))
+ (copy-face 'font-lock-other-type-face
+ 'cperl-nonoverridable-face))
;;(or (boundp 'cperl-hash-face)
;; (defconst cperl-hash-face
;; 'cperl-hash-face
@@ -5308,54 +5607,54 @@ indentation and initial hashes. Behaves usually outside of comment."
"pink")))
(t
(set-face-background 'font-lock-type-face "gray90"))))
- (if (cperl-is-face 'font-lock-other-type-face)
+ (if (cperl-is-face 'cperl-nonoverridable-face)
nil
- (copy-face 'font-lock-type-face 'font-lock-other-type-face)
+ (copy-face 'font-lock-type-face 'cperl-nonoverridable-face)
(cond
((eq background 'light)
- (set-face-foreground 'font-lock-other-type-face
+ (set-face-foreground 'cperl-nonoverridable-face
(if (x-color-defined-p "chartreuse3")
"chartreuse3"
"chartreuse")))
((eq background 'dark)
- (set-face-foreground 'font-lock-other-type-face
+ (set-face-foreground 'cperl-nonoverridable-face
(if (x-color-defined-p "orchid1")
"orchid1"
"orange")))))
- (if (cperl-is-face 'font-lock-other-emphasized-face) nil
- (copy-face 'bold-italic 'font-lock-other-emphasized-face)
- (cond
- ((eq background 'light)
- (set-face-background 'font-lock-other-emphasized-face
- (if (x-color-defined-p "lightyellow2")
- "lightyellow2"
- (if (x-color-defined-p "lightyellow")
- "lightyellow"
- "light yellow"))))
- ((eq background 'dark)
- (set-face-background 'font-lock-other-emphasized-face
- (if (x-color-defined-p "navy")
- "navy"
- (if (x-color-defined-p "darkgreen")
- "darkgreen"
- "dark green"))))
- (t (set-face-background 'font-lock-other-emphasized-face "gray90"))))
- (if (cperl-is-face 'font-lock-emphasized-face) nil
- (copy-face 'bold 'font-lock-emphasized-face)
- (cond
- ((eq background 'light)
- (set-face-background 'font-lock-emphasized-face
- (if (x-color-defined-p "lightyellow2")
- "lightyellow2"
- "lightyellow")))
- ((eq background 'dark)
- (set-face-background 'font-lock-emphasized-face
- (if (x-color-defined-p "navy")
- "navy"
- (if (x-color-defined-p "darkgreen")
- "darkgreen"
- "dark green"))))
- (t (set-face-background 'font-lock-emphasized-face "gray90"))))
+;;; (if (cperl-is-face 'font-lock-other-emphasized-face) nil
+;;; (copy-face 'bold-italic 'font-lock-other-emphasized-face)
+;;; (cond
+;;; ((eq background 'light)
+;;; (set-face-background 'font-lock-other-emphasized-face
+;;; (if (x-color-defined-p "lightyellow2")
+;;; "lightyellow2"
+;;; (if (x-color-defined-p "lightyellow")
+;;; "lightyellow"
+;;; "light yellow"))))
+;;; ((eq background 'dark)
+;;; (set-face-background 'font-lock-other-emphasized-face
+;;; (if (x-color-defined-p "navy")
+;;; "navy"
+;;; (if (x-color-defined-p "darkgreen")
+;;; "darkgreen"
+;;; "dark green"))))
+;;; (t (set-face-background 'font-lock-other-emphasized-face "gray90"))))
+;;; (if (cperl-is-face 'font-lock-emphasized-face) nil
+;;; (copy-face 'bold 'font-lock-emphasized-face)
+;;; (cond
+;;; ((eq background 'light)
+;;; (set-face-background 'font-lock-emphasized-face
+;;; (if (x-color-defined-p "lightyellow2")
+;;; "lightyellow2"
+;;; "lightyellow")))
+;;; ((eq background 'dark)
+;;; (set-face-background 'font-lock-emphasized-face
+;;; (if (x-color-defined-p "navy")
+;;; "navy"
+;;; (if (x-color-defined-p "darkgreen")
+;;; "darkgreen"
+;;; "dark green"))))
+;;; (t (set-face-background 'font-lock-emphasized-face "gray90"))))
(if (cperl-is-face 'font-lock-variable-name-face) nil
(copy-face 'italic 'font-lock-variable-name-face))
(if (cperl-is-face 'font-lock-constant-face) nil
@@ -5366,30 +5665,79 @@ indentation and initial hashes. Behaves usually outside of comment."
(defun cperl-ps-print-init ()
"Initialization of `ps-print' components for faces used in CPerl."
- ;; Guard against old versions
- (defvar ps-underlined-faces nil)
- (defvar ps-bold-faces nil)
- (defvar ps-italic-faces nil)
- (setq ps-bold-faces
- (append '(font-lock-emphasized-face
- font-lock-keyword-face
- font-lock-variable-name-face
- font-lock-constant-face
- font-lock-reference-face
- font-lock-other-emphasized-face)
- ps-bold-faces))
- (setq ps-italic-faces
- (append '(font-lock-other-type-face
- font-lock-constant-face
- font-lock-reference-face
- font-lock-other-emphasized-face)
- ps-italic-faces))
- (setq ps-underlined-faces
- (append '(font-lock-emphasized-face
- font-lock-other-emphasized-face
- font-lock-other-type-face font-lock-type-face)
- ps-underlined-faces))
- (cons 'font-lock-type-face ps-underlined-faces))
+ (eval-after-load "ps-print"
+ '(setq ps-bold-faces
+ ;; font-lock-variable-name-face
+ ;; font-lock-constant-face
+ (append '(cperl-array-face
+ cperl-hash-face)
+ ps-bold-faces)
+ ps-italic-faces
+ ;; font-lock-constant-face
+ (append '(cperl-nonoverridable-face
+ cperl-hash-face)
+ ps-italic-faces)
+ ps-underlined-faces
+ ;; font-lock-type-face
+ (append '(cperl-array-face
+ cperl-hash-face
+ underline
+ cperl-nonoverridable-face)
+ ps-underlined-faces))))
+
+(defvar ps-print-face-extension-alist)
+
+(defun cperl-ps-print (&optional file)
+ "Pretty-print in CPerl style.
+If optional argument FILE is an empty string, prints to printer, otherwise
+to the file FILE. If FILE is nil, prompts for a file name.
+
+Style of printout regulated by the variable `cperl-ps-print-face-properties'."
+ (interactive)
+ (or file
+ (setq file (read-from-minibuffer
+ "Print to file (if empty - to printer): "
+ (concat (buffer-file-name) ".ps")
+ nil nil 'file-name-history)))
+ (or (> (length file) 0)
+ (setq file nil))
+ (require 'ps-print) ; To get ps-print-face-extension-alist
+ (let ((ps-print-color-p t)
+ (ps-print-face-extension-alist ps-print-face-extension-alist))
+ (cperl-ps-extend-face-list cperl-ps-print-face-properties)
+ (ps-print-buffer-with-faces file)))
+
+;;; (defun cperl-ps-print-init ()
+;;; "Initialization of `ps-print' components for faces used in CPerl."
+;;; ;; Guard against old versions
+;;; (defvar ps-underlined-faces nil)
+;;; (defvar ps-bold-faces nil)
+;;; (defvar ps-italic-faces nil)
+;;; (setq ps-bold-faces
+;;; (append '(font-lock-emphasized-face
+;;; cperl-array-face
+;;; font-lock-keyword-face
+;;; font-lock-variable-name-face
+;;; font-lock-constant-face
+;;; font-lock-reference-face
+;;; font-lock-other-emphasized-face
+;;; cperl-hash-face)
+;;; ps-bold-faces))
+;;; (setq ps-italic-faces
+;;; (append '(cperl-nonoverridable-face
+;;; font-lock-constant-face
+;;; font-lock-reference-face
+;;; font-lock-other-emphasized-face
+;;; cperl-hash-face)
+;;; ps-italic-faces))
+;;; (setq ps-underlined-faces
+;;; (append '(font-lock-emphasized-face
+;;; cperl-array-face
+;;; font-lock-other-emphasized-face
+;;; cperl-hash-face
+;;; cperl-nonoverridable-face font-lock-type-face)
+;;; ps-underlined-faces))
+;;; (cons 'font-lock-type-face ps-underlined-faces))
(if (cperl-enable-font-lock) (cperl-windowed-init))
@@ -5457,7 +5805,7 @@ indentation and initial hashes. Behaves usually outside of comment."
;;(cperl-extra-newline-before-brace . nil) ; ???
(cperl-continued-statement-offset . 4)))
"(Experimental) list of variables to set to get a particular indentation style.
-Should be used via `cperl-set-style' or via CPerl menu.")
+Should be used via `cperl-set-style' or via Perl menu.")
(defun cperl-set-style (style)
"Set CPerl-mode variables to use one of several different indentation styles.
@@ -5799,7 +6147,9 @@ See `cperl-lazy-help-time' too."
"Toggle whether `indent-region'/`indent-sexp' fix whitespace too."
(interactive)
(setq cperl-indent-region-fix-constructs
- (not cperl-indent-region-fix-constructs))
+ (if cperl-indent-region-fix-constructs
+ nil
+ 1))
(message "indent-region/indent-sexp will %sbe automatically fix whitespace."
(if cperl-indent-region-fix-constructs "" "not ")))
@@ -5889,8 +6239,10 @@ See `cperl-lazy-help-time' too."
(lambda (elt)
(cond ((string-match "^[_a-zA-Z]" (car elt))
(goto-char (cdr elt))
+ (beginning-of-line) ; pos should be of the start of the line
(list (car elt)
- (point) (count-lines 1 (point))
+ (point)
+ (1+ (count-lines 1 (point))) ; 1+ since at beg-o-l
(buffer-substring (progn
(skip-chars-forward
":_a-zA-Z0-9")
@@ -5911,9 +6263,9 @@ See `cperl-lazy-help-time' too."
(substring (car elt) 8)
(car elt) )
1
- (number-to-string (elt elt 1))
+ (number-to-string (elt elt 2)) ; Line
","
- (number-to-string (elt elt 2))
+ (number-to-string (1- (elt elt 1))) ; Char pos 0-based
"\n")
(if (and (string-match "^[_a-zA-Z]+::" (car elt))
(string-match "^sub[ \t]+\\([_a-zA-Z]+\\)[^:_a-zA-Z]"
@@ -5965,11 +6317,13 @@ Use as
(setq topdir default-directory))
(let ((tags-file-name "TAGS")
(case-fold-search (eq system-type 'emx))
- xs)
+ xs rel)
(save-excursion
(cond (inbuffer nil) ; Already there
((file-exists-p tags-file-name)
- (visit-tags-table-buffer tags-file-name))
+ (if cperl-xemacs-p
+ (visit-tags-table-buffer)
+ (visit-tags-table-buffer tags-file-name)))
(t (set-buffer (find-file-noselect tags-file-name))))
(cond
(dir
@@ -6000,7 +6354,12 @@ Use as
(erase (erase-buffer))
(t
(goto-char 1)
- (if (search-forward (concat "\f\n" file ",") nil t)
+ (setq rel file)
+ ;; On case-preserving filesystems (EMX on OS/2) case might be encoded in properties
+ (set-text-properties 0 (length rel) nil rel)
+ (and (equal topdir (substring rel 0 (length topdir)))
+ (setq rel (substring file (length topdir))))
+ (if (search-forward (concat "\f\n" rel ",") nil t)
(progn
(search-backward "\f\n")
(delete-region (point)
@@ -6052,11 +6411,12 @@ Use as
(setq ;;str (buffer-substring (match-beginning 1) (match-end 1))
name (buffer-substring (match-beginning 2) (match-end 2))
;;pos (buffer-substring (match-beginning 3) (match-end 3))
- line (buffer-substring (match-beginning 4) (match-end 4))
+ line (buffer-substring (match-beginning 3) (match-end 3))
ord (if pack 1 0)
- info (etags-snarf-tag) ; Moves to beginning of the next line
file (file-of-tag)
- fileind (format "%s:%s" file line))
+ fileind (format "%s:%s" file line)
+ ;; Moves to beginning of the next line:
+ info (cperl-etags-snarf-tag file line))
;; Move back
(forward-char -1)
;; Make new member of hierarchy name ==> file ==> pos if needed
@@ -6082,22 +6442,31 @@ One may build such TAGS files from CPerl mode menu."
(require 'etags)
(require 'imenu)
(if (or update (null (nth 2 cperl-hierarchy)))
- (let (pack name cons1 to l1 l2 l3 l4
+ (let (pack name cons1 to l1 l2 l3 l4 b
(remover (function (lambda (elt) ; (name (file1...) (file2..))
(or (nthcdr 2 elt)
;; Only in one file
(setcdr elt (cdr (nth 1 elt))))))))
;; (setq cperl-hierarchy '(() () ())) ; Would write into '() later!
(setq cperl-hierarchy (list l1 l2 l3))
- (or tags-table-list
- (call-interactively 'visit-tags-table))
- (message "Updating list of classes...")
- (mapcar
- (function
- (lambda (tagsfile)
- (set-buffer (get-file-buffer tagsfile))
- (cperl-tags-hier-fill)))
- tags-table-list)
+ (if cperl-xemacs-p ; Not checked
+ (progn
+ (or tags-file-name
+ ;; Does this work in XEmacs?
+ (call-interactively 'visit-tags-table))
+ (message "Updating list of classes...")
+ (set-buffer (get-file-buffer tags-file-name))
+ (cperl-tags-hier-fill))
+ (or tags-table-list
+ (call-interactively 'visit-tags-table))
+ (mapcar
+ (function
+ (lambda (tagsfile)
+ (message "Updating list of classes... %s" tagsfile)
+ (set-buffer (get-file-buffer tagsfile))
+ (cperl-tags-hier-fill)))
+ tags-table-list)
+ (message "Updating list of classes... postprocessing..."))
(mapcar remover (car cperl-hierarchy))
(mapcar remover (nth 1 cperl-hierarchy))
(setq to (list nil (cons "Packages: " (nth 1 cperl-hierarchy))
@@ -6122,7 +6491,7 @@ One may build such TAGS files from CPerl mode menu."
(if (vectorp update)
(progn
(find-file (elt update 0))
- (etags-goto-tag-location (elt update 1))))
+ (cperl-etags-goto-tag-location (elt update 1))))
(if (eq update -999) (cperl-tags-hier-init t)))
(defun cperl-tags-treeify (to level)
@@ -7127,7 +7496,7 @@ We suppose that the regexp is scanned already."
(or done (forward-char -1)))))
(defun cperl-contract-level ()
- "Find an enclosing group in regexp and contract it. Unfinished.
+ "Find an enclosing group in regexp and contract it.
\(Experimental, may change semantics, recheck the result.)
We suppose that the regexp is scanned already."
(interactive)
@@ -7150,7 +7519,7 @@ We suppose that the regexp is scanned already."
(just-one-space))))))
(defun cperl-contract-levels ()
- "Find an enclosing group in regexp and contract all the kids. Unfinished.
+ "Find an enclosing group in regexp and contract all the kids.
\(Experimental, may change semantics, recheck the result.)
We suppose that the regexp is scanned already."
(interactive)
@@ -7388,9 +7757,12 @@ We suppose that the regexp is scanned already."
(defvar cperl-d-l nil)
(defun cperl-fontify-syntaxically (end)
- (and cperl-syntaxify-unwind
- (cperl-unwind-to-safe t))
- (let ((start (point)) (dbg (point)))
+ ;; Some vars for debugging only
+ (let (start (dbg (point)) (iend end)
+ (istate (car cperl-syntax-state)))
+ (and cperl-syntaxify-unwind
+ (setq end (cperl-unwind-to-safe t end)))
+ (setq start (point))
(or cperl-syntax-done-to
(setq cperl-syntax-done-to (point-min)))
(if (or (not (boundp 'font-lock-hot-pass))
@@ -7410,9 +7782,10 @@ We suppose that the regexp is scanned already."
;;(princ (format "Syntaxifying %s..%s from %s to %s\n"
;; dbg end start cperl-syntax-done-to)))
(if (eq cperl-syntaxify-by-font-lock 'message)
- (message "Syntaxified %s..%s from %s to %s, state at %s"
- dbg end start cperl-syntax-done-to
- (car cperl-syntax-state))) ; For debugging
+ (message "Syntaxified %s..%s from %s to %s(%s), state %s-->%s"
+ dbg iend
+ start end cperl-syntax-done-to
+ istate (car cperl-syntax-state))) ; For debugging
nil)) ; Do not iterate
(defun cperl-fontify-update (end)
@@ -7434,6 +7807,12 @@ We suppose that the regexp is scanned already."
(goto-char from)
(cperl-fontify-syntaxically to)))))
+(defvar cperl-version
+ (let ((v "$Revision: 4.19 $"))
+ (string-match ":\\s *\\([0-9.]+\\)" v)
+ (substring v (match-beginning 1) (match-end 1)))
+ "Version of IZ-supported CPerl package this file is based on.")
+
(provide 'cperl-mode)
;;; cperl-mode.el ends here