diff options
| author | Stefan Monnier | 2010-09-11 01:13:42 +0200 |
|---|---|---|
| committer | Stefan Monnier | 2010-09-11 01:13:42 +0200 |
| commit | cf38dd429888fc992408716922ecab1c39242944 (patch) | |
| tree | 97ee11df214e90b91f9da1620cdcec97acda8eb0 /lisp/progmodes/python.el | |
| parent | 71c17aecc32c876247062fd480304b147b266130 (diff) | |
| download | emacs-cf38dd429888fc992408716922ecab1c39242944.tar.gz emacs-cf38dd429888fc992408716922ecab1c39242944.zip | |
New syntax-propertize functionality.
* lisp/font-lock.el (font-lock-syntactic-keywords): Make obsolete.
(font-lock-fontify-syntactic-keywords-region): Move handling of
font-lock-syntactically-fontified to...
(font-lock-default-fontify-region): ...here.
Let syntax-propertize-function take precedence.
(font-lock-fontify-syntactically-region): Cal syntax-propertize.
* lisp/emacs-lisp/regexp-opt.el (regexp-opt-depth): Skip named groups.
* lisp/emacs-lisp/syntax.el (syntax-propertize-function)
(syntax-propertize-chunk-size, syntax-propertize--done)
(syntax-propertize-extend-region-functions): New vars.
(syntax-propertize-wholelines, syntax-propertize-multiline)
(syntax-propertize--shift-groups, syntax-propertize-via-font-lock)
(syntax-propertize): New functions.
(syntax-propertize-rules): New macro.
(syntax-ppss-flush-cache): Set syntax-propertize--done.
(syntax-ppss): Call syntax-propertize.
* lisp/progmodes/ada-mode.el (ada-set-syntax-table-properties)
(ada-after-change-function, ada-initialize-syntax-table-properties)
(ada-handle-syntax-table-properties): Only define when
syntax-propertize is not available.
(ada-mode): Use syntax-propertize-function.
* lisp/progmodes/autoconf.el (autoconf-mode):
Use syntax-propertize-function.
(autoconf-font-lock-syntactic-keywords): Remove.
* lisp/progmodes/cfengine.el (cfengine-mode):
Use syntax-propertize-function.
(cfengine-font-lock-syntactic-keywords): Remove.
* lisp/progmodes/cperl-mode.el (cperl-mode): Use syntax-propertize-function.
* lisp/progmodes/fortran.el (fortran-mode): Use syntax-propertize-function.
(fortran--font-lock-syntactic-keywords): New var.
(fortran-line-length): Update syntax-propertize-function and
fortran--font-lock-syntactic-keywords.
* lisp/progmodes/gud.el (gdb-script-syntax-propertize-function): New var;
replaces gdb-script-font-lock-syntactic-keywords.
(gdb-script-mode): Use it.
* lisp/progmodes/js.el (js--regexp-literal): Define while compiling.
(js-syntax-propertize-function): New var; replaces
js-font-lock-syntactic-keywords.
(js-mode): Use it.
* lisp/progmodes/make-mode.el (makefile-syntax-propertize-function):
New var; replaces makefile-font-lock-syntactic-keywords.
(makefile-mode): Use it.
(makefile-imake-mode): Adjust.
* lisp/progmodes/mixal-mode.el (mixal-syntax-propertize-function): New var;
replaces mixal-font-lock-syntactic-keywords.
(mixal-mode): Use it.
* lisp/progmodes/octave-mod.el (octave-syntax-propertize-sqs): New function
to replace octave-font-lock-close-quotes.
(octave-syntax-propertize-function): New function to replace
octave-font-lock-syntactic-keywords.
(octave-mode): Use it.
* lisp/progmodes/perl-mode.el (perl-syntax-propertize-function): New fun to
replace perl-font-lock-syntactic-keywords.
(perl-syntax-propertize-special-constructs): New fun to replace
perl-font-lock-special-syntactic-constructs.
(perl-font-lock-syntactic-face-function): New fun.
(perl-mode): Use it.
* lisp/progmodes/python.el (python-syntax-propertize-function): New var to
replace python-font-lock-syntactic-keywords.
(python-mode): Use it.
(python-quote-syntax): Simplify and adjust to new use.
* lisp/progmodes/ruby-mode.el (ruby-here-doc-beg-re):
Define while compiling.
(ruby-here-doc-end-re, ruby-here-doc-beg-match)
(ruby-font-lock-syntactic-keywords, ruby-comment-beg-syntax)
(syntax-ppss, ruby-in-ppss-context-p, ruby-in-here-doc-p)
(ruby-here-doc-find-end, ruby-here-doc-beg-syntax)
(ruby-here-doc-end-syntax): Only define when
syntax-propertize is not available.
(ruby-syntax-propertize-function, ruby-syntax-propertize-heredoc):
New functions.
(ruby-in-ppss-context-p): Update to new syntax of heredocs.
(electric-indent-chars): Silence bytecompiler.
(ruby-mode): Use prog-mode, syntax-propertize-function, and
electric-indent-chars.
* lisp/progmodes/sh-script.el (sh-st-symbol): Remove.
(sh-font-lock-close-heredoc, sh-font-lock-open-heredoc): Add eol arg.
(sh-font-lock-flush-syntax-ppss-cache, sh-font-lock-here-doc): Remove.
(sh-font-lock-quoted-subshell): Assume we've already matched $(.
(sh-font-lock-paren): Set syntax-multiline.
(sh-font-lock-syntactic-keywords): Remove.
(sh-syntax-propertize-function): New function to replace it.
(sh-mode): Use it.
* lisp/progmodes/simula.el (simula-syntax-propertize-function): New var to
replace simula-font-lock-syntactic-keywords.
(simula-mode): Use it.
* lisp/progmodes/tcl.el (tcl-syntax-propertize-function): New var to
replace tcl-font-lock-syntactic-keywords.
(tcl-mode): Use it.
* lisp/progmodes/vhdl-mode.el (vhdl-mode): Use syntax-propertize-function
if available.
(vhdl-fontify-buffer): Adjust.
* lisp/textmodes/bibtex.el (bibtex-mode): Use syntax-propertize-function.
* lisp/textmodes/reftex.el (font-lock-syntactic-keywords): Don't declare
since we don't use it.
* lisp/textmodes/sgml-mode.el (sgml-syntax-propertize-function): New var to
replace sgml-font-lock-syntactic-keywords.
(sgml-mode): Use it.
* lisp/textmodes/tex-mode.el (tex-common-initialization, doctex-mode):
Use syntax-propertize-function.
* lisp/textmodes/texinfo.el (texinfo-syntax-propertize-function): New fun
to replace texinfo-font-lock-syntactic-keywords.
(texinfo-mode): Use it.
* test/indent/octave.m: Remove some `fixindent' not needed any more.
Diffstat (limited to 'lisp/progmodes/python.el')
| -rw-r--r-- | lisp/progmodes/python.el | 96 |
1 files changed, 48 insertions, 48 deletions
diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el index 2f65ffa1e17..10e852223ce 100644 --- a/lisp/progmodes/python.el +++ b/lisp/progmodes/python.el | |||
| @@ -166,29 +166,32 @@ | |||
| 166 | symbol-end) | 166 | symbol-end) |
| 167 | . font-lock-builtin-face))) | 167 | . font-lock-builtin-face))) |
| 168 | 168 | ||
| 169 | (defconst python-font-lock-syntactic-keywords | 169 | (defconst python-syntax-propertize-function |
| 170 | ;; Make outer chars of matching triple-quote sequences into generic | 170 | ;; Make outer chars of matching triple-quote sequences into generic |
| 171 | ;; string delimiters. Fixme: Is there a better way? | 171 | ;; string delimiters. Fixme: Is there a better way? |
| 172 | ;; First avoid a sequence preceded by an odd number of backslashes. | 172 | ;; First avoid a sequence preceded by an odd number of backslashes. |
| 173 | `((,(rx (not (any ?\\)) | 173 | (syntax-propertize-rules |
| 174 | ?\\ (* (and ?\\ ?\\)) | 174 | (;; (rx (not (any ?\\)) |
| 175 | (group (syntax string-quote)) | 175 | ;; ?\\ (* (and ?\\ ?\\)) |
| 176 | (backref 1) | 176 | ;; (group (syntax string-quote)) |
| 177 | (group (backref 1))) | 177 | ;; (backref 1) |
| 178 | (2 ,(string-to-syntax "\""))) ; dummy | 178 | ;; (group (backref 1))) |
| 179 | (,(rx (group (optional (any "uUrR"))) ; prefix gets syntax property | 179 | ;; ĦBackrefs don't work in syntax-propertize-rules! |
| 180 | (optional (any "rR")) ; possible second prefix | 180 | "[^\\]\\\\\\(\\\\\\\\\\)*\\(?:''\\('\\)\\|\"\"\\(?2:\"\\)\\)" |
| 181 | (group (syntax string-quote)) ; maybe gets property | 181 | (2 "\"")) ; dummy |
| 182 | (backref 2) ; per first quote | 182 | (;; (rx (optional (group (any "uUrR"))) ; prefix gets syntax property |
| 183 | (group (backref 2))) ; maybe gets property | 183 | ;; (optional (any "rR")) ; possible second prefix |
| 184 | (1 (python-quote-syntax 1)) | 184 | ;; (group (syntax string-quote)) ; maybe gets property |
| 185 | (2 (python-quote-syntax 2)) | 185 | ;; (backref 2) ; per first quote |
| 186 | (3 (python-quote-syntax 3))) | 186 | ;; (group (backref 2))) ; maybe gets property |
| 187 | ;; This doesn't really help. | 187 | ;; ĦBackrefs don't work in syntax-propertize-rules! |
| 188 | ;;; (,(rx (and ?\\ (group ?\n))) (1 " ")) | 188 | "\\([RUru]\\)?[Rr]?\\(?:\\('\\)'\\('\\)\\|\\(?2:\"\\)\"\\(?3:\"\\)\\)" |
| 189 | )) | 189 | (3 (ignore (python-quote-syntax)))) |
| 190 | 190 | ;; This doesn't really help. | |
| 191 | (defun python-quote-syntax (n) | 191 | ;;((rx (and ?\\ (group ?\n))) (1 " ")) |
| 192 | )) | ||
| 193 | |||
| 194 | (defun python-quote-syntax () | ||
| 192 | "Put `syntax-table' property correctly on triple quote. | 195 | "Put `syntax-table' property correctly on triple quote. |
| 193 | Used for syntactic keywords. N is the match number (1, 2 or 3)." | 196 | Used for syntactic keywords. N is the match number (1, 2 or 3)." |
| 194 | ;; Given a triple quote, we have to check the context to know | 197 | ;; Given a triple quote, we have to check the context to know |
| @@ -206,28 +209,25 @@ Used for syntactic keywords. N is the match number (1, 2 or 3)." | |||
| 206 | ;; x '"""' x """ \"""" x | 209 | ;; x '"""' x """ \"""" x |
| 207 | (save-excursion | 210 | (save-excursion |
| 208 | (goto-char (match-beginning 0)) | 211 | (goto-char (match-beginning 0)) |
| 209 | (cond | 212 | (let ((syntax (save-match-data (syntax-ppss)))) |
| 210 | ;; Consider property for the last char if in a fenced string. | 213 | (cond |
| 211 | ((= n 3) | 214 | ((eq t (nth 3 syntax)) ; after unclosed fence |
| 212 | (let* ((font-lock-syntactic-keywords nil) | 215 | ;; Consider property for the last char if in a fenced string. |
| 213 | (syntax (syntax-ppss))) | 216 | (goto-char (nth 8 syntax)) ; fence position |
| 214 | (when (eq t (nth 3 syntax)) ; after unclosed fence | 217 | (skip-chars-forward "uUrR") ; skip any prefix |
| 215 | (goto-char (nth 8 syntax)) ; fence position | 218 | ;; Is it a matching sequence? |
| 216 | (skip-chars-forward "uUrR") ; skip any prefix | 219 | (if (eq (char-after) (char-after (match-beginning 2))) |
| 217 | ;; Is it a matching sequence? | 220 | (put-text-property (match-beginning 3) (match-end 3) |
| 218 | (if (eq (char-after) (char-after (match-beginning 2))) | 221 | 'syntax-table (string-to-syntax "|")))) |
| 219 | (eval-when-compile (string-to-syntax "|")))))) | 222 | ((match-end 1) |
| 220 | ;; Consider property for initial char, accounting for prefixes. | 223 | ;; Consider property for initial char, accounting for prefixes. |
| 221 | ((or (and (= n 2) ; leading quote (not prefix) | 224 | (put-text-property (match-beginning 1) (match-end 1) |
| 222 | (= (match-beginning 1) (match-end 1))) ; prefix is null | 225 | 'syntax-table (string-to-syntax "|"))) |
| 223 | (and (= n 1) ; prefix | 226 | (t |
| 224 | (/= (match-beginning 1) (match-end 1)))) ; non-empty | 227 | ;; Consider property for initial char, accounting for prefixes. |
| 225 | (let ((font-lock-syntactic-keywords nil)) | 228 | (put-text-property (match-beginning 2) (match-end 2) |
| 226 | (unless (eq 'string (syntax-ppss-context (syntax-ppss))) | 229 | 'syntax-table (string-to-syntax "|")))) |
| 227 | (eval-when-compile (string-to-syntax "|"))))) | 230 | ))) |
| 228 | ;; Otherwise (we're in a non-matching string) the property is | ||
| 229 | ;; nil, which is OK. | ||
| 230 | ))) | ||
| 231 | 231 | ||
| 232 | ;; This isn't currently in `font-lock-defaults' as probably not worth | 232 | ;; This isn't currently in `font-lock-defaults' as probably not worth |
| 233 | ;; it -- we basically only mess with a few normally-symbol characters. | 233 | ;; it -- we basically only mess with a few normally-symbol characters. |
| @@ -2495,12 +2495,12 @@ with skeleton expansions for compound statement templates. | |||
| 2495 | :group 'python | 2495 | :group 'python |
| 2496 | (set (make-local-variable 'font-lock-defaults) | 2496 | (set (make-local-variable 'font-lock-defaults) |
| 2497 | '(python-font-lock-keywords nil nil nil nil | 2497 | '(python-font-lock-keywords nil nil nil nil |
| 2498 | (font-lock-syntactic-keywords | 2498 | ;; This probably isn't worth it. |
| 2499 | . python-font-lock-syntactic-keywords) | 2499 | ;; (font-lock-syntactic-face-function |
| 2500 | ;; This probably isn't worth it. | 2500 | ;; . python-font-lock-syntactic-face-function) |
| 2501 | ;; (font-lock-syntactic-face-function | 2501 | )) |
| 2502 | ;; . python-font-lock-syntactic-face-function) | 2502 | (set (make-local-variable 'syntax-propertize-function) |
| 2503 | )) | 2503 | python-syntax-propertize-function) |
| 2504 | (set (make-local-variable 'parse-sexp-lookup-properties) t) | 2504 | (set (make-local-variable 'parse-sexp-lookup-properties) t) |
| 2505 | (set (make-local-variable 'parse-sexp-ignore-comments) t) | 2505 | (set (make-local-variable 'parse-sexp-ignore-comments) t) |
| 2506 | (set (make-local-variable 'comment-start) "# ") | 2506 | (set (make-local-variable 'comment-start) "# ") |