From: Stefan Monnier Date: Sun, 5 May 2013 02:26:38 +0000 (-0400) Subject: * lisp/progmodes/pascal.el (pascal--syntax-propertize): New const. X-Git-Url: http://git.hcoop.net/bpt/emacs.git/commitdiff_plain/aa7dab9754fc8f481520f94dd015450928f34446 * lisp/progmodes/pascal.el (pascal--syntax-propertize): New const. (pascal-mode): Use it. Use setq-local. (pascal-font-lock-keywords): Use backquotes. Merge the two entries that handle function definitions. * test/indent/pascal.pas: Add test for mis-identified comments. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 8c0414f7cf..20f293525b 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,10 @@ +2013-05-05 Stefan Monnier + + * progmodes/pascal.el (pascal-font-lock-keywords): Use backquotes. + Merge the two entries that handle function definitions. + (pascal--syntax-propertize): New const. + (pascal-mode): Use it. Use setq-local. + 2013-05-04 Glenn Morris * calendar/diary-lib.el (diary-from-outlook-function): New variable. diff --git a/lisp/progmodes/pascal.el b/lisp/progmodes/pascal.el index 829ecda515..ffc8200644 100644 --- a/lisp/progmodes/pascal.el +++ b/lisp/progmodes/pascal.el @@ -158,31 +158,44 @@ -(defconst pascal-font-lock-keywords (purecopy - (list - '("^[ \t]*\\(function\\|pro\\(cedure\\|gram\\)\\)\\>[ \t]*\\([a-z]\\)" +(defconst pascal-font-lock-keywords + `(("\\_<\\(function\\|pro\\(cedure\\|gram\\)\\)[ \t]+\\([[:alpha:]][[:alnum:]_]*\\)" + (1 font-lock-keyword-face) + (3 font-lock-function-name-face)) + ;; ("type" "const" "real" "integer" "char" "boolean" "var" + ;; "record" "array" "file") + (,(concat "\\<\\(array\\|boolean\\|c\\(har\\|onst\\)\\|file\\|" + "integer\\|re\\(al\\|cord\\)\\|type\\|var\\)\\>") + font-lock-type-face) + ("\\<\\(label\\|external\\|forward\\)\\>" . font-lock-constant-face) + ("\\<\\([0-9]+\\)[ \t]*:" 1 font-lock-function-name-face) + ;; ("of" "to" "for" "if" "then" "else" "case" "while" + ;; "do" "until" "and" "or" "not" "in" "with" "repeat" "begin" "end") + ,(concat "\\<\\(" + "and\\|begin\\|case\\|do\\|e\\(lse\\|nd\\)\\|for\\|i[fn]\\|" + "not\\|o[fr]\\|repeat\\|t\\(hen\\|o\\)\\|until\\|w\\(hile\\|ith\\)" + "\\)\\>") + ("\\<\\(goto\\)\\>[ \t]*\\([0-9]+\\)?" 1 font-lock-keyword-face) - '("^[ \t]*\\(function\\|pro\\(cedure\\|gram\\)\\)\\>[ \t]*\\([a-z][a-z0-9_]*\\)" - 3 font-lock-function-name-face t) -; ("type" "const" "real" "integer" "char" "boolean" "var" -; "record" "array" "file") - (cons (concat "\\<\\(array\\|boolean\\|c\\(har\\|onst\\)\\|file\\|" - "integer\\|re\\(al\\|cord\\)\\|type\\|var\\)\\>") - 'font-lock-type-face) - '("\\<\\(label\\|external\\|forward\\)\\>" . font-lock-constant-face) - '("\\<\\([0-9]+\\)[ \t]*:" 1 font-lock-function-name-face) -; ("of" "to" "for" "if" "then" "else" "case" "while" -; "do" "until" "and" "or" "not" "in" "with" "repeat" "begin" "end") - (concat "\\<\\(" - "and\\|begin\\|case\\|do\\|e\\(lse\\|nd\\)\\|for\\|i[fn]\\|" - "not\\|o[fr]\\|repeat\\|t\\(hen\\|o\\)\\|until\\|w\\(hile\\|ith\\)" - "\\)\\>") - '("\\<\\(goto\\)\\>[ \t]*\\([0-9]+\\)?" - 1 font-lock-keyword-face) - '("\\<\\(goto\\)\\>[ \t]*\\([0-9]+\\)?" - 2 font-lock-keyword-face t))) + ("\\<\\(goto\\)\\>[ \t]*\\([0-9]+\\)?" + 2 font-lock-keyword-face t)) "Additional expressions to highlight in Pascal mode.") -(put 'pascal-mode 'font-lock-defaults '(pascal-font-lock-keywords nil t)) + +(defconst pascal--syntax-propertize + (syntax-propertize-rules + ;; The syntax-table settings are too coarse and end up treating /* and (/ + ;; as comment starters. Fix it here by removing the "2" from the syntax + ;; of the second char of such sequences. + ("/\\(\\*\\)" (1 ". 3b")) + ("(\\(\\/\\)" (1 (prog1 ". 1c" (forward-char -1) nil))) + ;; Pascal uses '' and "" rather than \' and \" to escape quotes. + ("''\\|\"\"" (0 (if (save-excursion + (nth 3 (syntax-ppss (match-beginning 0)))) + (string-to-syntax ".") + ;; In case of 3 or more quotes in a row, only advance + ;; one quote at a time. + (forward-char -1) + nil))))) (defcustom pascal-indent-level 3 "Indentation of Pascal statements with respect to containing block." @@ -346,23 +359,22 @@ See also the user variables `pascal-type-keywords', `pascal-start-keywords' and Turning on Pascal mode calls the value of the variable pascal-mode-hook with no args, if that value is non-nil." - (set (make-local-variable 'local-abbrev-table) pascal-mode-abbrev-table) - (set (make-local-variable 'indent-line-function) 'pascal-indent-line) - (set (make-local-variable 'comment-indent-function) 'pascal-indent-comment) - (set (make-local-variable 'parse-sexp-ignore-comments) nil) - (set (make-local-variable 'blink-matching-paren-dont-ignore-comments) t) - (set (make-local-variable 'case-fold-search) t) - (set (make-local-variable 'comment-start) "{") - (set (make-local-variable 'comment-start-skip) "(\\*+ *\\|{ *") - (set (make-local-variable 'comment-end) "}") + (setq-local local-abbrev-table pascal-mode-abbrev-table) + (setq-local indent-line-function 'pascal-indent-line) + (setq-local comment-indent-function 'pascal-indent-comment) + (setq-local parse-sexp-ignore-comments nil) + (setq-local blink-matching-paren-dont-ignore-comments t) + (setq-local case-fold-search t) + (setq-local comment-start "{") + (setq-local comment-start-skip "(\\*+ *\\|{ *") + (setq-local comment-end "}") (add-hook 'completion-at-point-functions 'pascal-completions-at-point nil t) ;; Font lock support - (set (make-local-variable 'font-lock-defaults) - '(pascal-font-lock-keywords nil t)) + (setq-local font-lock-defaults '(pascal-font-lock-keywords nil t)) + (setq-local syntax-propertize-function pascal--syntax-propertize) ;; Imenu support - (set (make-local-variable 'imenu-generic-expression) - pascal-imenu-generic-expression) - (set (make-local-variable 'imenu-case-fold-search) t) + (setq-local imenu-generic-expression pascal-imenu-generic-expression) + (setq-local imenu-case-fold-search t) ;; Pascal-mode's own hide/show support. (add-to-invisibility-spec '(pascal . t))) diff --git a/test/ChangeLog b/test/ChangeLog index 52cc61bdc0..48d499a9fa 100644 --- a/test/ChangeLog +++ b/test/ChangeLog @@ -1,3 +1,7 @@ +2013-05-05 Stefan Monnier + + * indent/pascal.pas: Add test for mis-identified comments. + 2013-04-01 Masatake YAMATO * automated/imenu-tests.el: New file. (Bug#14112) @@ -5,7 +9,7 @@ 2013-04-19 Fabián Ezequiel Gallina * automated/python-tests.el (python-imenu-prev-index-position-1): - Removed test. + Remove test. (python-imenu-create-index-1, python-imenu-create-flat-index-1): New tests. @@ -62,8 +66,8 @@ (ruby-move-to-block-skips-percent-literal): Add depth-affecting bits inside the examples. (ruby-move-to-block-skips-heredoc): New test. - (ruby-add-log-current-method-after-inner-class): Lower - expectations: move point inside a method, initially. + (ruby-add-log-current-method-after-inner-class): + Lower expectations: move point inside a method, initially. 2013-02-13 Dmitry Gutov @@ -76,8 +80,8 @@ 2013-02-03 Chong Yidong - * automated/files.el (file-test--do-local-variables-test): Avoid - compilation warning message. + * automated/files.el (file-test--do-local-variables-test): + Avoid compilation warning message. 2013-01-27 Dmitry Gutov @@ -381,7 +385,7 @@ 2011-07-26 Ulf Jasper * automated/icalendar-tests.el (icalendar-tests--compare-strings): - Removed, simply use string=. + Remove, simply use string=. (icalendar--diarytime-to-isotime) (icalendar--datetime-to-diary-date) (icalendar--datestring-to-isodate) diff --git a/test/indent/pascal.pas b/test/indent/pascal.pas index 0dda0c47fe..e7203fece6 100644 --- a/test/indent/pascal.pas +++ b/test/indent/pascal.pas @@ -6,7 +6,7 @@ Author: Frank Heckenbach This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as -published by the Free Software Foundation, version 2. +published by the Free Software Foundation, version 3. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -25,7 +25,10 @@ by the GNU General Public License. } {$gnu-pascal,I+} +(* second style of comment *) // Free-pascal style comment. +var x:Char = 12 /* 45; // This /* does not start a comment. +var x:Char = (/ 4); // This (/ does not start a comment. program CRTDemo;