Mercurial > emacs
comparison lisp/progmodes/python.el @ 92111:105ec1146aa7
Finish pdbtrack integration cleanup, settling missing-functions
byte compiler warnings appropriately.
* progmodes/python.el (python-point): Remove this - beginning-of-line was
all that was necessary for `python-pdbtrack-overlay-arrow'.
(python-end-of-def-or-class, python-beginning-of-def-or-class)
(python-goto-initial-line): Drop these - they were only needed for
python-point.
(python-comint-output-filter-function): Use condition-case and
beginning-of-line directly, instead of python-mode.el functions
which require all sorts of baggage.
(point-safe): Unnecessary - we're using condition-case directly,
instead.
(python-execute-file): Include for python-shell, which i'm leaving
in keeping despite it being unnecessary for pdb tracking.
| author | Ken Manheimer <ken.manheimer@gmail.com> |
|---|---|
| date | Fri, 22 Feb 2008 17:49:48 +0000 |
| parents | fd85a7810d53 |
| children | 1e40bf35d15e |
comparison
equal
deleted
inserted
replaced
| 92110:458c8171667a | 92111:105ec1146aa7 |
|---|---|
| 2545 | 2545 |
| 2546 | 2546 |
| 2547 | 2547 |
| 2548 ;; pdbtrack features | 2548 ;; pdbtrack features |
| 2549 | 2549 |
| 2550 (defsubst python-point (position) | |
| 2551 "Returns the value of point at certain commonly referenced POSITIONs. | |
| 2552 POSITION can be one of the following symbols: | |
| 2553 | |
| 2554 bol -- beginning of line | |
| 2555 eol -- end of line | |
| 2556 bod -- beginning of def or class | |
| 2557 eod -- end of def or class | |
| 2558 bob -- beginning of buffer | |
| 2559 eob -- end of buffer | |
| 2560 boi -- back to indentation | |
| 2561 bos -- beginning of statement | |
| 2562 | |
| 2563 This function does not modify point or mark." | |
| 2564 (let ((here (point))) | |
| 2565 (cond | |
| 2566 ((eq position 'bol) (beginning-of-line)) | |
| 2567 ((eq position 'eol) (end-of-line)) | |
| 2568 ((eq position 'bod) (python-beginning-of-def-or-class)) | |
| 2569 ((eq position 'eod) (python-end-of-def-or-class)) | |
| 2570 ;; Kind of funny, I know, but useful for python-up-exception. | |
| 2571 ((eq position 'bob) (goto-char (point-min))) | |
| 2572 ((eq position 'eob) (goto-char (point-max))) | |
| 2573 ((eq position 'boi) (back-to-indentation)) | |
| 2574 ((eq position 'bos) (python-goto-initial-line)) | |
| 2575 (t (error "Unknown buffer position requested: %s" position))) | |
| 2576 (prog1 | |
| 2577 (point) | |
| 2578 (goto-char here)))) | |
| 2579 | |
| 2580 (defun python-end-of-def-or-class (&optional class count) | |
| 2581 "Move point beyond end of `def' or `class' body. | |
| 2582 | |
| 2583 By default, looks for an appropriate `def'. If you supply a prefix | |
| 2584 arg, looks for a `class' instead. The docs below assume the `def' | |
| 2585 case; just substitute `class' for `def' for the other case. | |
| 2586 Programmatically, if CLASS is `either', then moves to either `class' | |
| 2587 or `def'. | |
| 2588 | |
| 2589 When second optional argument is given programmatically, move to the | |
| 2590 COUNTth end of `def'. | |
| 2591 | |
| 2592 If point is in a `def' statement already, this is the `def' we use. | |
| 2593 | |
| 2594 Else, if the `def' found by `\\[python-beginning-of-def-or-class]' | |
| 2595 contains the statement you started on, that's the `def' we use. | |
| 2596 | |
| 2597 Otherwise, we search forward for the closest following `def', and use that. | |
| 2598 | |
| 2599 If a `def' can be found by these rules, point is moved to the start of | |
| 2600 the line immediately following the `def' block, and the position of the | |
| 2601 start of the `def' is returned. | |
| 2602 | |
| 2603 Else point is moved to the end of the buffer, and nil is returned. | |
| 2604 | |
| 2605 Note that doing this command repeatedly will take you closer to the | |
| 2606 end of the buffer each time. | |
| 2607 | |
| 2608 To mark the current `def', see `\\[python-mark-def-or-class]'." | |
| 2609 (interactive "P") ; raw prefix arg | |
| 2610 (if (and count (/= count 1)) | |
| 2611 (python-beginning-of-def-or-class (- 1 count))) | |
| 2612 (let ((start (progn (python-goto-initial-line) (point))) | |
| 2613 (which (cond ((eq class 'either) "\\(class\\|def\\)") | |
| 2614 (class "class") | |
| 2615 (t "def"))) | |
| 2616 (state 'not-found)) | |
| 2617 ;; move point to start of appropriate def/class | |
| 2618 (if (looking-at (concat "[ \t]*" which "\\>")) ; already on one | |
| 2619 (setq state 'at-beginning) | |
| 2620 ;; else see if python-beginning-of-def-or-class hits container | |
| 2621 (if (and (python-beginning-of-def-or-class class) | |
| 2622 (progn (python-goto-beyond-block) | |
| 2623 (> (point) start))) | |
| 2624 (setq state 'at-end) | |
| 2625 ;; else search forward | |
| 2626 (goto-char start) | |
| 2627 (if (re-search-forward (concat "^[ \t]*" which "\\>") nil 'move) | |
| 2628 (progn (setq state 'at-beginning) | |
| 2629 (beginning-of-line))))) | |
| 2630 (cond | |
| 2631 ((eq state 'at-beginning) (python-goto-beyond-block) t) | |
| 2632 ((eq state 'at-end) t) | |
| 2633 ((eq state 'not-found) nil) | |
| 2634 (t (error "Internal error in `python-end-of-def-or-class'"))))) | |
| 2635 | |
| 2636 (defun python-beginning-of-def-or-class (&optional class count) | |
| 2637 "Move point to start of `def' or `class'. | |
| 2638 | |
| 2639 Searches back for the closest preceding `def'. If you supply a prefix | |
| 2640 arg, looks for a `class' instead. The docs below assume the `def' | |
| 2641 case; just substitute `class' for `def' for the other case. | |
| 2642 Programmatically, if CLASS is `either', then moves to either `class' | |
| 2643 or `def'. | |
| 2644 | |
| 2645 When second optional argument is given programmatically, move to the | |
| 2646 COUNTth start of `def'. | |
| 2647 | |
| 2648 If point is in a `def' statement already, and after the `d', simply | |
| 2649 moves point to the start of the statement. | |
| 2650 | |
| 2651 Otherwise (i.e. when point is not in a `def' statement, or at or | |
| 2652 before the `d' of a `def' statement), searches for the closest | |
| 2653 preceding `def' statement, and leaves point at its start. If no such | |
| 2654 statement can be found, leaves point at the start of the buffer. | |
| 2655 | |
| 2656 Returns t iff a `def' statement is found by these rules. | |
| 2657 | |
| 2658 Note that doing this command repeatedly will take you closer to the | |
| 2659 start of the buffer each time. | |
| 2660 | |
| 2661 To mark the current `def', see `\\[python-mark-def-or-class]'." | |
| 2662 (interactive "P") ; raw prefix arg | |
| 2663 (setq count (or count 1)) | |
| 2664 (let ((at-or-before-p (<= (current-column) (current-indentation))) | |
| 2665 (start-of-line (goto-char (python-point 'bol))) | |
| 2666 (start-of-stmt (goto-char (python-point 'bos))) | |
| 2667 (start-re (cond ((eq class 'either) "^[ \t]*\\(class\\|def\\)\\>") | |
| 2668 (class "^[ \t]*class\\>") | |
| 2669 (t "^[ \t]*def\\>")))) | |
| 2670 ;; searching backward | |
| 2671 (if (and (< 0 count) | |
| 2672 (or (/= start-of-stmt start-of-line) | |
| 2673 (not at-or-before-p))) | |
| 2674 (end-of-line)) | |
| 2675 ;; search forward | |
| 2676 (if (and (> 0 count) | |
| 2677 (zerop (current-column)) | |
| 2678 (looking-at start-re)) | |
| 2679 (end-of-line)) | |
| 2680 (if (re-search-backward start-re nil 'move count) | |
| 2681 (goto-char (match-beginning 0))))) | |
| 2682 | |
| 2683 (defun python-goto-initial-line () | |
| 2684 "Go to the initial line of the current statement. | |
| 2685 Usually this is the line we're on, but if we're on the 2nd or | |
| 2686 following lines of a continuation block, we need to go up to the first | |
| 2687 line of the block." | |
| 2688 ;; Tricky: We want to avoid quadratic-time behavior for long | |
| 2689 ;; continued blocks, whether of the backslash or open-bracket | |
| 2690 ;; varieties, or a mix of the two. The following manages to do that | |
| 2691 ;; in the usual cases. | |
| 2692 ;; | |
| 2693 ;; Also, if we're sitting inside a triple quoted string, this will | |
| 2694 ;; drop us at the line that begins the string. | |
| 2695 (let (open-bracket-pos) | |
| 2696 (while (python-continuation-line-p) | |
| 2697 (beginning-of-line) | |
| 2698 (if (python-backslash-continuation-line-p) | |
| 2699 (while (python-backslash-continuation-line-p) | |
| 2700 (forward-line -1)) | |
| 2701 ;; else zip out of nested brackets/braces/parens | |
| 2702 (while (setq open-bracket-pos (python-nesting-level)) | |
| 2703 (goto-char open-bracket-pos))))) | |
| 2704 (beginning-of-line)) | |
| 2705 | |
| 2706 (defun python-comint-output-filter-function (string) | 2550 (defun python-comint-output-filter-function (string) |
| 2707 "Watch output for Python prompt and exec next file waiting in queue. | 2551 "Watch output for Python prompt and exec next file waiting in queue. |
| 2708 This function is appropriate for `comint-output-filter-functions'." | 2552 This function is appropriate for `comint-output-filter-functions'." |
| 2709 ;; TBD: this should probably use split-string | 2553 ;; TBD: this should probably use split-string |
| 2710 (when (and (or (string-equal string ">>> ") | 2554 (when (and (or (string-equal string ">>> ") |
| 2711 (and (>= (length string) 5) | 2555 (and (>= (length string) 5) |
| 2712 (string-equal (substring string -5) "\n>>> "))) | 2556 (string-equal (substring string -5) "\n>>> "))) |
| 2713 python-file-queue) | 2557 python-file-queue) |
| 2714 (python-safe (delete-file (car python-file-queue))) | 2558 (condition-case nil |
| 2559 (delete-file (car python-file-queue)) | |
| 2560 (error nil)) | |
| 2715 (setq python-file-queue (cdr python-file-queue)) | 2561 (setq python-file-queue (cdr python-file-queue)) |
| 2716 (if python-file-queue | 2562 (if python-file-queue |
| 2717 (let ((pyproc (get-buffer-process (current-buffer)))) | 2563 (let ((pyproc (get-buffer-process (current-buffer)))) |
| 2718 (python-execute-file pyproc (car python-file-queue)))))) | 2564 (python-execute-file pyproc (car python-file-queue)))))) |
| 2719 | 2565 |
| 2723 (progn | 2569 (progn |
| 2724 (setq overlay-arrow-position (make-marker) | 2570 (setq overlay-arrow-position (make-marker) |
| 2725 overlay-arrow-string "=>" | 2571 overlay-arrow-string "=>" |
| 2726 python-pdbtrack-is-tracking-p t) | 2572 python-pdbtrack-is-tracking-p t) |
| 2727 (set-marker overlay-arrow-position | 2573 (set-marker overlay-arrow-position |
| 2728 (python-point 'bol) (current-buffer))) | 2574 (save-excursion (beginning-of-line) (point)) |
| 2575 (current-buffer))) | |
| 2729 (setq overlay-arrow-position nil | 2576 (setq overlay-arrow-position nil |
| 2730 python-pdbtrack-is-tracking-p nil))) | 2577 python-pdbtrack-is-tracking-p nil))) |
| 2731 | 2578 |
| 2732 (defun python-pdbtrack-track-stack-file (text) | 2579 (defun python-pdbtrack-track-stack-file (text) |
| 2733 "Show the file indicated by the pdb stack entry line, in a separate window. | 2580 "Show the file indicated by the pdb stack entry line, in a separate window. |
| 2898 python-which-bufname "JPython" | 2745 python-which-bufname "JPython" |
| 2899 msg "JPython" | 2746 msg "JPython" |
| 2900 mode-name "JPython"))) | 2747 mode-name "JPython"))) |
| 2901 (message "Using the %s shell" msg))) | 2748 (message "Using the %s shell" msg))) |
| 2902 | 2749 |
| 2750 ;; Python subprocess utilities and filters | |
| 2751 (defun python-execute-file (proc filename) | |
| 2752 "Send to Python interpreter process PROC \"execfile('FILENAME')\". | |
| 2753 Make that process's buffer visible and force display. Also make | |
| 2754 comint believe the user typed this string so that | |
| 2755 `kill-output-from-shell' does The Right Thing." | |
| 2756 (let ((curbuf (current-buffer)) | |
| 2757 (procbuf (process-buffer proc)) | |
| 2758 ; (comint-scroll-to-bottom-on-output t) | |
| 2759 (msg (format "## working on region in file %s...\n" filename)) | |
| 2760 ;; add some comment, so that we can filter it out of history | |
| 2761 (cmd (format "execfile(r'%s') # PYTHON-MODE\n" filename))) | |
| 2762 (unwind-protect | |
| 2763 (save-excursion | |
| 2764 (set-buffer procbuf) | |
| 2765 (goto-char (point-max)) | |
| 2766 (move-marker (process-mark proc) (point)) | |
| 2767 (funcall (process-filter proc) proc msg)) | |
| 2768 (set-buffer curbuf)) | |
| 2769 (process-send-string proc cmd))) | |
| 2903 ;;;###autoload | 2770 ;;;###autoload |
| 2904 (defun python-shell (&optional argprompt) | 2771 (defun python-shell (&optional argprompt) |
| 2905 "Start an interactive Python interpreter in another window. | 2772 "Start an interactive Python interpreter in another window. |
| 2906 This is like Shell mode, except that Python is running in the window | 2773 This is like Shell mode, except that Python is running in the window |
| 2907 instead of a shell. See the `Interactive Shell' and `Shell Mode' | 2774 instead of a shell. See the `Interactive Shell' and `Shell Mode' |
