Kent Borg wrote: > Andreas Roehler wrote: >> BTW which system/version/emacs you are using? > > kentb...@bottom:~$ emacs --version > GNU Emacs 22.2.1 > Copyright (C) 2008 Free Software Foundation, Inc. > GNU Emacs comes with ABSOLUTELY NO WARRANTY. > You may redistribute copies of Emacs > under the terms of the GNU General Public License. > For more information about these matters, see the file named COPYING. > kentb...@bottom:~$ uname -a > Linux bottom 2.6.28-17-generic #58-Ubuntu SMP Tue Dec 1 18:57:07 UTC > 2009 i686 GNU/Linux > kentb...@bottom:~$ cat /etc/debian_version > 5.0 > kentb...@bottom:~$ cat /etc/issue > Ubuntu 9.04 \n \l > > > > I am running Gnome under GDM, but "emacs -nw" acts the same way. > > I notice that when typing that while typing the quote marks, the > highlighting seems to be simply counting open-close-open-close, etc. > (Clever that three quotes is an odd number so it looks to naive syntax > highlighting a bit like a single quote.) > > Does your emacs update highlighting when you type one quote?
Yes Does it > update it again after a second? It does it immediatly. What does it do after a third? And, > what does it do on the close set? > > Oh, one more thing: I moved my .emacs aside no need for that, emacs -q or emacs -Q is the right thing then to make sure it isn't the > problem...and it seems it is not. > When started emacs -q you should not encounter that problem - maybe others... Already tried to tackle the issue. Works with GNU Emacs for me, not with XEmacs until now. Introduced some stuff from python.el - defconst python-font-lock-syntactic-keywords etc. Patch attached - not polished yet, but works here some weeks now. Andreas
387a388,488 > ;; 2009-09-10 a.roeh...@web.de changed section start > ;; from python.el, version "22.1" > > (defconst python-font-lock-syntactic-keywords > > '(("[^\\]\\\\\\(?:\\\\\\\\\\)*\\(\\s\"\\)\\1\\(\\1\\)" > (2 > (7))) > ("\\([RUru]?\\)[Rr]?\\(\\s\"\\)\\2\\(\\2\\)" > (1 > (python-quote-syntax 1)) > (2 > (python-quote-syntax 2)) > (3 > (python-quote-syntax 3))))) > > (defun python-quote-syntax (n) > "Put `syntax-table' property correctly on triple quote. > Used for syntactic keywords. N is the match number (1, 2 or 3)." > ;; Given a triple quote, we have to check the context to know > ;; whether this is an opening or closing triple or whether it's > ;; quoted anyhow, and should be ignored. (For that we need to do > ;; the same job as `syntax-ppss' to be correct and it seems to be OK > ;; to use it here despite initial worries.) We also have to sort > ;; out a possible prefix -- well, we don't _have_ to, but I think it > ;; should be treated as part of the string. > ;; Test cases: > ;; ur"""ar""" x='"' # """ > ;; x = ''' """ ' a > ;; ''' > ;; x '"""' x """ \"""" x > (save-excursion > (goto-char (match-beginning 0)) > (cond > ;; Consider property for the last char if in a fenced string. > ((= n 3) > (let* ((font-lock-syntactic-keywords nil) > (syntax (syntax-ppss))) > (when (eq t (nth 3 syntax)) ; after unclosed fence > (goto-char (nth 8 syntax)) ; fence position > (skip-chars-forward "uUrR") ; skip any prefix > ;; Is it a matching sequence? > (if (eq (char-after) (char-after (match-beginning 2))) > (if (featurep 'xemacs) > '(15) > (eval-when-compile (string-to-syntax "|"))) > )))) > ;; Consider property for initial char, accounting for prefixes. > ((or (and (= n 2) ; leading quote (not prefix) > (= (match-beginning 1) (match-end 1))) ; prefix is null > (and (= n 1) ; prefix > (/= (match-beginning 1) (match-end 1)))) ; non-empty > (let ((font-lock-syntactic-keywords nil)) > (unless (eq 'string (syntax-ppss-context (syntax-ppss))) > ;; (eval-when-compile (string-to-syntax "|")) > (if (featurep 'xemacs) > '(15) > (eval-when-compile (string-to-syntax "|"))) > ))) > ;; Otherwise (we're in a non-matching string) the property is > ;; nil, which is OK. > ))) > > (setq py-mode-syntax-table > (let ((table (make-syntax-table)) > (tablelookup (if (featurep 'xemacs) > 'get-char-table > 'aref))) > ;; Give punctuation syntax to ASCII that normally has symbol > ;; syntax or has word syntax and isn't a letter. > (if (featurep 'xemacs) > (setq table (standard-syntax-table)) > (let ((symbol (if (featurep 'xemacs) '(3)(string-to-syntax "_"))) > ;; (symbol (string-to-syntax "_")) > (sst (standard-syntax-table))) > (dotimes (i 128) > (unless (= i ?_) > (if (equal symbol (funcall tablelookup sst i)) > (modify-syntax-entry i "." table)))))) > (modify-syntax-entry ?$ "." table) > (modify-syntax-entry ?% "." table) > ;; exceptions > (modify-syntax-entry ?# "<" table) > (modify-syntax-entry ?\n ">" table) > (modify-syntax-entry ?' "\"" table) > (modify-syntax-entry ?` "$" table) > table)) > > (defsubst python-in-string/comment () > "Return non-nil if point is in a Python literal (a comment or string)." > ;; We don't need to save the match data. > (nth 8 (syntax-ppss))) > > (defconst python-space-backslash-table > (let ((table (copy-syntax-table py-mode-syntax-table))) > (modify-syntax-entry ?\\ " " table) > table) > "`python-mode-syntax-table' with backslash given whitespace syntax.") > > ;; 2009-09-10 a.roeh...@web.de changed section end > 424a526 > 508d609 < (put 'python-mode 'font-lock-defaults '(python-font-lock-keywords)) 730,771c831,871 < (defvar py-mode-syntax-table nil < "Syntax table used in `python-mode' buffers.") < (when (not py-mode-syntax-table) < (setq py-mode-syntax-table (make-syntax-table)) < (modify-syntax-entry ?\( "()" py-mode-syntax-table) < (modify-syntax-entry ?\) ")(" py-mode-syntax-table) < (modify-syntax-entry ?\[ "(]" py-mode-syntax-table) < (modify-syntax-entry ?\] ")[" py-mode-syntax-table) < (modify-syntax-entry ?\{ "(}" py-mode-syntax-table) < (modify-syntax-entry ?\} "){" py-mode-syntax-table) < ;; Add operator symbols misassigned in the std table < (modify-syntax-entry ?\$ "." py-mode-syntax-table) < (modify-syntax-entry ?\% "." py-mode-syntax-table) < (modify-syntax-entry ?\& "." py-mode-syntax-table) < (modify-syntax-entry ?\* "." py-mode-syntax-table) < (modify-syntax-entry ?\+ "." py-mode-syntax-table) < (modify-syntax-entry ?\- "." py-mode-syntax-table) < (modify-syntax-entry ?\/ "." py-mode-syntax-table) < (modify-syntax-entry ?\< "." py-mode-syntax-table) < (modify-syntax-entry ?\= "." py-mode-syntax-table) < (modify-syntax-entry ?\> "." py-mode-syntax-table) < (modify-syntax-entry ?\| "." py-mode-syntax-table) < ;; For historical reasons, underscore is word class instead of < ;; symbol class. GNU conventions say it should be symbol class, but < ;; there's a natural conflict between what major mode authors want < ;; and what users expect from `forward-word' and `backward-word'. < ;; Guido and I have hashed this out and have decided to keep < ;; underscore in word class. If you're tempted to change it, try < ;; binding M-f and M-b to py-forward-into-nomenclature and < ;; py-backward-into-nomenclature instead. This doesn't help in all < ;; situations where you'd want the different behavior < ;; (e.g. backward-kill-word). < (modify-syntax-entry ?\_ "w" py-mode-syntax-table) < ;; Both single quote and double quote are string delimiters < (modify-syntax-entry ?\' "\"" py-mode-syntax-table) < (modify-syntax-entry ?\" "\"" py-mode-syntax-table) < ;; backquote is open and close paren < (modify-syntax-entry ?\` "$" py-mode-syntax-table) < ;; comment delimiters < (modify-syntax-entry ?\# "<" py-mode-syntax-table) < (modify-syntax-entry ?\n ">" py-mode-syntax-table) < ) --- > ;; (when (featurep 'xemacs) (defvar py-mode-syntax-table nil)) > ;; (when (featurep 'xemacs) > ;; (when (not py-mode-syntax-table) > ;; (setq py-mode-syntax-table (make-syntax-table)) > ;; (modify-syntax-entry ?\( "()" py-mode-syntax-table) > ;; (modify-syntax-entry ?\) ")(" py-mode-syntax-table) > ;; (modify-syntax-entry ?\[ "(]" py-mode-syntax-table) > ;; (modify-syntax-entry ?\] ")[" py-mode-syntax-table) > ;; (modify-syntax-entry ?\{ "(}" py-mode-syntax-table) > ;; (modify-syntax-entry ?\} "){" py-mode-syntax-table) > ;; ;; Add operator symbols misassigned in the std table > ;; (modify-syntax-entry ?\$ "." py-mode-syntax-table) > ;; (modify-syntax-entry ?\% "." py-mode-syntax-table) > ;; (modify-syntax-entry ?\& "." py-mode-syntax-table) > ;; (modify-syntax-entry ?\* "." py-mode-syntax-table) > ;; (modify-syntax-entry ?\+ "." py-mode-syntax-table) > ;; (modify-syntax-entry ?\- "." py-mode-syntax-table) > ;; (modify-syntax-entry ?\/ "." py-mode-syntax-table) > ;; (modify-syntax-entry ?\< "." py-mode-syntax-table) > ;; (modify-syntax-entry ?\= "." py-mode-syntax-table) > ;; (modify-syntax-entry ?\> "." py-mode-syntax-table) > ;; (modify-syntax-entry ?\| "." py-mode-syntax-table) > ;; ;; For historical reasons, underscore is word class instead of > ;; ;; symbol class. GNU conventions say it should be symbol class, but > ;; ;; there's a natural conflict between what major mode authors want > ;; ;; and what users expect from `forward-word' and `backward-word'. > ;; ;; Guido and I have hashed this out and have decided to keep > ;; ;; underscore in word class. If you're tempted to change it, try > ;; ;; binding M-f and M-b to py-forward-into-nomenclature and > ;; ;; py-backward-into-nomenclature instead. This doesn't help in all > ;; ;; situations where you'd want the different behavior > ;; ;; (e.g. backward-kill-word). > ;; (modify-syntax-entry ?\_ "w" py-mode-syntax-table) > ;; ;; Both single quote and double quote are string delimiters > ;; (modify-syntax-entry ?\' "\"" py-mode-syntax-table) > ;; (modify-syntax-entry ?\" "|" py-mode-syntax-table) > ;; ;; backquote is open and close paren > ;; (modify-syntax-entry ?\` "$" py-mode-syntax-table) > ;; ;; comment delimiters > ;; (modify-syntax-entry ?\# "<" py-mode-syntax-table) > ;; (modify-syntax-entry ?\n ">" py-mode-syntax-table))) 1180d1279 < (make-local-variable 'font-lock-defaults) 1194a1294,1300 > ;; 2009-09-10 a.roeh...@web.de changed section start > ;; from python.el, version "22.1" > (set (make-local-variable 'font-lock-defaults) > '(python-font-lock-keywords nil nil nil nil > (font-lock-syntactic-keywords > . python-font-lock-syntactic-keywords))) > ;; 2009-09-10 a.roeh...@web.de changed section end 1198d1303 < font-lock-defaults '(python-font-lock-keywords) 1245,1246c1350 < (setq indent-tabs-mode nil)) < )) --- > (setq indent-tabs-mode nil)))) 1251d1354 <
_______________________________________________ Python-mode mailing list Python-mode@python.org http://mail.python.org/mailman/listinfo/python-mode