Hi,

just read the message regarding the "floating patches".

This one has been provided by Sebastian Wiesner. Just wanted to make sure you 
guys have it.

Diez
Index: python-mode.el
===================================================================
--- python-mode.el	(Revision 465)
+++ python-mode.el	(Arbeitskopie)
@@ -488,20 +488,82 @@
      (cons (concat "\\<\\(" kw2 "\\)[ \n\t(]") 1)
      ;; Exceptions
      (list (concat "\\<\\(" kw4 "\\)[ \n\t:,(]") 1 'py-builtins-face)
+     ;; `as' but only in "import foo as bar"
+     '("[ \t]*\\(\\<from\\>.*\\)?\\<import\\>.*\\<\\(as\\)\\>" . 2)
+
      ;; classes
      '("\\<class[ \t]+\\([a-zA-Z_]+[a-zA-Z0-9_]*\\)" 1 font-lock-type-face)
      ;; functions
      '("\\<def[ \t]+\\([a-zA-Z_]+[a-zA-Z0-9_]*\\)"
        1 font-lock-function-name-face)
      ;; pseudo-keywords
-     '("\\<\\(self\\|Ellipsis\\|True\\|False\\)\\>"
+     '("\\<\\(self\\|None\\|True\\|False\\|Ellipsis\\)\\>"
        1 py-pseudo-keyword-face)
-     ;; XXX, TODO, and FIXME tags
-     '("XXX\\|TODO\\|FIXME" 0 py-XXX-tag-face t)
      ))
   "Additional expressions to highlight in Python mode.")
-(put 'python-mode 'font-lock-defaults '(python-font-lock-keywords))
+;(put 'python-mode 'font-lock-defaults '(python-font-lock-keywords))
 
+(defconst py-font-lock-syntactic-keywords
+  ;; Make outer chars of matching triple-quote sequences into generic
+  ;; string delimiters.  Fixme: Is there a better way?
+  `((,(rx (or line-start buffer-start
+	      (not (syntax escape)))	; avoid escaped leading quote
+	  (group (optional (any "uUrR"))) ; prefix gets syntax property
+	  (optional (any "rR"))		  ; possible second prefix
+	  (group (syntax string-quote))   ; maybe gets property
+	  (backref 2)			  ; per first quote
+	  (group (backref 2)))		  ; maybe gets property
+     (1 (python-quote-syntax 1))
+     (2 (python-quote-syntax 2))
+     (3 (python-quote-syntax 3)))
+    ;; This doesn't really help.
+;;;     (,(rx (and ?\\ (group ?\n))) (1 " "))
+    ))
+
+(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
+  ;; Fixme:  """""" goes wrong (due to syntax-ppss not getting the string
+  ;; fence context).
+  (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)))
+	      (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 "|")))))
+     ;; Otherwise (we're in a non-matching string) the property is
+     ;; nil, which is OK.
+     )))
+
+
 ;; have to bind py-file-queue before installing the kill-emacs-hook
 (defvar py-file-queue nil
   "Queue of Python temp files awaiting execution.
@@ -1184,12 +1246,22 @@
   (make-local-variable 'indent-line-function)
   (make-local-variable 'add-log-current-defun-function)
   (make-local-variable 'fill-paragraph-function)
+  (make-local-variable 'parse-sexp-lookup-properties)
+  (make-local-variable 'outline-regexp)
+  (make-local-variable 'outline-level)
+  (make-local-variable 'open-paren-in-column-0-is-defun-start) ; Emacs 21.4
   ;;
   (set-syntax-table py-mode-syntax-table)
+  (add-hook (make-local-hook 'font-lock-mode-hook)
+	    'py-font-lock-mode-hook nil t)
   (setq major-mode              'python-mode
 	mode-name               "Python"
 	local-abbrev-table      python-mode-abbrev-table
-	font-lock-defaults      '(python-font-lock-keywords)
+ 	font-lock-defaults      '(python-font-lock-keywords
+                              nil nil nil nil
+                              (font-lock-syntactic-keywords
+                               . py-font-lock-syntactic-keywords))
+ 	parse-sexp-lookup-properties t
 	paragraph-separate      "^[ \t]*$"
 	paragraph-start         "^[ \t]*$"
 	require-final-newline   t
@@ -2152,23 +2224,39 @@
        ((py-continuation-line-p)
 	(let ((startpos (point))
 	      (open-bracket-pos (py-nesting-level))
-	      endpos searching found state cind cline)
+	      endpos searching found state)
 	  (if open-bracket-pos
 	      (progn
-		(setq endpos (py-point 'bol))
-		(py-goto-initial-line)
-		(setq cind (current-indentation))
-		(setq cline cind)
-		(dolist (bp 
-			 (nth 9 (save-excursion
-				  (parse-partial-sexp (point) endpos)))
-			 cind)
-		  (if (search-forward "\n" bp t) (setq cline cind))
-		  (goto-char (1+ bp))
-		  (skip-chars-forward " \t")
-		  (setq cind (if (memq (following-char) '(?\n ?# ?\\))
-				 (+ cline py-indent-offset)
-			       (current-column)))))
+		;; align with first item in list; else a normal
+		;; indent beyond the line with the open bracket
+		(goto-char (1+ open-bracket-pos)) ; just beyond bracket
+		;; is the first list item on the same line?
+		(skip-chars-forward " \t")
+		(if (null (memq (following-char) '(?\n ?# ?\\)))
+					; yes, so line up with it
+		    (current-column)
+		  ;; first list item on another line, or doesn't exist yet
+		  (forward-line 1)
+		  (while (and (< (point) startpos)
+			      (looking-at "[ \t]*[#\n\\\\]")) ; skip noise
+		    (forward-line 1))
+		  (if (and (< (point) startpos)
+			   (/= startpos
+			       (save-excursion
+				 (goto-char (1+ open-bracket-pos))
+				 (forward-comment (point-max))
+				 (point))))
+		      ;; again mimic the first list item
+		      (current-indentation)
+		    ;; else they're about to enter the first item
+		    (goto-char open-bracket-pos)
+		    (setq placeholder (point))
+		    (py-goto-initial-line)
+		    (py-goto-beginning-of-tqs
+		     (save-excursion (nth 3 (parse-partial-sexp
+					     placeholder (point)))))
+		    (+ (current-indentation) py-indent-offset))))
+
 	    ;; else on backslash continuation line
 	    (forward-line -1)
 	    (if (py-continuation-line-p) ; on at least 3rd line in block
@@ -2655,7 +2743,10 @@
 	     (looking-at start-re))
 	(end-of-line))
     (if (re-search-backward start-re nil 'move count)
-	(goto-char (match-beginning 0)))))
+	(goto-char (match-beginning 0))))
+  ;; We could be in a string, in which case, try again.
+  (if (nth 8 (parse-partial-sexp (point-min) (point)))
+      (py-beginning-of-def-or-class class count)))
 
 ;; Backwards compatibility
 (defalias 'beginning-of-python-def-or-class 'py-beginning-of-def-or-class)
@@ -2944,7 +3035,13 @@
   (py-forward-into-nomenclature (- arg))
   (py-keep-region-active))
 
+(defun py-backward-kill-nomenclature (arg)
+  "Kill characters forward until encountering the end of a word.
+With argument, do this that many times."
+  (interactive "p")
+  (kill-region (point) (progn (py-backward-into-nomenclature arg) (point))))
 
+
 
 ;; pdbtrack functions
 (defun py-pdbtrack-toggle-stack-tracking (arg)
@@ -3432,7 +3529,7 @@
   "Go to the beginning of the triple quoted string we find ourselves in.
 DELIM is the TQS string delimiter character we're searching backwards
 for."
-  (let ((skip (and delim (make-string 1 delim)))
+  (let ((skip (and delim (not (eq delim t)) (make-string 1 delim)))
 	(continue t))
     (when skip
       (save-excursion
_______________________________________________
Python-mode mailing list
Python-mode@python.org
http://mail.python.org/mailman/listinfo/python-mode

Reply via email to