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

Reply via email to