Mercurial > emacs
comparison lisp/progmodes/python.el @ 94139:1e40bf35d15e
(python-mode-map): Use abbrev-table-menu.
(python-use-skeletons): Remove, unused.
(python-skeletons): Remove. Use the abbrev table instead.
(python-mode-abbrev-table): Fix regexp; add enable-function and case-fixed.
(def-python-skeleton): Simplify.
(python-expand-template): Use the abbrev-table and abbrev-insert.
(python-abbrev-pc-hook, python-abbrev-syntax-table, python-pea-hook): Remove.
(python-mode): Don't set pre-abbrev-expand-hook.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Thu, 17 Apr 2008 20:09:54 +0000 |
parents | 105ec1146aa7 |
children | b4b1e6b43d64 |
comparison
equal
deleted
inserted
replaced
94138:b6c3fde83add | 94139:1e40bf35d15e |
---|---|
294 :help "Go to end of innermost definition around point"] | 294 :help "Go to end of innermost definition around point"] |
295 "-" | 295 "-" |
296 ("Templates..." | 296 ("Templates..." |
297 :help "Expand templates for compound statements" | 297 :help "Expand templates for compound statements" |
298 :filter (lambda (&rest junk) | 298 :filter (lambda (&rest junk) |
299 (mapcar (lambda (elt) | 299 (abbrev-table-menu python-mode-abbrev-table))) |
300 (vector (car elt) (cdr elt) t)) | |
301 python-skeletons))) ; defined later | |
302 "-" | 300 "-" |
303 ["Start interpreter" python-shell | 301 ["Start interpreter" python-shell |
304 :help "Run `inferior' Python in separate buffer"] | 302 :help "Run `inferior' Python in separate buffer"] |
305 ["Import/reload file" python-load-file | 303 ["Import/reload file" python-load-file |
306 :help "Load into inferior Python session"] | 304 :help "Load into inferior Python session"] |
2200 (when (integerp line) | 2198 (when (integerp line) |
2201 (goto-line line)))) | 2199 (goto-line line)))) |
2202 | 2200 |
2203 ;;;; Skeletons | 2201 ;;;; Skeletons |
2204 | 2202 |
2205 (defcustom python-use-skeletons nil | |
2206 "Non-nil means template skeletons will be automagically inserted. | |
2207 This happens when pressing \"if<SPACE>\", for example, to prompt for | |
2208 the if condition." | |
2209 :type 'boolean | |
2210 :group 'python) | |
2211 | |
2212 (defvar python-skeletons nil | |
2213 "Alist of named skeletons for Python mode. | |
2214 Elements are of the form (NAME . EXPANDER-FUNCTION).") | |
2215 | |
2216 (define-abbrev-table 'python-mode-abbrev-table () | 2203 (define-abbrev-table 'python-mode-abbrev-table () |
2217 "Abbrev table for Python mode. | 2204 "Abbrev table for Python mode." |
2218 The default contents correspond to the elements of `python-skeletons'." | 2205 :case-fixed t |
2219 ;; Allow / in abbrevs. | 2206 ;; Allow / inside abbrevs. |
2220 :regexp "\\<\\([[:word:]/]+\\)\\W*") | 2207 :regexp "\\(?:^\\|[^/]\\)\\<\\([[:word:]/]+\\)\\W*" |
2208 ;; Only expand in code. | |
2209 :enable-function (lambda () (not (python-in-string/comment)))) | |
2221 | 2210 |
2222 (eval-when-compile | 2211 (eval-when-compile |
2223 ;; Define a user-level skeleton and add it to `python-skeletons' and | 2212 ;; Define a user-level skeleton and add it to the abbrev table. |
2224 ;; the abbrev table. | |
2225 (defmacro def-python-skeleton (name &rest elements) | 2213 (defmacro def-python-skeleton (name &rest elements) |
2226 (let* ((name (symbol-name name)) | 2214 (let* ((name (symbol-name name)) |
2227 (function (intern (concat "python-insert-" name)))) | 2215 (function (intern (concat "python-insert-" name)))) |
2228 `(progn | 2216 `(progn |
2229 (add-to-list 'python-skeletons ',(cons name function)) | |
2230 ;; Usual technique for inserting a skeleton, but expand | 2217 ;; Usual technique for inserting a skeleton, but expand |
2231 ;; to the original abbrev instead if in a comment or string. | 2218 ;; to the original abbrev instead if in a comment or string. |
2232 (define-abbrev python-mode-abbrev-table ,name "" | 2219 (define-abbrev python-mode-abbrev-table ,name "" |
2233 ;; Quote this to give a readable abbrev table. | 2220 ',function |
2234 '(lambda () | |
2235 (if (python-in-string/comment) | |
2236 (insert ,name) | |
2237 (,function))) | |
2238 nil t) ; system abbrev | 2221 nil t) ; system abbrev |
2239 (define-skeleton ,function | 2222 (define-skeleton ,function |
2240 ,(format "Insert Python \"%s\" template." name) | 2223 ,(format "Insert Python \"%s\" template." name) |
2241 ,@elements))))) | 2224 ,@elements))))) |
2242 (put 'def-python-skeleton 'lisp-indent-function 2) | 2225 (put 'def-python-skeleton 'lisp-indent-function 2) |
2325 "Expand template named NAME. | 2308 "Expand template named NAME. |
2326 Interactively, prompt for the name with completion." | 2309 Interactively, prompt for the name with completion." |
2327 (interactive | 2310 (interactive |
2328 (list (completing-read (format "Template to expand (default %s): " | 2311 (list (completing-read (format "Template to expand (default %s): " |
2329 python-default-template) | 2312 python-default-template) |
2330 python-skeletons nil t))) | 2313 python-mode-abbrev-table nil t nil nil |
2314 python-default-template))) | |
2331 (if (equal "" name) | 2315 (if (equal "" name) |
2332 (setq name python-default-template) | 2316 (setq name python-default-template) |
2333 (setq python-default-template name)) | 2317 (setq python-default-template name)) |
2334 (let ((func (cdr (assoc name python-skeletons)))) | 2318 (let ((sym (abbrev-symbol name python-mode-abbrev-table))) |
2335 (if func | 2319 (if sym |
2336 (funcall func) | 2320 (abbrev-insert sym) |
2337 (error "Undefined template: %s" name)))) | 2321 (error "Undefined template: %s" name)))) |
2338 | 2322 |
2339 ;;;; Bicycle Repair Man support | 2323 ;;;; Bicycle Repair Man support |
2340 | 2324 |
2341 (autoload 'pymacs-load "pymacs" nil t) | 2325 (autoload 'pymacs-load "pymacs" nil t) |
2394 (add-hook 'comint-output-filter-functions 'python-pdbtrack-track-stack-file) | 2378 (add-hook 'comint-output-filter-functions 'python-pdbtrack-track-stack-file) |
2395 | 2379 |
2396 (defvar outline-heading-end-regexp) | 2380 (defvar outline-heading-end-regexp) |
2397 (defvar eldoc-documentation-function) | 2381 (defvar eldoc-documentation-function) |
2398 (defvar python-mode-running) ;Dynamically scoped var. | 2382 (defvar python-mode-running) ;Dynamically scoped var. |
2399 | |
2400 ;; Stuff to allow expanding abbrevs with non-word constituents. | |
2401 (defun python-abbrev-pc-hook () | |
2402 "Reset the syntax table after possibly expanding abbrevs." | |
2403 (remove-hook 'post-command-hook 'python-abbrev-pc-hook t) | |
2404 (set-syntax-table python-mode-syntax-table)) | |
2405 | |
2406 (defvar python-abbrev-syntax-table | |
2407 (copy-syntax-table python-mode-syntax-table) | |
2408 "Syntax table used when expanding abbrevs.") | |
2409 | |
2410 (defun python-pea-hook () | |
2411 "Set the syntax table before possibly expanding abbrevs." | |
2412 (set-syntax-table python-abbrev-syntax-table) | |
2413 (add-hook 'post-command-hook 'python-abbrev-pc-hook nil t)) | |
2414 (modify-syntax-entry ?/ "w" python-abbrev-syntax-table) | |
2415 | 2383 |
2416 ;;;###autoload | 2384 ;;;###autoload |
2417 (define-derived-mode python-mode fundamental-mode "Python" | 2385 (define-derived-mode python-mode fundamental-mode "Python" |
2418 "Major mode for editing Python files. | 2386 "Major mode for editing Python files. |
2419 Turns on Font Lock mode unconditionally since it is currently required | 2387 Turns on Font Lock mode unconditionally since it is currently required |
2501 nil)) | 2469 nil)) |
2502 (set (make-local-variable 'skeleton-further-elements) | 2470 (set (make-local-variable 'skeleton-further-elements) |
2503 '((< '(backward-delete-char-untabify (min python-indent | 2471 '((< '(backward-delete-char-untabify (min python-indent |
2504 (current-column)))) | 2472 (current-column)))) |
2505 (^ '(- (1+ (current-indentation)))))) | 2473 (^ '(- (1+ (current-indentation)))))) |
2506 (add-hook 'pre-abbrev-expand-hook 'python-pea-hook nil t) | |
2507 (if (featurep 'hippie-exp) | 2474 (if (featurep 'hippie-exp) |
2508 (set (make-local-variable 'hippie-expand-try-functions-list) | 2475 (set (make-local-variable 'hippie-expand-try-functions-list) |
2509 (cons 'symbol-completion-try-complete | 2476 (cons 'symbol-completion-try-complete |
2510 hippie-expand-try-functions-list))) | 2477 hippie-expand-try-functions-list))) |
2511 ;; Python defines TABs as being 8-char wide. | 2478 ;; Python defines TABs as being 8-char wide. |