aboutsummaryrefslogtreecommitdiffstats
path: root/lisp/progmodes/python.el
diff options
context:
space:
mode:
authorStefan Monnier2010-09-11 01:13:42 +0200
committerStefan Monnier2010-09-11 01:13:42 +0200
commitcf38dd429888fc992408716922ecab1c39242944 (patch)
tree97ee11df214e90b91f9da1620cdcec97acda8eb0 /lisp/progmodes/python.el
parent71c17aecc32c876247062fd480304b147b266130 (diff)
downloademacs-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.el96
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.
193Used for syntactic keywords. N is the match number (1, 2 or 3)." 196Used 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) "# ")