Mercurial > emacs
comparison lisp/progmodes/python.el @ 92055:373b00a4775c
Merge from Dave Love's 2008-01-20 version.
Require sym-comp. Add Python buffer to same-window-buffer-names.
Fixup whitespaces.
(python-font-lock-keywords): Add highlighting for Python builtins.
(python-font-lock-syntactic-keywords): Rewrite.
(python-quote-syntax): Use syntax-ppss-context instead of parsing
ppss directly.
(python-mode-map): Add binding for python-find-function.
(python-calculate-indentation): Clean up the logic.
(python-beginning-of-defun): Explicitly set return value.
(python-beginning-of-statement): Stop looping if we get stuck
going backwards.
(python-next-statement): Stop looping if we somehow end up inside
a string while advancing.
(python-preoutput-continuation, python-version-checked): New vars.
(python-check-version): New function.
(run-python): Set default command to python-command instead of
python-python-command.
(run-python): Use python-check-version. Give PYTHONPATH
precedence over data-directory in the process environment. Load
function definitions in python process after.
(python-check-comint-prompt): New function.
(python-send-command, python-send-receive): Use it.
(python-complete-symbol, python-try-complete): Functions deleted.
Use symbol-complete instead of python-complete-symbol throughout.
(python-fill-paragraph): Further refine the fenced-string regexp.
(def-python-skeleton): Expand to the original abbrev instead if in
a comment or string. Tweak skeletons for `if', `while', `for',
`try/except', `try/finally', `name'.
(python-pea-hook, python-abbrev-pc-hook): New functions.
(python-abbrev-syntax-table): New var.
(python-mode): Add python-pea-hook to pre-abbrev-expand-hook. Use
symbol-completion-try-complete for hippie expansion. Turn on font
lock unconditionally.
(python-mode-hook): Defcustom it. No need to use make-local
variable on indent-tabs-mode in "Turn off Indent Tabs mode"
option, since it's buffer-local.
| author | Chong Yidong <cyd@stupidchicken.com> |
|---|---|
| date | Thu, 21 Feb 2008 17:03:47 +0000 |
| parents | 70017176d475 |
| children | fd85a7810d53 |
comparison
equal
deleted
inserted
replaced
| 92054:6d77acc71bc0 | 92055:373b00a4775c |
|---|---|
| 60 ;; with python-mode.el in some respects. For instance, various key | 60 ;; with python-mode.el in some respects. For instance, various key |
| 61 ;; bindings are changed to obey Emacs conventions. | 61 ;; bindings are changed to obey Emacs conventions. |
| 62 | 62 |
| 63 ;; TODO: See various Fixmes below. | 63 ;; TODO: See various Fixmes below. |
| 64 | 64 |
| 65 ;; Fixme: This doesn't support (the nascent) Python 3 . | |
| 66 | |
| 65 ;;; Code: | 67 ;;; Code: |
| 66 | 68 |
| 67 (require 'comint) | 69 (require 'comint) |
| 68 | 70 |
| 69 (eval-when-compile | 71 (eval-when-compile |
| 70 (require 'compile) | 72 (require 'compile) |
| 71 (require 'hippie-exp)) | 73 (require 'hippie-exp)) |
| 72 | 74 |
| 75 (require 'sym-comp) | |
| 73 (autoload 'comint-mode "comint") | 76 (autoload 'comint-mode "comint") |
| 74 | 77 |
| 75 (defgroup python nil | 78 (defgroup python nil |
| 76 "Silly walks in the Python language." | 79 "Silly walks in the Python language." |
| 77 :group 'languages | 80 :group 'languages |
| 82 (add-to-list 'interpreter-mode-alist '("jython" . jython-mode)) | 85 (add-to-list 'interpreter-mode-alist '("jython" . jython-mode)) |
| 83 ;;;###autoload | 86 ;;;###autoload |
| 84 (add-to-list 'interpreter-mode-alist '("python" . python-mode)) | 87 (add-to-list 'interpreter-mode-alist '("python" . python-mode)) |
| 85 ;;;###autoload | 88 ;;;###autoload |
| 86 (add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode)) | 89 (add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode)) |
| 90 (add-to-list 'same-window-buffer-names "*Python*") | |
| 87 | 91 |
| 88 ;;;; Font lock | 92 ;;;; Font lock |
| 89 | 93 |
| 90 (defvar python-font-lock-keywords | 94 (defvar python-font-lock-keywords |
| 91 `(,(rx symbol-start | 95 `(,(rx symbol-start |
| 96 "import" "in" "is" "lambda" "not" "or" "pass" "print" | 100 "import" "in" "is" "lambda" "not" "or" "pass" "print" |
| 97 "raise" "return" "try" "while" "with" "yield" | 101 "raise" "return" "try" "while" "with" "yield" |
| 98 ;; Not real keywords, but close enough to be fontified as such | 102 ;; Not real keywords, but close enough to be fontified as such |
| 99 "self" "True" "False") | 103 "self" "True" "False") |
| 100 symbol-end) | 104 symbol-end) |
| 101 (,(rx symbol-start "None" symbol-end) ; See § Keywords in 2.5 manual. | 105 (,(rx symbol-start "None" symbol-end) ; see § Keywords in 2.5 manual |
| 102 . font-lock-constant-face) | 106 . font-lock-constant-face) |
| 103 ;; Definitions | 107 ;; Definitions |
| 104 (,(rx symbol-start (group "class") (1+ space) (group (1+ (or word ?_)))) | 108 (,(rx symbol-start (group "class") (1+ space) (group (1+ (or word ?_)))) |
| 105 (1 font-lock-keyword-face) (2 font-lock-type-face)) | 109 (1 font-lock-keyword-face) (2 font-lock-type-face)) |
| 106 (,(rx symbol-start (group "def") (1+ space) (group (1+ (or word ?_)))) | 110 (,(rx symbol-start (group "def") (1+ space) (group (1+ (or word ?_)))) |
| 107 (1 font-lock-keyword-face) (2 font-lock-function-name-face)) | 111 (1 font-lock-keyword-face) (2 font-lock-function-name-face)) |
| 108 ;; Top-level assignments are worth highlighting. | 112 ;; Top-level assignments are worth highlighting. |
| 109 (,(rx line-start (group (1+ (or word ?_))) (0+ space) "=") | 113 (,(rx line-start (group (1+ (or word ?_))) (0+ space) "=") |
| 110 (1 font-lock-variable-name-face)) | 114 (1 font-lock-variable-name-face)) |
| 111 (,(rx "@" (1+ (or word ?_))) ; decorators | 115 (,(rx line-start (* (any " \t")) (group "@" (1+ (or word ?_)))) ; decorators |
| 112 (0 font-lock-preprocessor-face)))) | 116 (1 font-lock-type-face)) |
| 117 ;; Built-ins. (The next three blocks are from | |
| 118 ;; `__builtin__.__dict__.keys()' in Python 2.5.1.) These patterns | |
| 119 ;; are debateable, but they at least help to spot possible | |
| 120 ;; shadowing of builtins. | |
| 121 (,(rx symbol-start (or | |
| 122 ;; exceptions | |
| 123 "ArithmeticError" "AssertionError" "AttributeError" | |
| 124 "BaseException" "DeprecationWarning" "EOFError" | |
| 125 "EnvironmentError" "Exception" "FloatingPointError" | |
| 126 "FutureWarning" "GeneratorExit" "IOError" "ImportError" | |
| 127 "ImportWarning" "IndentationError" "IndexError" "KeyError" | |
| 128 "KeyboardInterrupt" "LookupError" "MemoryError" "NameError" | |
| 129 "NotImplemented" "NotImplementedError" "OSError" | |
| 130 "OverflowError" "PendingDeprecationWarning" "ReferenceError" | |
| 131 "RuntimeError" "RuntimeWarning" "StandardError" | |
| 132 "StopIteration" "SyntaxError" "SyntaxWarning" "SystemError" | |
| 133 "SystemExit" "TabError" "TypeError" "UnboundLocalError" | |
| 134 "UnicodeDecodeError" "UnicodeEncodeError" "UnicodeError" | |
| 135 "UnicodeTranslateError" "UnicodeWarning" "UserWarning" | |
| 136 "ValueError" "Warning" "ZeroDivisionError") symbol-end) | |
| 137 . font-lock-type-face) | |
| 138 (,(rx (or line-start (not (any ". \t"))) (* (any " \t")) symbol-start | |
| 139 (group (or | |
| 140 ;; callable built-ins, fontified when not appearing as | |
| 141 ;; object attributes | |
| 142 "abs" "all" "any" "apply" "basestring" "bool" "buffer" "callable" | |
| 143 "chr" "classmethod" "cmp" "coerce" "compile" "complex" | |
| 144 "copyright" "credits" "delattr" "dict" "dir" "divmod" | |
| 145 "enumerate" "eval" "execfile" "exit" "file" "filter" "float" | |
| 146 "frozenset" "getattr" "globals" "hasattr" "hash" "help" | |
| 147 "hex" "id" "input" "int" "intern" "isinstance" "issubclass" | |
| 148 "iter" "len" "license" "list" "locals" "long" "map" "max" | |
| 149 "min" "object" "oct" "open" "ord" "pow" "property" "quit" | |
| 150 "range" "raw_input" "reduce" "reload" "repr" "reversed" | |
| 151 "round" "set" "setattr" "slice" "sorted" "staticmethod" | |
| 152 "str" "sum" "super" "tuple" "type" "unichr" "unicode" "vars" | |
| 153 "xrange" "zip")) symbol-end) | |
| 154 (1 font-lock-builtin-face)) | |
| 155 (,(rx symbol-start (or | |
| 156 ;; other built-ins | |
| 157 "True" "False" "None" "Ellipsis" | |
| 158 "_" "__debug__" "__doc__" "__import__" "__name__") symbol-end) | |
| 159 . font-lock-builtin-face))) | |
| 113 | 160 |
| 114 (defconst python-font-lock-syntactic-keywords | 161 (defconst python-font-lock-syntactic-keywords |
| 115 ;; Make outer chars of matching triple-quote sequences into generic | 162 ;; Make outer chars of matching triple-quote sequences into generic |
| 116 ;; string delimiters. Fixme: Is there a better way? | 163 ;; string delimiters. Fixme: Is there a better way? |
| 117 `((,(rx (or line-start buffer-start | 164 ;; First avoid a sequence preceded by an odd number of backslashes. |
| 118 (not (syntax escape))) ; avoid escaped leading quote | 165 `((,(rx (not (any ?\\)) |
| 119 (group (optional (any "uUrR"))) ; prefix gets syntax property | 166 ?\\ (* (and ?\\ ?\\)) |
| 167 (group (syntax string-quote)) | |
| 168 (backref 1) | |
| 169 (group (backref 1))) | |
| 170 (2 ,(string-to-syntax "\""))) ; dummy | |
| 171 (,(rx (group (optional (any "uUrR"))) ; prefix gets syntax property | |
| 120 (optional (any "rR")) ; possible second prefix | 172 (optional (any "rR")) ; possible second prefix |
| 121 (group (syntax string-quote)) ; maybe gets property | 173 (group (syntax string-quote)) ; maybe gets property |
| 122 (backref 2) ; per first quote | 174 (backref 2) ; per first quote |
| 123 (group (backref 2))) ; maybe gets property | 175 (group (backref 2))) ; maybe gets property |
| 124 (1 (python-quote-syntax 1)) | 176 (1 (python-quote-syntax 1)) |
| 142 ;; Test cases: | 194 ;; Test cases: |
| 143 ;; ur"""ar""" x='"' # """ | 195 ;; ur"""ar""" x='"' # """ |
| 144 ;; x = ''' """ ' a | 196 ;; x = ''' """ ' a |
| 145 ;; ''' | 197 ;; ''' |
| 146 ;; x '"""' x """ \"""" x | 198 ;; x '"""' x """ \"""" x |
| 147 ;; Fixme: """""" goes wrong (due to syntax-ppss not getting the string | |
| 148 ;; fence context). | |
| 149 (save-excursion | 199 (save-excursion |
| 150 (goto-char (match-beginning 0)) | 200 (goto-char (match-beginning 0)) |
| 151 (cond | 201 (cond |
| 152 ;; Consider property for the last char if in a fenced string. | 202 ;; Consider property for the last char if in a fenced string. |
| 153 ((= n 3) | 203 ((= n 3) |
| 163 ((or (and (= n 2) ; leading quote (not prefix) | 213 ((or (and (= n 2) ; leading quote (not prefix) |
| 164 (= (match-beginning 1) (match-end 1))) ; prefix is null | 214 (= (match-beginning 1) (match-end 1))) ; prefix is null |
| 165 (and (= n 1) ; prefix | 215 (and (= n 1) ; prefix |
| 166 (/= (match-beginning 1) (match-end 1)))) ; non-empty | 216 (/= (match-beginning 1) (match-end 1)))) ; non-empty |
| 167 (let ((font-lock-syntactic-keywords nil)) | 217 (let ((font-lock-syntactic-keywords nil)) |
| 168 (unless (nth 3 (syntax-ppss)) | 218 (unless (eq 'string (syntax-ppss-context (syntax-ppss))) |
| 169 (eval-when-compile (string-to-syntax "|"))))) | 219 (eval-when-compile (string-to-syntax "|"))))) |
| 170 ;; Otherwise (we're in a non-matching string) the property is | 220 ;; Otherwise (we're in a non-matching string) the property is |
| 171 ;; nil, which is OK. | 221 ;; nil, which is OK. |
| 172 ))) | 222 ))) |
| 173 | 223 |
| 174 ;; This isn't currently in `font-lock-defaults' as probably not worth | 224 ;; This isn't currently in `font-lock-defaults' as probably not worth |
| 215 (define-key map "\C-c\M-r" 'python-send-region-and-go) | 265 (define-key map "\C-c\M-r" 'python-send-region-and-go) |
| 216 (define-key map "\C-c\C-c" 'python-send-buffer) | 266 (define-key map "\C-c\C-c" 'python-send-buffer) |
| 217 (define-key map "\C-c\C-z" 'python-switch-to-python) | 267 (define-key map "\C-c\C-z" 'python-switch-to-python) |
| 218 (define-key map "\C-c\C-m" 'python-load-file) | 268 (define-key map "\C-c\C-m" 'python-load-file) |
| 219 (define-key map "\C-c\C-l" 'python-load-file) ; a la cmuscheme | 269 (define-key map "\C-c\C-l" 'python-load-file) ; a la cmuscheme |
| 220 (substitute-key-definition 'complete-symbol 'python-complete-symbol | 270 (substitute-key-definition 'complete-symbol 'symbol-complete |
| 221 map global-map) | 271 map global-map) |
| 222 (define-key map "\C-c\C-i" 'python-find-imports) | 272 (define-key map "\C-c\C-i" 'python-find-imports) |
| 223 (define-key map "\C-c\C-t" 'python-expand-template) | 273 (define-key map "\C-c\C-t" 'python-expand-template) |
| 224 (easy-menu-define python-menu map "Python Mode menu" | 274 (easy-menu-define python-menu map "Python Mode menu" |
| 225 `("Python" | 275 `("Python" |
| 268 ["Check file" python-check :help "Run pychecker"] | 318 ["Check file" python-check :help "Run pychecker"] |
| 269 ["Debugger" pdb :help "Run pdb under GUD"] | 319 ["Debugger" pdb :help "Run pdb under GUD"] |
| 270 "-" | 320 "-" |
| 271 ["Help on symbol" python-describe-symbol | 321 ["Help on symbol" python-describe-symbol |
| 272 :help "Use pydoc on symbol at point"] | 322 :help "Use pydoc on symbol at point"] |
| 273 ["Complete symbol" python-complete-symbol | 323 ["Complete symbol" symbol-complete |
| 274 :help "Complete (qualified) symbol before point"] | 324 :help "Complete (qualified) symbol before point"] |
| 325 ["Find function" python-find-function | |
| 326 :help "Try to find source definition of function at point"] | |
| 275 ["Update imports" python-find-imports | 327 ["Update imports" python-find-imports |
| 276 :help "Update list of top-level imports for completion"])) | 328 :help "Update list of top-level imports for completion"])) |
| 277 map)) | 329 map)) |
| 278 ;; Fixme: add toolbar stuff for useful things like symbol help, send | 330 ;; Fixme: add toolbar stuff for useful things like symbol help, send |
| 279 ;; region, at least. (Shouldn't be specific to Python, obviously.) | 331 ;; region, at least. (Shouldn't be specific to Python, obviously.) |
| 628 ((bobp) 0) | 680 ((bobp) 0) |
| 629 ;; Fixme: Like python-mode.el; not convinced by this. | 681 ;; Fixme: Like python-mode.el; not convinced by this. |
| 630 ((looking-at (rx (0+ space) (syntax comment-start) | 682 ((looking-at (rx (0+ space) (syntax comment-start) |
| 631 (not (any " \t\n")))) ; non-indentable comment | 683 (not (any " \t\n")))) ; non-indentable comment |
| 632 (current-indentation)) | 684 (current-indentation)) |
| 633 (t (if python-honour-comment-indentation | 685 ((and python-honour-comment-indentation |
| 634 ;; Back over whitespace, newlines, non-indentable comments. | 686 ;; Back over whitespace, newlines, non-indentable comments. |
| 635 (catch 'done | 687 (catch 'done |
| 636 (while t | 688 (while (cond ((bobp) nil) |
| 637 (if (cond ((bobp)) | 689 ((not (forward-comment -1)) |
| 638 ;; not at comment start | 690 nil) ; not at comment start |
| 639 ((not (forward-comment -1)) | 691 ;; Now at start of comment -- trailing one? |
| 640 (python-beginning-of-statement) | 692 ((/= (current-column) (current-indentation)) |
| 641 t) | 693 nil) |
| 642 ;; trailing comment | 694 ;; Indentable comment, like python-mode.el? |
| 643 ((/= (current-column) (current-indentation)) | 695 ((and (looking-at (rx (syntax comment-start) |
| 644 (python-beginning-of-statement) | 696 (or space line-end))) |
| 645 t) | 697 (/= 0 (current-column))) |
| 646 ;; indentable comment like python-mode.el | 698 (throw 'done (current-column))) |
| 647 ((and (looking-at (rx (syntax comment-start) | 699 ;; Else skip it (loop). |
| 648 (or space line-end))) | 700 (t)))))) |
| 649 (/= 0 (current-column))))) | 701 (t |
| 650 (throw 'done t))))) | 702 (python-indentation-levels) |
| 651 (python-indentation-levels) | 703 ;; Prefer to indent comments with an immediately-following |
| 652 ;; Prefer to indent comments with an immediately-following | 704 ;; statement, e.g. |
| 653 ;; statement, e.g. | 705 ;; ... |
| 654 ;; ... | 706 ;; # ... |
| 655 ;; # ... | 707 ;; def ... |
| 656 ;; def ... | 708 (when (and (> python-indent-list-length 1) |
| 657 (when (and (> python-indent-list-length 1) | 709 (python-comment-line-p)) |
| 658 (python-comment-line-p)) | 710 (forward-line) |
| 659 (forward-line) | 711 (unless (python-comment-line-p) |
| 660 (unless (python-comment-line-p) | 712 (let ((elt (assq (current-indentation) python-indent-list))) |
| 661 (let ((elt (assq (current-indentation) python-indent-list))) | 713 (setq python-indent-list |
| 662 (setq python-indent-list | 714 (nconc (delete elt python-indent-list) |
| 663 (nconc (delete elt python-indent-list) | 715 (list elt)))))) |
| 664 (list elt)))))) | 716 (caar (last python-indent-list))))))) |
| 665 (caar (last python-indent-list))))))) | |
| 666 | 717 |
| 667 ;;;; Cycling through the possible indentations with successive TABs. | 718 ;;;; Cycling through the possible indentations with successive TABs. |
| 668 | 719 |
| 669 ;; These don't need to be buffer-local since they're only relevant | 720 ;; These don't need to be buffer-local since they're only relevant |
| 670 ;; during a cycle. | 721 ;; during a cycle. |
| 853 (or (and (zerop ci) (zerop in)) | 904 (or (and (zerop ci) (zerop in)) |
| 854 (= lep (line-end-position)) ; on initial line | 905 (= lep (line-end-position)) ; on initial line |
| 855 ;; Not sure why it was like this -- fails in case of | 906 ;; Not sure why it was like this -- fails in case of |
| 856 ;; last internal function followed by first | 907 ;; last internal function followed by first |
| 857 ;; non-def statement of the main body. | 908 ;; non-def statement of the main body. |
| 858 ;;(and def-line (= in ci)) | 909 ;; (and def-line (= in ci)) |
| 859 (= in ci) | 910 (= in ci) |
| 860 (< in ci))) | 911 (< in ci))) |
| 861 (not (python-in-string/comment))) | 912 (not (python-in-string/comment))) |
| 862 (setq found t))))) | 913 (setq found t))) |
| 914 found)) | |
| 863 | 915 |
| 864 (defun python-end-of-defun () | 916 (defun python-end-of-defun () |
| 865 "`end-of-defun-function' for Python. | 917 "`end-of-defun-function' for Python. |
| 866 Finds end of innermost nested class or method definition." | 918 Finds end of innermost nested class or method definition." |
| 867 (let ((orig (point)) | 919 (let ((orig (point)) |
| 911 "Go to start of current statement. | 963 "Go to start of current statement. |
| 912 Accounts for continuation lines, multi-line strings, and | 964 Accounts for continuation lines, multi-line strings, and |
| 913 multi-line bracketed expressions." | 965 multi-line bracketed expressions." |
| 914 (beginning-of-line) | 966 (beginning-of-line) |
| 915 (python-beginning-of-string) | 967 (python-beginning-of-string) |
| 916 (while (python-continuation-line-p) | 968 (let ((point (point))) |
| 917 (beginning-of-line) | 969 (while (and (python-continuation-line-p) |
| 918 (if (python-backslash-continuation-line-p) | 970 (> point (setq point (point)))) |
| 919 (progn | 971 (beginning-of-line) |
| 920 (forward-line -1) | 972 (if (python-backslash-continuation-line-p) |
| 921 (while (python-backslash-continuation-line-p) | 973 (progn |
| 922 (forward-line -1))) | 974 (forward-line -1) |
| 923 (python-beginning-of-string) | 975 (while (python-backslash-continuation-line-p) |
| 924 (python-skip-out))) | 976 (forward-line -1))) |
| 977 (python-beginning-of-string) | |
| 978 (python-skip-out)))) | |
| 925 (back-to-indentation)) | 979 (back-to-indentation)) |
| 926 | 980 |
| 927 (defun python-skip-out (&optional forward syntax) | 981 (defun python-skip-out (&optional forward syntax) |
| 928 "Skip out of any nested brackets. | 982 "Skip out of any nested brackets. |
| 929 Skip forward if FORWARD is non-nil, else backward. | 983 Skip forward if FORWARD is non-nil, else backward. |
| 997 (interactive "p") | 1051 (interactive "p") |
| 998 (unless count (setq count 1)) | 1052 (unless count (setq count 1)) |
| 999 (if (< count 0) | 1053 (if (< count 0) |
| 1000 (python-previous-statement (- count)) | 1054 (python-previous-statement (- count)) |
| 1001 (beginning-of-line) | 1055 (beginning-of-line) |
| 1002 (while (and (> count 0) (not (eobp))) | 1056 (let (bogus) |
| 1003 (python-end-of-statement) | 1057 (while (and (> count 0) (not (eobp)) (not bogus)) |
| 1004 (python-skip-comments/blanks) | 1058 (python-end-of-statement) |
| 1005 (unless (eobp) | 1059 (python-skip-comments/blanks) |
| 1006 (setq count (1- count)))) | 1060 (if (eq 'string (syntax-ppss-context (syntax-ppss))) |
| 1061 (setq bogus t) | |
| 1062 (unless (eobp) | |
| 1063 (setq count (1- count)))))) | |
| 1007 count)) | 1064 count)) |
| 1008 | 1065 |
| 1009 (defun python-beginning-of-block (&optional arg) | 1066 (defun python-beginning-of-block (&optional arg) |
| 1010 "Go to start of current block. | 1067 "Go to start of current block. |
| 1011 With numeric arg, do it that many times. If ARG is negative, call | 1068 With numeric arg, do it that many times. If ARG is negative, call |
| 1064 (ci (current-indentation)) | 1121 (ci (current-indentation)) |
| 1065 (open (python-open-block-statement-p))) | 1122 (open (python-open-block-statement-p))) |
| 1066 (if (and (zerop ci) (not open)) | 1123 (if (and (zerop ci) (not open)) |
| 1067 (not (goto-char point)) | 1124 (not (goto-char point)) |
| 1068 (catch 'done | 1125 (catch 'done |
| 1069 (while (zerop (python-next-statement)) | 1126 (while (zerop (python-next-statement)) |
| 1070 (when (or (and open (<= (current-indentation) ci)) | 1127 (when (or (and open (<= (current-indentation) ci)) |
| 1071 (< (current-indentation) ci)) | 1128 (< (current-indentation) ci)) |
| 1072 (python-skip-comments/blanks t) | 1129 (python-skip-comments/blanks t) |
| 1073 (beginning-of-line 2) | 1130 (beginning-of-line 2) |
| 1074 (throw 'done t))))))) | 1131 (throw 'done t))))))) |
| 1081 (defun python-which-func () | 1138 (defun python-which-func () |
| 1082 (let ((function-name (python-current-defun python-which-func-length-limit))) | 1139 (let ((function-name (python-current-defun python-which-func-length-limit))) |
| 1083 (set-text-properties 0 (length function-name) nil function-name) | 1140 (set-text-properties 0 (length function-name) nil function-name) |
| 1084 function-name)) | 1141 function-name)) |
| 1085 | 1142 |
| 1086 | 1143 |
| 1087 ;;;; Imenu. | 1144 ;;;; Imenu. |
| 1145 | |
| 1146 ;; For possibily speeding this up, here's the top of the ELP profile | |
| 1147 ;; for rescanning pydoc.py (2.2k lines, 90kb): | |
| 1148 ;; Function Name Call Count Elapsed Time Average Time | |
| 1149 ;; ==================================== ========== ============= ============ | |
| 1150 ;; python-imenu-create-index 156 2.430906 0.0155827307 | |
| 1151 ;; python-end-of-defun 155 1.2718260000 0.0082053290 | |
| 1152 ;; python-end-of-block 155 1.1898689999 0.0076765741 | |
| 1153 ;; python-next-statement 2970 1.024717 0.0003450225 | |
| 1154 ;; python-end-of-statement 2970 0.4332190000 0.0001458649 | |
| 1155 ;; python-beginning-of-defun 265 0.0918479999 0.0003465962 | |
| 1156 ;; python-skip-comments/blanks 3125 0.0753319999 2.410...e-05 | |
| 1088 | 1157 |
| 1089 (defvar python-recursing) | 1158 (defvar python-recursing) |
| 1090 (defun python-imenu-create-index () | 1159 (defun python-imenu-create-index () |
| 1091 "`imenu-create-index-function' for Python. | 1160 "`imenu-create-index-function' for Python. |
| 1092 | 1161 |
| 1359 (if pos (python-args-to-list (substring string pos)))))))) | 1428 (if pos (python-args-to-list (substring string pos)))))))) |
| 1360 | 1429 |
| 1361 (defvar python-preoutput-result nil | 1430 (defvar python-preoutput-result nil |
| 1362 "Data from last `_emacs_out' line seen by the preoutput filter.") | 1431 "Data from last `_emacs_out' line seen by the preoutput filter.") |
| 1363 | 1432 |
| 1433 (defvar python-preoutput-continuation nil | |
| 1434 "If non-nil, funcall this when `python-preoutput-filter' sees `_emacs_ok'.") | |
| 1435 | |
| 1364 (defvar python-preoutput-leftover nil) | 1436 (defvar python-preoutput-leftover nil) |
| 1365 (defvar python-preoutput-skip-next-prompt nil) | 1437 (defvar python-preoutput-skip-next-prompt nil) |
| 1366 | 1438 |
| 1367 ;; Using this stops us getting lines in the buffer like | 1439 ;; Using this stops us getting lines in the buffer like |
| 1368 ;; >>> ... ... >>> | 1440 ;; >>> ... ... >>> |
| 1441 ;; Also look for (and delete) an `_emacs_ok' string and call | |
| 1442 ;; `python-preoutput-continuation' if we get it. | |
| 1369 (defun python-preoutput-filter (s) | 1443 (defun python-preoutput-filter (s) |
| 1370 "`comint-preoutput-filter-functions' function: ignore prompts not at bol." | 1444 "`comint-preoutput-filter-functions' function: ignore prompts not at bol." |
| 1371 (when python-preoutput-leftover | 1445 (when python-preoutput-leftover |
| 1372 (setq s (concat python-preoutput-leftover s)) | 1446 (setq s (concat python-preoutput-leftover s)) |
| 1373 (setq python-preoutput-leftover nil)) | 1447 (setq python-preoutput-leftover nil)) |
| 1413 res) | 1487 res) |
| 1414 (t (concat res s))))) | 1488 (t (concat res s))))) |
| 1415 | 1489 |
| 1416 (autoload 'comint-check-proc "comint") | 1490 (autoload 'comint-check-proc "comint") |
| 1417 | 1491 |
| 1492 (defvar python-version-checked nil) | |
| 1493 (defun python-check-version (cmd) | |
| 1494 "Check that CMD runs a suitable version of Python." | |
| 1495 ;; Fixme: Check on Jython. | |
| 1496 (unless (or python-version-checked | |
| 1497 (equal 0 (string-match (regexp-quote python-python-command) | |
| 1498 cmd))) | |
| 1499 (unless (shell-command-to-string cmd) | |
| 1500 (error "Can't run Python command `%s'" cmd)) | |
| 1501 (let* ((res (shell-command-to-string (concat cmd " --version")))) | |
| 1502 (string-match "Python \\([0-9]\\)\\.\\([0-9]\\)" res) | |
| 1503 (unless (and (equal "2" (match-string 1 res)) | |
| 1504 (match-beginning 2) | |
| 1505 (>= (string-to-number (match-string 2 res)) 2)) | |
| 1506 (error "Only Python versions >= 2.2 and < 3.0 supported"))) | |
| 1507 (setq python-version-checked t))) | |
| 1508 | |
| 1418 ;;;###autoload | 1509 ;;;###autoload |
| 1419 (defun run-python (&optional cmd noshow new) | 1510 (defun run-python (&optional cmd noshow new) |
| 1420 "Run an inferior Python process, input and output via buffer *Python*. | 1511 "Run an inferior Python process, input and output via buffer *Python*. |
| 1421 CMD is the Python command to run. NOSHOW non-nil means don't show the | 1512 CMD is the Python command to run. NOSHOW non-nil means don't show the |
| 1422 buffer automatically. | 1513 buffer automatically. |
| 1433 `comint-mode-hook' is run). \(Type \\[describe-mode] in the process | 1524 `comint-mode-hook' is run). \(Type \\[describe-mode] in the process |
| 1434 buffer for a list of commands.)" | 1525 buffer for a list of commands.)" |
| 1435 (interactive (if current-prefix-arg | 1526 (interactive (if current-prefix-arg |
| 1436 (list (read-string "Run Python: " python-command) nil t) | 1527 (list (read-string "Run Python: " python-command) nil t) |
| 1437 (list python-command))) | 1528 (list python-command))) |
| 1438 (unless cmd (setq cmd python-python-command)) | 1529 (unless cmd (setq cmd python-command)) |
| 1530 (python-check-version cmd) | |
| 1439 (setq python-command cmd) | 1531 (setq python-command cmd) |
| 1440 ;; Fixme: Consider making `python-buffer' buffer-local as a buffer | 1532 ;; Fixme: Consider making `python-buffer' buffer-local as a buffer |
| 1441 ;; (not a name) in Python buffers from which `run-python' &c is | 1533 ;; (not a name) in Python buffers from which `run-python' &c is |
| 1442 ;; invoked. Would support multiple processes better. | 1534 ;; invoked. Would support multiple processes better. |
| 1443 (when (or new (not (comint-check-proc python-buffer))) | 1535 (when (or new (not (comint-check-proc python-buffer))) |
| 1444 (with-current-buffer | 1536 (with-current-buffer |
| 1445 (let* ((cmdlist (append (python-args-to-list cmd) '("-i"))) | 1537 (let* ((cmdlist (append (python-args-to-list cmd) '("-i"))) |
| 1446 (path (getenv "PYTHONPATH")) | 1538 (path (getenv "PYTHONPATH")) |
| 1447 (process-environment ; to import emacs.py | 1539 (process-environment ; to import emacs.py |
| 1448 (cons (concat "PYTHONPATH=" data-directory | 1540 (cons (concat "PYTHONPATH=" |
| 1449 (if path (concat path-separator path))) | 1541 (if path (concat path path-separator)) |
| 1450 process-environment))) | 1542 data-directory) |
| 1451 (apply 'make-comint-in-buffer "Python" | 1543 process-environment)) |
| 1452 (if new (generate-new-buffer "*Python*") "*Python*") | 1544 ;; Suppress use of pager for help output: |
| 1453 (car cmdlist) nil (cdr cmdlist))) | 1545 (process-connection-type nil)) |
| 1546 (apply 'make-comint-in-buffer "Python" | |
| 1547 (generate-new-buffer "*Python*") | |
| 1548 (car cmdlist) nil (cdr cmdlist))) | |
| 1454 (setq-default python-buffer (current-buffer)) | 1549 (setq-default python-buffer (current-buffer)) |
| 1455 (setq python-buffer (current-buffer)) | 1550 (setq python-buffer (current-buffer)) |
| 1456 (accept-process-output (get-buffer-process python-buffer) 5) | 1551 (accept-process-output (get-buffer-process python-buffer) 5) |
| 1457 (inferior-python-mode) | 1552 (inferior-python-mode) |
| 1458 ;; Load function definitions we need. | 1553 ;; Load function definitions we need. |
| 1460 ;; cmdlist, but that loses the banner and doesn't run the startup | 1555 ;; cmdlist, but that loses the banner and doesn't run the startup |
| 1461 ;; file. The code might be inline here, but there's enough that it | 1556 ;; file. The code might be inline here, but there's enough that it |
| 1462 ;; seems worth putting in a separate file, and it's probably cleaner | 1557 ;; seems worth putting in a separate file, and it's probably cleaner |
| 1463 ;; to put it in a module. | 1558 ;; to put it in a module. |
| 1464 ;; Ensure we're at a prompt before doing anything else. | 1559 ;; Ensure we're at a prompt before doing anything else. |
| 1465 (python-send-string "import emacs"))) | 1560 (python-send-string "import emacs") |
| 1561 ;; The following line was meant to ensure that we're at a prompt | |
| 1562 ;; before doing anything else. However, this can cause Emacs to | |
| 1563 ;; hang waiting for a response, if that Python function fails | |
| 1564 ;; (i.e. raises an exception). | |
| 1565 ;; (python-send-receive "print '_emacs_out ()'") | |
| 1566 )) | |
| 1466 (if (derived-mode-p 'python-mode) | 1567 (if (derived-mode-p 'python-mode) |
| 1467 (setq python-buffer (default-value 'python-buffer))) ; buffer-local | 1568 (setq python-buffer (default-value 'python-buffer))) ; buffer-local |
| 1468 ;; Without this, help output goes into the inferior python buffer if | 1569 ;; Without this, help output goes into the inferior python buffer if |
| 1469 ;; the process isn't already running. | 1570 ;; the process isn't already running. |
| 1470 (sit-for 1 t) ;Should we use accept-process-output instead? --Stef | 1571 (sit-for 1 t) ;Should we use accept-process-output instead? --Stef |
| 1471 (unless noshow (pop-to-buffer python-buffer t))) | 1572 (unless noshow (pop-to-buffer python-buffer t))) |
| 1472 | 1573 |
| 1473 ;; Fixme: We typically lose if the inferior isn't in the normal REPL, | |
| 1474 ;; e.g. prompt is `help> '. Probably raise an error if the form of | |
| 1475 ;; the prompt is unexpected. Actually, it needs to be `>>> ', not | |
| 1476 ;; `... ', i.e. we're not inputting a block &c. However, this may not | |
| 1477 ;; be the place to check it, e.g. we might actually want to send | |
| 1478 ;; commands having set up such a state. | |
| 1479 | |
| 1480 (defun python-send-command (command) | 1574 (defun python-send-command (command) |
| 1481 "Like `python-send-string' but resets `compilation-shell-minor-mode'. | 1575 "Like `python-send-string' but resets `compilation-shell-minor-mode'." |
| 1482 COMMAND should be a single statement." | 1576 (when (python-check-comint-prompt) |
| 1483 ;; (assert (not (string-match "\n" command))) | 1577 (with-current-buffer (process-buffer (python-proc)) |
| 1484 ;; (let ((end (marker-position (process-mark (python-proc))))) | 1578 (goto-char (point-max)) |
| 1485 (with-current-buffer (process-buffer (python-proc)) | 1579 (compilation-forget-errors) |
| 1486 (goto-char (point-max)) | 1580 (python-send-string command) |
| 1487 (compilation-forget-errors) | 1581 (setq compilation-last-buffer (current-buffer))))) |
| 1488 (python-send-string command) | |
| 1489 (setq compilation-last-buffer (current-buffer))) | |
| 1490 ;; No idea what this is for but it breaks the call to | |
| 1491 ;; compilation-fake-loc in python-send-region. -- Stef | |
| 1492 ;; Must wait until this has completed before re-setting variables below. | |
| 1493 ;; (python-send-receive "print '_emacs_out ()'") | |
| 1494 ;; (with-current-buffer python-buffer | |
| 1495 ;; (set-marker compilation-parsing-end end)) | |
| 1496 ) ;;) | |
| 1497 | 1582 |
| 1498 (defun python-send-region (start end) | 1583 (defun python-send-region (start end) |
| 1499 "Send the region to the inferior Python process." | 1584 "Send the region to the inferior Python process." |
| 1500 ;; The region is evaluated from a temporary file. This avoids | 1585 ;; The region is evaluated from a temporary file. This avoids |
| 1501 ;; problems with blank lines, which have different semantics | 1586 ;; problems with blank lines, which have different semantics |
| 1615 ;; Fixme: Maybe should look for another active process if there | 1700 ;; Fixme: Maybe should look for another active process if there |
| 1616 ;; isn't one for `python-buffer'. | 1701 ;; isn't one for `python-buffer'. |
| 1617 (unless (comint-check-proc python-buffer) | 1702 (unless (comint-check-proc python-buffer) |
| 1618 (run-python nil t)) | 1703 (run-python nil t)) |
| 1619 (get-buffer-process (if (derived-mode-p 'inferior-python-mode) | 1704 (get-buffer-process (if (derived-mode-p 'inferior-python-mode) |
| 1620 (current-buffer) | 1705 (current-buffer) |
| 1621 python-buffer))) | 1706 python-buffer))) |
| 1622 | 1707 |
| 1623 (defun python-set-proc () | 1708 (defun python-set-proc () |
| 1624 "Set the default value of `python-buffer' to correspond to this buffer. | 1709 "Set the default value of `python-buffer' to correspond to this buffer. |
| 1625 If the current buffer has a local value of `python-buffer', set the | 1710 If the current buffer has a local value of `python-buffer', set the |
| 1626 default (global) value to that. The associated Python process is | 1711 default (global) value to that. The associated Python process is |
| 1691 | 1776 |
| 1692 (add-to-list 'debug-ignored-errors "^No symbol") | 1777 (add-to-list 'debug-ignored-errors "^No symbol") |
| 1693 | 1778 |
| 1694 (defun python-send-receive (string) | 1779 (defun python-send-receive (string) |
| 1695 "Send STRING to inferior Python (if any) and return result. | 1780 "Send STRING to inferior Python (if any) and return result. |
| 1696 The result is what follows `_emacs_out' in the output." | 1781 The result is what follows `_emacs_out' in the output. |
| 1782 This is a no-op if `python-check-comint-prompt' returns nil." | |
| 1697 (python-send-string string) | 1783 (python-send-string string) |
| 1698 (let ((proc (python-proc))) | 1784 (let ((proc (python-proc))) |
| 1699 (with-current-buffer (process-buffer proc) | 1785 (with-current-buffer (process-buffer proc) |
| 1700 (set (make-local-variable 'python-preoutput-result) nil) | 1786 (when (python-check-comint-prompt proc) |
| 1701 (while (progn | 1787 (set (make-local-variable 'python-preoutput-result) nil) |
| 1702 (accept-process-output proc 5) | 1788 (while (progn |
| 1703 (null python-preoutput-result))) | 1789 (accept-process-output proc 5) |
| 1704 (prog1 python-preoutput-result | 1790 (null python-preoutput-result))) |
| 1705 (kill-local-variable 'python-preoutput-result))))) | 1791 (prog1 python-preoutput-result |
| 1792 (kill-local-variable 'python-preoutput-result)))))) | |
| 1793 | |
| 1794 (defun python-check-comint-prompt (&optional proc) | |
| 1795 "Return non-nil iff there's a normal prompt in the inferior buffer. | |
| 1796 If there isn't, it's probably not appropriate to send input to return | |
| 1797 Eldoc information etc. If PROC is non-nil, check the buffer for that | |
| 1798 process." | |
| 1799 (with-current-buffer (process-buffer (or proc (python-proc))) | |
| 1800 (save-excursion | |
| 1801 (save-match-data (re-search-backward ">>> \\=" nil t))))) | |
| 1706 | 1802 |
| 1707 ;; Fixme: Is there anything reasonable we can do with random methods? | 1803 ;; Fixme: Is there anything reasonable we can do with random methods? |
| 1708 ;; (Currently only works with functions.) | 1804 ;; (Currently only works with functions.) |
| 1709 (defun python-eldoc-function () | 1805 (defun python-eldoc-function () |
| 1710 "`eldoc-documentation-function' for Python. | 1806 "`eldoc-documentation-function' for Python. |
| 1714 (current-word)))) | 1810 (current-word)))) |
| 1715 ;; This is run from timers, so inhibit-quit tends to be set. | 1811 ;; This is run from timers, so inhibit-quit tends to be set. |
| 1716 (with-local-quit | 1812 (with-local-quit |
| 1717 ;; First try the symbol we're on. | 1813 ;; First try the symbol we're on. |
| 1718 (or (and symbol | 1814 (or (and symbol |
| 1719 (python-send-receive (format "emacs.eargs(%S, %s)" | 1815 (python-send-receive (format "emacs.eargs(%S, %s)" |
| 1720 symbol python-imports))) | 1816 symbol python-imports))) |
| 1721 ;; Try moving to symbol before enclosing parens. | 1817 ;; Try moving to symbol before enclosing parens. |
| 1722 (let ((s (syntax-ppss))) | 1818 (let ((s (syntax-ppss))) |
| 1723 (unless (zerop (car s)) | 1819 (unless (zerop (car s)) |
| 1724 (when (eq ?\( (char-after (nth 1 s))) | 1820 (when (eq ?\( (char-after (nth 1 s))) |
| 1725 (save-excursion | 1821 (save-excursion |
| 1726 (goto-char (nth 1 s)) | 1822 (goto-char (nth 1 s)) |
| 1727 (skip-syntax-backward "-") | 1823 (skip-syntax-backward "-") |
| 1728 (let ((point (point))) | 1824 (let ((point (point))) |
| 1729 (skip-chars-backward "a-zA-Z._") | 1825 (skip-chars-backward "a-zA-Z._") |
| 1730 (if (< (point) point) | 1826 (if (< (point) point) |
| 1731 (python-send-receive | 1827 (python-send-receive |
| 1732 (format "emacs.eargs(%S, %s)" | 1828 (format "emacs.eargs(%S, %s)" |
| 1733 (buffer-substring-no-properties (point) point) | 1829 (buffer-substring-no-properties (point) point) |
| 1734 python-imports)))))))))))) | 1830 python-imports)))))))))))) |
| 1735 | 1831 |
| 1736 ;;;; Info-look functionality. | 1832 ;;;; Info-look functionality. |
| 1737 | 1833 |
| 1738 (declare-function info-lookup-maybe-add-help "info-look" (&rest arg)) | 1834 (declare-function info-lookup-maybe-add-help "info-look" (&rest arg)) |
| 1739 | 1835 |
| 1749 (with-temp-buffer | 1845 (with-temp-buffer |
| 1750 (with-no-warnings (Info-mode)) | 1846 (with-no-warnings (Info-mode)) |
| 1751 (condition-case () | 1847 (condition-case () |
| 1752 ;; Don't use `info' because it would pop-up a *info* buffer. | 1848 ;; Don't use `info' because it would pop-up a *info* buffer. |
| 1753 (with-no-warnings | 1849 (with-no-warnings |
| 1754 (Info-goto-node (format "(python%s-lib)Miscellaneous Index" | 1850 (Info-goto-node (format "(python%s-lib)Miscellaneous Index" |
| 1755 version)) | 1851 version)) |
| 1756 t) | 1852 t) |
| 1757 (error nil))))) | 1853 (error nil))))) |
| 1758 (info-lookup-maybe-add-help | 1854 (info-lookup-maybe-add-help |
| 1759 :mode 'python-mode | 1855 :mode 'python-mode |
| 1760 :regexp "[[:alnum:]_]+" | 1856 :regexp "[[:alnum:]_]+" |
| 1761 :doc-spec | 1857 :doc-spec |
| 1827 | 1923 |
| 1828 (defun python-fill-paragraph (&optional justify) | 1924 (defun python-fill-paragraph (&optional justify) |
| 1829 "`fill-paragraph-function' handling multi-line strings and possibly comments. | 1925 "`fill-paragraph-function' handling multi-line strings and possibly comments. |
| 1830 If any of the current line is in or at the end of a multi-line string, | 1926 If any of the current line is in or at the end of a multi-line string, |
| 1831 fill the string or the paragraph of it that point is in, preserving | 1927 fill the string or the paragraph of it that point is in, preserving |
| 1832 the strings's indentation." | 1928 the string's indentation." |
| 1833 (interactive "P") | 1929 (interactive "P") |
| 1834 (or (fill-comment-paragraph justify) | 1930 (or (fill-comment-paragraph justify) |
| 1835 (save-excursion | 1931 (save-excursion |
| 1836 (end-of-line) | 1932 (end-of-line) |
| 1837 (let* ((syntax (syntax-ppss)) | 1933 (let* ((syntax (syntax-ppss)) |
| 1843 ;; The `paragraph-start' and `paragraph-separate' | 1939 ;; The `paragraph-start' and `paragraph-separate' |
| 1844 ;; variables don't allow us to delimit the last | 1940 ;; variables don't allow us to delimit the last |
| 1845 ;; paragraph in a multi-line string properly, so narrow | 1941 ;; paragraph in a multi-line string properly, so narrow |
| 1846 ;; to the string and then fill around (the end of) the | 1942 ;; to the string and then fill around (the end of) the |
| 1847 ;; current line. | 1943 ;; current line. |
| 1848 ((eq t (nth 3 syntax)) ; in fenced string | 1944 ((eq t (nth 3 syntax)) ; in fenced string |
| 1849 (goto-char (nth 8 syntax)) ; string start | 1945 (goto-char (nth 8 syntax)) ; string start |
| 1850 (setq start (line-beginning-position)) | 1946 (setq start (line-beginning-position)) |
| 1851 (setq end (condition-case () ; for unbalanced quotes | 1947 (setq end (condition-case () ; for unbalanced quotes |
| 1852 (progn (forward-sexp) | 1948 (progn (forward-sexp) |
| 1853 (- (point) 3)) | 1949 (- (point) 3)) |
| 1866 ;; Avoid losing leading and trailing newlines in doc | 1962 ;; Avoid losing leading and trailing newlines in doc |
| 1867 ;; strings written like: | 1963 ;; strings written like: |
| 1868 ;; """ | 1964 ;; """ |
| 1869 ;; ... | 1965 ;; ... |
| 1870 ;; """ | 1966 ;; """ |
| 1871 (let* ((paragraph-separate | 1967 (let ((paragraph-separate |
| 1872 (concat ".*\\s|\"\"$" ; newline after opening quotes | 1968 ;; Note that the string could be part of an |
| 1873 "\\|\\(?:" paragraph-separate "\\)")) | 1969 ;; expression, so it can have preceding and |
| 1874 (paragraph-start | 1970 ;; trailing non-whitespace. |
| 1875 (concat ".*\\s|\"\"[ \t]*[^ \t].*" ; not newline after | 1971 (concat |
| 1876 ; opening quotes | 1972 (rx (or |
| 1877 "\\|\\(?:" paragraph-separate "\\)")) | 1973 ;; Opening triple quote without following text. |
| 1878 (fill-paragraph-function)) | 1974 (and (* nonl) |
| 1975 (group (syntax string-delimiter)) | |
| 1976 (repeat 2 (backref 1)) | |
| 1977 ;; Fixme: Not sure about including | |
| 1978 ;; trailing whitespace. | |
| 1979 (* (any " \t")) | |
| 1980 eol) | |
| 1981 ;; Closing trailing quote without preceding text. | |
| 1982 (and (group (any ?\" ?')) (backref 2) | |
| 1983 (syntax string-delimiter)))) | |
| 1984 "\\(?:" paragraph-separate "\\)")) | |
| 1985 fill-paragraph-function) | |
| 1879 (fill-paragraph justify))))))) t) | 1986 (fill-paragraph justify))))))) t) |
| 1880 | 1987 |
| 1881 (defun python-shift-left (start end &optional count) | 1988 (defun python-shift-left (start end &optional count) |
| 1882 "Shift lines in region COUNT (the prefix arg) columns to the left. | 1989 "Shift lines in region COUNT (the prefix arg) columns to the left. |
| 1883 COUNT defaults to `python-indent'. If region isn't active, just shift | 1990 COUNT defaults to `python-indent'. If region isn't active, just shift |
| 1986 (while (re-search-forward "^import\\>\\|^from\\>" nil t) | 2093 (while (re-search-forward "^import\\>\\|^from\\>" nil t) |
| 1987 (unless (syntax-ppss-context (syntax-ppss)) | 2094 (unless (syntax-ppss-context (syntax-ppss)) |
| 1988 (let ((start (line-beginning-position))) | 2095 (let ((start (line-beginning-position))) |
| 1989 ;; Skip over continued lines. | 2096 ;; Skip over continued lines. |
| 1990 (while (and (eq ?\\ (char-before (line-end-position))) | 2097 (while (and (eq ?\\ (char-before (line-end-position))) |
| 1991 (= 0 (forward-line 1)))) | 2098 (= 0 (forward-line 1))) |
| 2099 t) | |
| 1992 (push (buffer-substring start (line-beginning-position 2)) | 2100 (push (buffer-substring start (line-beginning-position 2)) |
| 1993 lines)))) | 2101 lines)))) |
| 1994 (setq python-imports | 2102 (setq python-imports |
| 1995 (if lines | 2103 (if lines |
| 1996 (apply #'concat | 2104 (apply #'concat |
| 2039 (rx (or buffer-start (regexp "[^[:alnum:]._]")) | 2147 (rx (or buffer-start (regexp "[^[:alnum:]._]")) |
| 2040 (group (1+ (regexp "[[:alnum:]._]"))) point) | 2148 (group (1+ (regexp "[[:alnum:]._]"))) point) |
| 2041 nil t) | 2149 nil t) |
| 2042 (match-beginning 1))))) | 2150 (match-beginning 1))))) |
| 2043 (if start (buffer-substring-no-properties start end)))) | 2151 (if start (buffer-substring-no-properties start end)))) |
| 2044 | |
| 2045 (defun python-complete-symbol () | |
| 2046 "Perform completion on the Python symbol preceding point. | |
| 2047 Repeating the command scrolls the completion window." | |
| 2048 (interactive) | |
| 2049 (let ((window (get-buffer-window "*Completions*"))) | |
| 2050 (if (and (eq last-command this-command) | |
| 2051 (window-live-p window) (window-buffer window) | |
| 2052 (buffer-name (window-buffer window))) | |
| 2053 (with-current-buffer (window-buffer window) | |
| 2054 (if (pos-visible-in-window-p (point-max) window) | |
| 2055 (set-window-start window (point-min)) | |
| 2056 (save-selected-window | |
| 2057 (select-window window) | |
| 2058 (scroll-up)))) | |
| 2059 ;; Do completion. | |
| 2060 (let* ((end (point)) | |
| 2061 (symbol (python-partial-symbol)) | |
| 2062 (completions (python-symbol-completions symbol)) | |
| 2063 (completion (if completions | |
| 2064 (try-completion symbol completions)))) | |
| 2065 (when symbol | |
| 2066 (cond ((eq completion t)) | |
| 2067 ((null completion) | |
| 2068 (message "Can't find completion for \"%s\"" symbol) | |
| 2069 (ding)) | |
| 2070 ((not (string= symbol completion)) | |
| 2071 (delete-region (- end (length symbol)) end) | |
| 2072 (insert completion)) | |
| 2073 (t | |
| 2074 (message "Making completion list...") | |
| 2075 (with-output-to-temp-buffer "*Completions*" | |
| 2076 (display-completion-list completions symbol)) | |
| 2077 (message "Making completion list...%s" "done")))))))) | |
| 2078 | |
| 2079 (defun python-try-complete (old) | |
| 2080 "Completion function for Python for use with `hippie-expand'." | |
| 2081 (when (derived-mode-p 'python-mode) ; though we only add it locally | |
| 2082 (unless old | |
| 2083 (let ((symbol (python-partial-symbol))) | |
| 2084 (he-init-string (- (point) (length symbol)) (point)) | |
| 2085 (if (not (he-string-member he-search-string he-tried-table)) | |
| 2086 (push he-search-string he-tried-table)) | |
| 2087 (setq he-expand-list | |
| 2088 (and symbol (python-symbol-completions symbol))))) | |
| 2089 (while (and he-expand-list | |
| 2090 (he-string-member (car he-expand-list) he-tried-table)) | |
| 2091 (pop he-expand-list)) | |
| 2092 (if he-expand-list | |
| 2093 (progn | |
| 2094 (he-substitute-string (pop he-expand-list)) | |
| 2095 t) | |
| 2096 (if old (he-reset-string)) | |
| 2097 nil))) | |
| 2098 | 2152 |
| 2099 ;;;; FFAP support | 2153 ;;;; FFAP support |
| 2100 | 2154 |
| 2101 (defun python-module-path (module) | 2155 (defun python-module-path (module) |
| 2102 "Function for `ffap-alist' to return path to MODULE." | 2156 "Function for `ffap-alist' to return path to MODULE." |
| 2103 (python-send-receive (format "emacs.modpath (%S)" module))) | 2157 (python-send-receive (format "emacs.modpath (%S)" module))) |
| 2104 | 2158 |
| 2105 (eval-after-load "ffap" | 2159 (eval-after-load "ffap" |
| 2106 '(push '(python-mode . python-module-path) ffap-alist)) | 2160 '(push '(python-mode . python-module-path) ffap-alist)) |
| 2161 | |
| 2162 ;;;; Find-function support | |
| 2163 | |
| 2164 ;; Fixme: key binding? | |
| 2165 | |
| 2166 (defun python-find-function (name) | |
| 2167 "Find source of definition of function NAME. | |
| 2168 Interactively, prompt for name." | |
| 2169 (interactive | |
| 2170 (let ((symbol (with-syntax-table python-dotty-syntax-table | |
| 2171 (current-word))) | |
| 2172 (enable-recursive-minibuffers t)) | |
| 2173 (list (read-string (if symbol | |
| 2174 (format "Find location of (default %s): " symbol) | |
| 2175 "Find location of: ") | |
| 2176 nil nil symbol)))) | |
| 2177 (unless python-imports | |
| 2178 (error "Not called from buffer visiting Python file")) | |
| 2179 (let* ((loc (python-send-receive (format "emacs.location_of (%S, %s)" | |
| 2180 name python-imports))) | |
| 2181 (loc (car (read-from-string loc))) | |
| 2182 (file (car loc)) | |
| 2183 (line (cdr loc))) | |
| 2184 (unless file (error "Don't know where `%s' is defined" name)) | |
| 2185 (pop-to-buffer (find-file-noselect file)) | |
| 2186 (when (integerp line) | |
| 2187 (goto-line line)))) | |
| 2107 | 2188 |
| 2108 ;;;; Skeletons | 2189 ;;;; Skeletons |
| 2109 | 2190 |
| 2110 (defcustom python-use-skeletons nil | 2191 (defcustom python-use-skeletons nil |
| 2111 "Non-nil means template skeletons will be automagically inserted. | 2192 "Non-nil means template skeletons will be automagically inserted. |
| 2130 (defmacro def-python-skeleton (name &rest elements) | 2211 (defmacro def-python-skeleton (name &rest elements) |
| 2131 (let* ((name (symbol-name name)) | 2212 (let* ((name (symbol-name name)) |
| 2132 (function (intern (concat "python-insert-" name)))) | 2213 (function (intern (concat "python-insert-" name)))) |
| 2133 `(progn | 2214 `(progn |
| 2134 (add-to-list 'python-skeletons ',(cons name function)) | 2215 (add-to-list 'python-skeletons ',(cons name function)) |
| 2135 (define-abbrev python-mode-abbrev-table ,name "" ',function | 2216 ;; Usual technique for inserting a skeleton, but expand |
| 2136 :system t :case-fixed t | 2217 ;; to the original abbrev instead if in a comment or string. |
| 2137 :enable-function (lambda () python-use-skeletons)) | 2218 (define-abbrev python-mode-abbrev-table ,name "" |
| 2219 ;; Quote this to give a readable abbrev table. | |
| 2220 '(lambda () | |
| 2221 (if (python-in-string/comment) | |
| 2222 (insert ,name) | |
| 2223 (,function))) | |
| 2224 nil t) ; system abbrev | |
| 2138 (define-skeleton ,function | 2225 (define-skeleton ,function |
| 2139 ,(format "Insert Python \"%s\" template." name) | 2226 ,(format "Insert Python \"%s\" template." name) |
| 2140 ,@elements))))) | 2227 ,@elements))))) |
| 2141 (put 'def-python-skeleton 'lisp-indent-function 2) | 2228 (put 'def-python-skeleton 'lisp-indent-function 2) |
| 2142 | 2229 |
| 2143 ;; From `skeleton-further-elements': | 2230 ;; From `skeleton-further-elements' set below: |
| 2144 ;; `<': outdent a level; | 2231 ;; `<': outdent a level; |
| 2145 ;; `^': delete indentation on current line and also previous newline. | 2232 ;; `^': delete indentation on current line and also previous newline. |
| 2146 ;; Not quote like `delete-indentation'. Assumes point is at | 2233 ;; Not quite like `delete-indentation'. Assumes point is at |
| 2147 ;; beginning of indentation. | 2234 ;; beginning of indentation. |
| 2148 | 2235 |
| 2149 (def-python-skeleton if | 2236 (def-python-skeleton if |
| 2150 "Condition: " | 2237 "Condition: " |
| 2151 "if " str ":" \n | 2238 "if " str ":" \n |
| 2152 > _ \n | 2239 > -1 ; Fixme: I don't understand the spurious space this removes. |
| 2240 _ \n | |
| 2153 ("other condition, %s: " | 2241 ("other condition, %s: " |
| 2154 < ; Avoid wrong indentation after block opening. | 2242 < ; Avoid wrong indentation after block opening. |
| 2155 "elif " str ":" \n | 2243 "elif " str ":" \n |
| 2156 > _ \n nil) | 2244 > _ \n nil) |
| 2157 '(python-else) | ^) | 2245 '(python-else) | ^) |
| 2165 > _ \n) | 2253 > _ \n) |
| 2166 | 2254 |
| 2167 (def-python-skeleton while | 2255 (def-python-skeleton while |
| 2168 "Condition: " | 2256 "Condition: " |
| 2169 "while " str ":" \n | 2257 "while " str ":" \n |
| 2170 > _ \n | 2258 > -1 _ \n |
| 2171 '(python-else) | ^) | 2259 '(python-else) | ^) |
| 2172 | 2260 |
| 2173 (def-python-skeleton for | 2261 (def-python-skeleton for |
| 2174 "Target, %s: " | 2262 "Target, %s: " |
| 2175 "for " str " in " (skeleton-read "Expression, %s: ") ":" \n | 2263 "for " str " in " (skeleton-read "Expression, %s: ") ":" \n |
| 2176 > _ \n | 2264 > -1 _ \n |
| 2177 '(python-else) | ^) | 2265 '(python-else) | ^) |
| 2178 | 2266 |
| 2179 (def-python-skeleton try/except | 2267 (def-python-skeleton try/except |
| 2180 nil | 2268 nil |
| 2181 "try:" \n | 2269 "try:" \n |
| 2182 > _ \n | 2270 > -1 _ \n |
| 2183 ("Exception, %s: " | 2271 ("Exception, %s: " |
| 2184 < "except " str '(python-target) ":" \n | 2272 < "except " str '(python-target) ":" \n |
| 2185 > _ \n nil) | 2273 > _ \n nil) |
| 2186 < "except:" \n | 2274 < "except:" \n |
| 2187 > _ \n | 2275 > _ \n |
| 2192 "Target, %s: " ", " str | -2) | 2280 "Target, %s: " ", " str | -2) |
| 2193 | 2281 |
| 2194 (def-python-skeleton try/finally | 2282 (def-python-skeleton try/finally |
| 2195 nil | 2283 nil |
| 2196 "try:" \n | 2284 "try:" \n |
| 2197 > _ \n | 2285 > -1 _ \n |
| 2198 < "finally:" \n | 2286 < "finally:" \n |
| 2199 > _ \n) | 2287 > _ \n) |
| 2200 | 2288 |
| 2201 (def-python-skeleton def | 2289 (def-python-skeleton def |
| 2202 "Name: " | 2290 "Name: " |
| 2203 "def " str " (" ("Parameter, %s: " (unless (equal ?\( (char-before)) ", ") | 2291 "def " str " (" ("Parameter, %s: " (unless (equal ?\( (char-before)) ", ") |
| 2204 str) "):" \n | 2292 str) "):" \n |
| 2205 "\"\"\"" @ " \"\"\"" \n ; Fixme: syntaxification wrong for """""" | 2293 "\"\"\"" - "\"\"\"" \n ; Fixme: extra space inserted -- why?). |
| 2206 > _ \n) | 2294 > _ \n) |
| 2207 | 2295 |
| 2208 (def-python-skeleton class | 2296 (def-python-skeleton class |
| 2209 "Name: " | 2297 "Name: " |
| 2210 "class " str " (" ("Inheritance, %s: " | 2298 "class " str " (" ("Inheritance, %s: " |
| 2211 (unless (equal ?\( (char-before)) ", ") | 2299 (unless (equal ?\( (char-before)) ", ") |
| 2212 str) | 2300 str) |
| 2213 & ")" | -2 ; close list or remove opening | 2301 & ")" | -2 ; close list or remove opening |
| 2214 ":" \n | 2302 ":" \n |
| 2215 "\"\"\"" @ " \"\"\"" \n | 2303 "\"\"\"" - "\"\"\"" \n |
| 2216 > _ \n) | 2304 > _ \n) |
| 2217 | 2305 |
| 2218 (defvar python-default-template "if" | 2306 (defvar python-default-template "if" |
| 2219 "Default template to expand by `python-expand-template'. | 2307 "Default template to expand by `python-expand-template'. |
| 2220 Updated on each expansion.") | 2308 Updated on each expansion.") |
| 2253 (condition-case data | 2341 (condition-case data |
| 2254 (unless (fboundp 'brm-rename) | 2342 (unless (fboundp 'brm-rename) |
| 2255 (pymacs-load "bikeemacs" "brm-") ; first line of normal recipe | 2343 (pymacs-load "bikeemacs" "brm-") ; first line of normal recipe |
| 2256 (let ((py-mode-map (make-sparse-keymap)) ; it assumes this | 2344 (let ((py-mode-map (make-sparse-keymap)) ; it assumes this |
| 2257 (features (cons 'python-mode features))) ; and requires this | 2345 (features (cons 'python-mode features))) ; and requires this |
| 2258 (brm-init)) ; second line of normal recipe | 2346 (brm-init) ; second line of normal recipe |
| 2259 (remove-hook 'python-mode-hook ; undo this from `brm-init' | 2347 (remove-hook 'python-mode-hook ; undo this from `brm-init' |
| 2260 '(lambda () (easy-menu-add brm-menu))) | 2348 '(lambda () (easy-menu-add brm-menu))) |
| 2261 (easy-menu-define | 2349 (easy-menu-define |
| 2262 python-brm-menu python-mode-map | 2350 python-brm-menu python-mode-map |
| 2263 "Bicycle Repair Man" | 2351 "Bicycle Repair Man" |
| 2264 '("BicycleRepairMan" | 2352 '("BicycleRepairMan" |
| 2265 :help "Interface to navigation and refactoring tool" | 2353 :help "Interface to navigation and refactoring tool" |
| 2266 "Queries" | 2354 "Queries" |
| 2267 ["Find References" brm-find-references | 2355 ["Find References" brm-find-references |
| 2268 :help "Find references to name at point in compilation buffer"] | 2356 :help "Find references to name at point in compilation buffer"] |
| 2269 ["Find Definition" brm-find-definition | 2357 ["Find Definition" brm-find-definition |
| 2270 :help "Find definition of name at point"] | 2358 :help "Find definition of name at point"] |
| 2271 "-" | 2359 "-" |
| 2272 "Refactoring" | 2360 "Refactoring" |
| 2273 ["Rename" brm-rename | 2361 ["Rename" brm-rename |
| 2274 :help "Replace name at point with a new name everywhere"] | 2362 :help "Replace name at point with a new name everywhere"] |
| 2275 ["Extract Method" brm-extract-method | 2363 ["Extract Method" brm-extract-method |
| 2276 :active (and mark-active (not buffer-read-only)) | 2364 :active (and mark-active (not buffer-read-only)) |
| 2277 :help "Replace statements in region with a method"] | 2365 :help "Replace statements in region with a method"] |
| 2278 ["Extract Local Variable" brm-extract-local-variable | 2366 ["Extract Local Variable" brm-extract-local-variable |
| 2279 :active (and mark-active (not buffer-read-only)) | 2367 :active (and mark-active (not buffer-read-only)) |
| 2280 :help "Replace expression in region with an assignment"] | 2368 :help "Replace expression in region with an assignment"] |
| 2281 ["Inline Local Variable" brm-inline-local-variable | 2369 ["Inline Local Variable" brm-inline-local-variable |
| 2282 :help | 2370 :help |
| 2283 "Substitute uses of variable at point with its definition"] | 2371 "Substitute uses of variable at point with its definition"] |
| 2284 ;; Fixme: Should check for anything to revert. | 2372 ;; Fixme: Should check for anything to revert. |
| 2285 ["Undo Last Refactoring" brm-undo :help ""]))) | 2373 ["Undo Last Refactoring" brm-undo :help ""])))) |
| 2286 (error (error "Bicyclerepairman setup failed: %s" data)))) | 2374 (error (error "BicycleRepairMan setup failed: %s" data)))) |
| 2287 | 2375 |
| 2288 ;;;; Modes. | 2376 ;;;; Modes. |
| 2289 | 2377 |
| 2290 (defvar outline-heading-end-regexp) | 2378 (defvar outline-heading-end-regexp) |
| 2291 (defvar eldoc-documentation-function) | 2379 (defvar eldoc-documentation-function) |
| 2292 (defvar python-mode-running) ;Dynamically scoped var. | 2380 (defvar python-mode-running) ;Dynamically scoped var. |
| 2293 | 2381 |
| 2382 ;; Stuff to allow expanding abbrevs with non-word constituents. | |
| 2383 (defun python-abbrev-pc-hook () | |
| 2384 "Reset the syntax table after possibly expanding abbrevs." | |
| 2385 (remove-hook 'post-command-hook 'python-abbrev-pc-hook t) | |
| 2386 (set-syntax-table python-mode-syntax-table)) | |
| 2387 | |
| 2388 (defvar python-abbrev-syntax-table | |
| 2389 (copy-syntax-table python-mode-syntax-table) | |
| 2390 "Syntax table used when expanding abbrevs.") | |
| 2391 | |
| 2392 (defun python-pea-hook () | |
| 2393 "Set the syntax table before possibly expanding abbrevs." | |
| 2394 (set-syntax-table python-abbrev-syntax-table) | |
| 2395 (add-hook 'post-command-hook 'python-abbrev-pc-hook nil t)) | |
| 2396 (modify-syntax-entry ?/ "w" python-abbrev-syntax-table) | |
| 2397 | |
| 2294 ;;;###autoload | 2398 ;;;###autoload |
| 2295 (define-derived-mode python-mode fundamental-mode "Python" | 2399 (define-derived-mode python-mode fundamental-mode "Python" |
| 2296 "Major mode for editing Python files. | 2400 "Major mode for editing Python files. |
| 2297 Font Lock mode is currently required for correct parsing of the source. | 2401 Turns on Font Lock mode unconditionally since it is currently required |
| 2402 for correct parsing of the source. | |
| 2298 See also `jython-mode', which is actually invoked if the buffer appears to | 2403 See also `jython-mode', which is actually invoked if the buffer appears to |
| 2299 contain Jython code. See also `run-python' and associated Python mode | 2404 contain Jython code. See also `run-python' and associated Python mode |
| 2300 commands for running Python under Emacs. | 2405 commands for running Python under Emacs. |
| 2301 | 2406 |
| 2302 The Emacs commands which work with `defun's, e.g. \\[beginning-of-defun], deal | 2407 The Emacs commands which work with `defun's, e.g. \\[beginning-of-defun], deal |
| 2361 (set (make-local-variable 'eldoc-documentation-function) | 2466 (set (make-local-variable 'eldoc-documentation-function) |
| 2362 #'python-eldoc-function) | 2467 #'python-eldoc-function) |
| 2363 (add-hook 'eldoc-mode-hook | 2468 (add-hook 'eldoc-mode-hook |
| 2364 (lambda () (run-python nil t)) ; need it running | 2469 (lambda () (run-python nil t)) ; need it running |
| 2365 nil t) | 2470 nil t) |
| 2471 (set (make-local-variable 'symbol-completion-symbol-function) | |
| 2472 'python-partial-symbol) | |
| 2473 (set (make-local-variable 'symbol-completion-completions-function) | |
| 2474 'python-symbol-completions) | |
| 2366 ;; Fixme: should be in hideshow. This seems to be of limited use | 2475 ;; Fixme: should be in hideshow. This seems to be of limited use |
| 2367 ;; since it isn't (can't be) indentation-based. Also hide-level | 2476 ;; since it isn't (can't be) indentation-based. Also hide-level |
| 2368 ;; doesn't seem to work properly. | 2477 ;; doesn't seem to work properly. |
| 2369 (add-to-list 'hs-special-modes-alist | 2478 (add-to-list 'hs-special-modes-alist |
| 2370 `(python-mode "^\\s-*\\(?:def\\|class\\)\\>" nil "#" | 2479 `(python-mode "^\\s-*\\(?:def\\|class\\)\\>" nil "#" |
| 2371 ,(lambda (arg) | 2480 ,(lambda (arg) |
| 2372 (python-end-of-defun) | 2481 (python-end-of-defun) |
| 2373 (skip-chars-backward " \t\n")) | 2482 (skip-chars-backward " \t\n")) |
| 2374 nil)) | 2483 nil)) |
| 2375 (set (make-local-variable 'skeleton-further-elements) | 2484 (set (make-local-variable 'skeleton-further-elements) |
| 2376 '((< '(backward-delete-char-untabify (min python-indent | 2485 '((< '(backward-delete-char-untabify (min python-indent |
| 2377 (current-column)))) | 2486 (current-column)))) |
| 2378 (^ '(- (1+ (current-indentation)))))) | 2487 (^ '(- (1+ (current-indentation)))))) |
| 2488 (add-hook 'pre-abbrev-expand-hook 'python-pea-hook nil t) | |
| 2379 (if (featurep 'hippie-exp) | 2489 (if (featurep 'hippie-exp) |
| 2380 (set (make-local-variable 'hippie-expand-try-functions-list) | 2490 (set (make-local-variable 'hippie-expand-try-functions-list) |
| 2381 (cons 'python-try-complete hippie-expand-try-functions-list))) | 2491 (cons 'symbol-completion-try-complete |
| 2492 hippie-expand-try-functions-list))) | |
| 2382 ;; Python defines TABs as being 8-char wide. | 2493 ;; Python defines TABs as being 8-char wide. |
| 2383 (set (make-local-variable 'tab-width) 8) | 2494 (set (make-local-variable 'tab-width) 8) |
| 2495 (unless font-lock-mode (font-lock-mode 1)) | |
| 2384 (when python-guess-indent (python-guess-indent)) | 2496 (when python-guess-indent (python-guess-indent)) |
| 2385 ;; Let's make it harder for the user to shoot himself in the foot. | 2497 ;; Let's make it harder for the user to shoot himself in the foot. |
| 2386 (unless (= tab-width python-indent) | 2498 (unless (= tab-width python-indent) |
| 2387 (setq indent-tabs-mode nil)) | 2499 (setq indent-tabs-mode nil)) |
| 2388 (set (make-local-variable 'python-command) python-python-command) | 2500 (set (make-local-variable 'python-command) python-python-command) |
| 2389 (python-find-imports) | 2501 (python-find-imports) |
| 2390 (unless (boundp 'python-mode-running) ; kill the recursion from jython-mode | 2502 (unless (boundp 'python-mode-running) ; kill the recursion from jython-mode |
| 2391 (let ((python-mode-running t)) | 2503 (let ((python-mode-running t)) |
| 2392 (python-maybe-jython)))) | 2504 (python-maybe-jython)))) |
| 2393 | 2505 |
| 2506 ;; Not done automatically in Emacs 21 or 22. | |
| 2507 (defcustom python-mode-hook nil | |
| 2508 "Hook run when entering Python mode." | |
| 2509 :group 'python | |
| 2510 :type 'hook) | |
| 2394 (custom-add-option 'python-mode-hook 'imenu-add-menubar-index) | 2511 (custom-add-option 'python-mode-hook 'imenu-add-menubar-index) |
| 2395 (custom-add-option 'python-mode-hook | 2512 (custom-add-option 'python-mode-hook |
| 2396 (lambda () | 2513 (lambda () |
| 2397 "Turn off Indent Tabs mode." | 2514 "Turn off Indent Tabs mode." |
| 2398 (set (make-local-variable 'indent-tabs-mode) nil))) | 2515 (setq indent-tabs-mode nil))) |
| 2399 (custom-add-option 'python-mode-hook 'turn-on-eldoc-mode) | 2516 (custom-add-option 'python-mode-hook 'turn-on-eldoc-mode) |
| 2400 (custom-add-option 'python-mode-hook 'abbrev-mode) | 2517 (custom-add-option 'python-mode-hook 'abbrev-mode) |
| 2401 (custom-add-option 'python-mode-hook 'python-setup-brm) | 2518 (custom-add-option 'python-mode-hook 'python-setup-brm) |
| 2402 | 2519 |
| 2403 ;;;###autoload | 2520 ;;;###autoload |
| 2774 (defun python-sentinel (proc msg) | 2891 (defun python-sentinel (proc msg) |
| 2775 (setq overlay-arrow-position nil)) | 2892 (setq overlay-arrow-position nil)) |
| 2776 | 2893 |
| 2777 (provide 'python) | 2894 (provide 'python) |
| 2778 (provide 'python-21) | 2895 (provide 'python-21) |
| 2896 | |
| 2779 ;; arch-tag: 6fce1d99-a704-4de9-ba19-c6e4912b0554 | 2897 ;; arch-tag: 6fce1d99-a704-4de9-ba19-c6e4912b0554 |
| 2780 ;;; python.el ends here | 2898 ;;; python.el ends here |
