~a-roehler/python-mode/XEmacs-compat-test

« back to all changes in this revision

Viewing changes to python-mode.el

  • Committer: Andreas Roehler
  • Date: 2012-01-25 16:04:56 UTC
  • Revision ID: andreas.roehler@online.de-20120125160456-il33pprhin40m5zt
fixes lp:921224, thanks François Pinard

also lp:921355 should be fixed 











Show diffs side-by-side

added added

removed removed

Lines of Context:
89
89
  :group 'python-mode)
90
90
 
91
91
(defcustom py-load-pymacs-p  nil
92
 
 "If Pymacs as delivered with python-mode.el shall be loaded.
 
92
  "If Pymacs as delivered with python-mode.el shall be loaded.
93
93
Default is nil.
94
94
 
95
95
Pymacs has been written by François Pinard and many others.
96
96
See original source: http://pymacs.progiciels-bpi.ca"
97
97
 
98
 
:type 'boolean
99
 
:group 'python-mode)
 
98
  :type 'boolean
 
99
  :group 'python-mode)
100
100
 
101
101
(defcustom py-report-level-p nil
102
102
  "If indenting functions should report reached indent level.
222
222
(defcustom ipython-complete-function 'ipython-complete
223
223
  "Function used for completion in IPython shell buffers.
224
224
 
225
 
Minor bug: `ipython-complete' raises the prompt counter when completion done 
 
225
Minor bug: `ipython-complete' raises the prompt counter when completion done
226
226
 
227
227
Richard Everson commented:
228
228
 
299
299
  :tag "Jython Command Args")
300
300
 
301
301
(defcustom py-cleanup-temporary  t
302
 
 "If temporary buffers and files used by functions executing region  should be deleted afterwards. "
 
302
  "If temporary buffers and files used by functions executing region  should be deleted afterwards. "
303
303
 
304
 
:type 'boolean
305
 
:group 'python
306
 
)
 
304
  :type 'boolean
 
305
  :group 'python
 
306
  )
307
307
 
308
308
(defcustom py-lhs-inbound-indent 1
309
309
  "When line starts a multiline-assignment: How many colums indent should be more than opening bracket, brace or parenthesis. "
464
464
(make-obsolete-variable 'py-jpython-packages 'py-jython-packages nil)
465
465
 
466
466
(defcustom py-current-defun-show  t
467
 
 "If `py-current-defun' should jump to the definition, highlight it while waiting PY-WHICH-FUNC-DELAY seconds, before returning to previous position.
 
467
  "If `py-current-defun' should jump to the definition, highlight it while waiting PY-WHICH-FUNC-DELAY seconds, before returning to previous position.
468
468
 
469
469
Default is `t'."
470
470
 
471
 
:type 'boolean
472
 
:group 'python-mode)
 
471
  :type 'boolean
 
472
  :group 'python-mode)
473
473
 
474
474
(defcustom py-current-defun-delay  2
475
 
 "When called interactively, `py-current-defun' should wait PY-WHICH-FUNC-DELAY seconds at the definition name found, before returning to previous position. "
 
475
  "When called interactively, `py-current-defun' should wait PY-WHICH-FUNC-DELAY seconds at the definition name found, before returning to previous position. "
476
476
 
477
 
:type 'number
478
 
:group 'python-mode)
 
477
  :type 'number
 
478
  :group 'python-mode)
479
479
 
480
480
(defcustom py-send-receive-delay  5
481
 
 "Seconds to wait for output, used by `python-send-receive'. "
 
481
  "Seconds to wait for output, used by `python-send-receive'. "
482
482
 
483
 
:type 'number
484
 
:group 'python-mode)
 
483
  :type 'number
 
484
  :group 'python-mode)
485
485
 
486
486
(defvar py-exec-command nil
487
487
  "Mode commands will set this. ")
634
634
  "A regular expression to match the output prompt of IPython.")
635
635
 
636
636
(defcustom py-cleanup-temporary  t
637
 
 "If temporary buffers and files used by functions executing region  should be deleted afterwards. "
 
637
  "If temporary buffers and files used by functions executing region  should be deleted afterwards. "
638
638
 
639
 
:type 'boolean
640
 
:group 'python
641
 
)
 
639
  :type 'boolean
 
640
  :group 'python
 
641
  )
642
642
 
643
643
(defcustom py-match-paren-mode nil
644
644
  "*Non-nil means, cursor will jump to beginning or end of a block.
1089
1089
 
1090
1090
;; pdbtrack constants
1091
1091
(defconst py-pdbtrack-stack-entry-regexp
1092
 
   (concat ".*\\("py-shell-input-prompt-1-regexp">\\|>\\) *\\(.*\\)(\\([0-9]+\\))\\([?a-zA-Z0-9_<>()]+\\)()")
 
1092
  (concat ".*\\("py-shell-input-prompt-1-regexp">\\|>\\) *\\(.*\\)(\\([0-9]+\\))\\([?a-zA-Z0-9_<>()]+\\)()")
1093
1093
  "Regular expression pdbtrack uses to find a stack trace entry.")
1094
1094
 
1095
1095
;; ipython.el
1180
1180
          (eval-when-compile (string-to-syntax "|")))))
1181
1181
     ;; Otherwise (we're in a non-matching string) the property is
1182
1182
     ;; nil, which is OK.
1183
 
)))
 
1183
     )))
1184
1184
 
1185
1185
 
1186
1186
;;;; Keymap and syntax
1197
1197
  "Keymap used in *Python* shell buffers.")
1198
1198
 
1199
1199
(defvar python-mode-syntax-table nil
1200
 
    "Syntax table for Python files.")
 
1200
  "Syntax table for Python files.")
1201
1201
 
1202
1202
(setq python-mode-syntax-table
1203
1203
      (let ((table (make-syntax-table)))
1342
1342
    (save-excursion
1343
1343
      (setq erg
1344
1344
            (progn
1345
 
    (cond
1346
 
     ((eq position 'bol) (beginning-of-line))
1347
 
     ((eq position 'eol) (end-of-line))
1348
 
     ((eq position 'bod) (py-beginning-of-def-or-class 'either))
1349
 
     ((eq position 'eod) (py-end-of-def-or-class 'either))
1350
 
     ;; Kind of funny, I know, but useful for py-up-exception.
1351
 
     ((eq position 'bob) (goto-char (point-min)))
1352
 
     ((eq position 'eob) (goto-char (point-max)))
1353
 
     ((eq position 'boi) (back-to-indentation))
1354
 
     ((eq position 'bos) (py-beginning-of-statement))
 
1345
              (cond
 
1346
               ((eq position 'bol) (beginning-of-line))
 
1347
               ((eq position 'eol) (end-of-line))
 
1348
               ((eq position 'bod) (py-beginning-of-def-or-class 'either))
 
1349
               ((eq position 'eod) (py-end-of-def-or-class 'either))
 
1350
               ;; Kind of funny, I know, but useful for py-up-exception.
 
1351
               ((eq position 'bob) (goto-char (point-min)))
 
1352
               ((eq position 'eob) (goto-char (point-max)))
 
1353
               ((eq position 'boi) (back-to-indentation))
 
1354
               ((eq position 'bos) (py-beginning-of-statement))
1355
1355
               (t (error "Unknown buffer position requested: %s" position))) (point))))
1356
1356
    erg))
1357
1357
 
1649
1649
              (indent (py-compute-indentation)))
1650
1650
          (unless
1651
1651
              ;; (or
1652
 
               (eq (current-indentation) indent)
 
1652
              (eq (current-indentation) indent)
1653
1653
            ;; (looking-back "#[ \t]*"))
1654
1654
            (goto-char orig)
1655
1655
            (beginning-of-line)
1692
1692
 
1693
1693
Used by `py-electric-colon', which will not indent than. "
1694
1694
  (let (erg)
1695
 
      (save-excursion
1696
 
        (beginning-of-line)
1697
 
        (setq erg (or (looking-at py-class-re)
1698
 
                      (looking-at py-def-re))))
1699
 
      erg))
 
1695
    (save-excursion
 
1696
      (beginning-of-line)
 
1697
      (setq erg (or (looking-at py-class-re)
 
1698
                    (looking-at py-def-re))))
 
1699
    erg))
1700
1700
 
1701
1701
 
1702
1702
;; Electric deletion
1715
1715
                (delete-char (- remains))
1716
1716
              (indent-line-to (- (current-indentation) py-indent-offset))))
1717
1717
        (delete-char (- 1))))
1718
 
  (setq erg (current-column))
1719
 
  (when (and (interactive-p) py-report-level-p) (message "%s" erg))
 
1718
    (setq erg (current-column))
 
1719
    (when (and (interactive-p) py-report-level-p) (message "%s" erg))
1720
1720
    erg))
1721
1721
 
1722
1722
(defun py-electric-delete (&optional arg)
1876
1876
  (interactive "P")
1877
1877
  (save-excursion
1878
1878
    (goto-char (point-min))
1879
 
      (let ((lastindent (if
1880
 
                             (py-beginning-of-statement-p)
1881
 
                             (current-indentation)
1882
 
                           (progn
 
1879
    (let ((lastindent (if
 
1880
                          (py-beginning-of-statement-p)
 
1881
                          (current-indentation)
 
1882
                        (progn
1883
1883
                          (py-down-statement)
1884
1884
                          (current-indentation)))))
1885
 
        (while (and (eq lastindent (current-indentation))
 
1885
      (while (and (eq lastindent (current-indentation))
1886
1886
                  (not (eobp))
1887
1887
                  (setq erg (point))
1888
1888
                  (py-down-statement)
1889
1889
                  (< erg (point))
1890
 
                    (not (py-guessed-sanity-check (setq erg (abs (- lastindent (current-indentation))))))))
 
1890
                  (not (py-guessed-sanity-check (setq erg (abs (- lastindent (current-indentation))))))))
1891
1891
      (if (py-guessed-sanity-check erg)
1892
 
                (progn
1893
 
          (funcall (if global 'kill-local-variable 'make-local-variable)
1894
 
                   'py-indent-offset)
1895
 
              (setq py-indent-offset erg))
 
1892
          (progn
 
1893
            (funcall (if global 'kill-local-variable 'make-local-variable)
 
1894
                     'py-indent-offset)
 
1895
            (setq py-indent-offset erg))
1896
1896
        (setq py-indent-offset (default-value 'py-indent-offset)))
1897
 
        (when (interactive-p)
1898
 
          (message "%s value of py-indent-offset:  %d"
1899
 
                   (if global "Global" "Local")
1900
 
                   py-indent-offset))
 
1897
      (when (interactive-p)
 
1898
        (message "%s value of py-indent-offset:  %d"
 
1899
                 (if global "Global" "Local")
 
1900
                 py-indent-offset))
1901
1901
      py-indent-offset)))
1902
1902
 
1903
1903
(defun py-guessed-sanity-check (guessed)
2017
2017
Returns outmost indentation reached. "
2018
2018
  (interactive "*P")
2019
2019
  (let ((erg (py-shift-forms-base "paragraph" (or arg py-indent-offset))))
2020
 
        (when (and (interactive-p) py-report-level-p) (message "%s" erg))
 
2020
    (when (and (interactive-p) py-report-level-p) (message "%s" erg))
2021
2021
    erg))
2022
2022
 
2023
2023
(defun py-shift-paragraph-left (&optional arg)
2041
2041
Returns outmost indentation reached. "
2042
2042
  (interactive "*P")
2043
2043
  (let ((erg (py-shift-forms-base "block" (or arg py-indent-offset))))
2044
 
        (when (and (interactive-p) py-report-level-p) (message "%s" erg))
 
2044
    (when (and (interactive-p) py-report-level-p) (message "%s" erg))
2045
2045
    erg))
2046
2046
 
2047
2047
(defun py-shift-block-left (&optional arg)
2065
2065
Returns outmost indentation reached. "
2066
2066
  (interactive "*P")
2067
2067
  (let ((erg (py-shift-forms-base "clause" (or arg py-indent-offset))))
2068
 
        (when (and (interactive-p) py-report-level-p) (message "%s" erg))
 
2068
    (when (and (interactive-p) py-report-level-p) (message "%s" erg))
2069
2069
    erg))
2070
2070
 
2071
2071
(defun py-shift-clause-left (&optional arg)
2089
2089
Returns outmost indentation reached. "
2090
2090
  (interactive "*P")
2091
2091
  (let ((erg (py-shift-forms-base "def" (or arg py-indent-offset))))
2092
 
        (when (and (interactive-p) py-report-level-p) (message "%s" erg))
 
2092
    (when (and (interactive-p) py-report-level-p) (message "%s" erg))
2093
2093
    erg))
2094
2094
 
2095
2095
(defun py-shift-def-left (&optional arg)
2113
2113
Returns outmost indentation reached. "
2114
2114
  (interactive "*P")
2115
2115
  (let ((erg (py-shift-forms-base "class" (or arg py-indent-offset))))
2116
 
        (when (and (interactive-p) py-report-level-p) (message "%s" erg))
 
2116
    (when (and (interactive-p) py-report-level-p) (message "%s" erg))
2117
2117
    erg))
2118
2118
 
2119
2119
(defun py-shift-class-left (&optional arg)
2137
2137
Returns outmost indentation reached. "
2138
2138
  (interactive "*P")
2139
2139
  (let ((erg (py-shift-forms-base "line" (or arg py-indent-offset))))
2140
 
        (when (and (interactive-p) py-report-level-p) (message "%s" erg))
 
2140
    (when (and (interactive-p) py-report-level-p) (message "%s" erg))
2141
2141
    erg))
2142
2142
 
2143
2143
(defun py-shift-line-left (&optional arg)
2161
2161
Returns outmost indentation reached. "
2162
2162
  (interactive "*P")
2163
2163
  (let ((erg (py-shift-forms-base "statement" (or arg py-indent-offset))))
2164
 
        (when (and (interactive-p) py-report-level-p) (message "%s" erg))
 
2164
    (when (and (interactive-p) py-report-level-p) (message "%s" erg))
2165
2165
    erg))
2166
2166
 
2167
2167
(defun py-shift-statement-left (&optional arg)
2399
2399
                  (py-beginning-of-statement))
2400
2400
                (line-beginning-position))
2401
2401
              (py-beginning-of-statement)
2402
 
                  (not (py-beginning-of-block-p))
 
2402
              (not (py-beginning-of-block-p))
2403
2403
              (eq (current-indentation) orig-indent))
2404
2404
        (setq beg (line-beginning-position)))
2405
2405
      (goto-char orig)
2752
2752
  (interactive "*")
2753
2753
  (let* ((orig (point))
2754
2754
         (funcname (progn
2755
 
                 (py-beginning-of-def)
2756
 
                 (when (looking-at (concat py-def-re " *\\([^(]+\\) *(\\(?:[^),]*\\),? *\\([^)]*\\))"))
2757
 
                   (match-string-no-properties 2))))
 
2755
                     (py-beginning-of-def)
 
2756
                     (when (looking-at (concat py-def-re " *\\([^(]+\\) *(\\(?:[^),]*\\),? *\\([^)]*\\))"))
 
2757
                       (match-string-no-properties 2))))
2758
2758
         (args (match-string-no-properties 3))
2759
2759
         (erg (py-which-python))
2760
2760
         classname)
2773
2773
  "Accepts the output of `parse-partial-sexp'. "
2774
2774
  (interactive)
2775
2775
  (let* ((pps (or (ignore-errors (nth 0 pps))
2776
 
                 (if (featurep 'xemacs)
2777
 
                     (parse-partial-sexp (point-min) (point))
2778
 
                   (syntax-ppss))))
2779
 
        (erg (nth 0 pps)))
 
2776
                  (if (featurep 'xemacs)
 
2777
                      (parse-partial-sexp (point-min) (point))
 
2778
                    (syntax-ppss))))
 
2779
         (erg (nth 0 pps)))
2780
2780
    (when (interactive-p) (message "%s" erg))
2781
2781
    erg))
2782
2782
 
2824
2824
                      (end-of-line)
2825
2825
                      (skip-chars-backward " \t\r\n\f")
2826
2826
                      (if (ignore-errors (< (nth 2 (if (featurep 'xemacs)
2827
 
                                        (parse-partial-sexp (point-min) (point))
2828
 
                                      (syntax-ppss))) (line-beginning-position)))
 
2827
                                                       (parse-partial-sexp (point-min) (point))
 
2828
                                                     (syntax-ppss))) (line-beginning-position)))
2829
2829
                          (current-indentation)
2830
 
                (ignore-errors (goto-char (nth 2 pps)))
2831
 
                (py-line-backward-maybe)
2832
 
                (back-to-indentation)
 
2830
                        (ignore-errors (goto-char (nth 2 pps)))
 
2831
                        (py-line-backward-maybe)
 
2832
                        (back-to-indentation)
2833
2833
                        (py-compute-indentation orig origline closing line inside repeat)))
2834
2834
                  (current-indentation)))
2835
2835
               ((and (looking-at "\"\"\"\\|'''")(not (bobp)))
2856
2856
               ;; lists
2857
2857
               ((nth 1 pps)
2858
2858
                (cond ((and inside (not line))
2859
 
                (when (and (eq (point) orig) (looking-at "[ \t]*\\()\\)[ \t]*$"))
2860
 
                  (setq closing (match-beginning 0)))
2861
 
                (save-excursion
2862
 
                  (goto-char (nth 1 pps))
2863
 
                  (setq this-line (py-count-lines))
2864
 
                  (cond
2865
 
                   ((< 0 (- origline this-line))
2866
 
                    (if (< 1 (- origline this-line))
2867
 
                        (if closing
2868
 
                            (if py-closing-list-dedents-bos
2869
 
                                (current-indentation)
2870
 
                              (+ (current-indentation) py-indent-offset))
2871
 
                          (py-fetch-previous-indent orig))
2872
 
                      (cond ((looking-at "\\s([ \t]*$")
2873
 
                             (if
2874
 
                                 (progn
2875
 
                                   (save-excursion
2876
 
                                     (back-to-indentation)
2877
 
                                     (looking-at py-block-or-clause-re)))
2878
 
                                 (progn
2879
 
                                   (back-to-indentation)
2880
 
                                   (+ (current-column) (* 2 py-indent-offset)))
2881
 
                               (back-to-indentation)
2882
 
                               (+ (current-column) py-indent-offset)))
2883
 
                            ((looking-at "\\s([ \t]*\\([^ \t]+.*\\)$")
2884
 
                             (goto-char (match-beginning 1))
2885
 
                             (current-column))
2886
 
                            (t (+ (current-column) (* (nth 0 pps)))))))
2887
 
                   (t (back-to-indentation)
2888
 
                      (py-beginning-of-statement)
2889
 
                      (py-compute-indentation orig origline closing line inside repeat)))))
 
2859
                       (when (and (eq (point) orig) (looking-at "[ \t]*\\()\\)[ \t]*$"))
 
2860
                         (setq closing (match-beginning 0)))
 
2861
                       (save-excursion
 
2862
                         (goto-char (nth 1 pps))
 
2863
                         (setq this-line (py-count-lines))
 
2864
                         (cond
 
2865
                          ((< 0 (- origline this-line))
 
2866
                           (if (< 1 (- origline this-line))
 
2867
                               (if closing
 
2868
                                   (if py-closing-list-dedents-bos
 
2869
                                       (current-indentation)
 
2870
                                     (+ (current-indentation) py-indent-offset))
 
2871
                                 (py-fetch-previous-indent orig))
 
2872
                             (cond ((looking-at "\\s([ \t]*$")
 
2873
                                    (if
 
2874
                                        (progn
 
2875
                                          (save-excursion
 
2876
                                            (back-to-indentation)
 
2877
                                            (looking-at py-block-or-clause-re)))
 
2878
                                        (progn
 
2879
                                          (back-to-indentation)
 
2880
                                          (+ (current-column) (* 2 py-indent-offset)))
 
2881
                                      (back-to-indentation)
 
2882
                                      (+ (current-column) py-indent-offset)))
 
2883
                                   ((looking-at "\\s([ \t]*\\([^ \t]+.*\\)$")
 
2884
                                    (goto-char (match-beginning 1))
 
2885
                                    (current-column))
 
2886
                                   (t (+ (current-column) (* (nth 0 pps)))))))
 
2887
                          (t (back-to-indentation)
 
2888
                             (py-beginning-of-statement)
 
2889
                             (py-compute-indentation orig origline closing line inside repeat)))))
2890
2890
                      ((and (not inside) line)
2891
 
                (py-beginning-of-statement)
2892
 
                (py-compute-indentation orig origline closing line inside repeat))
 
2891
                       (py-beginning-of-statement)
 
2892
                       (py-compute-indentation orig origline closing line inside repeat))
2893
2893
                      ((not inside)
2894
 
                (progn (goto-char (+ py-lhs-inbound-indent (nth 1 pps)))
2895
 
                       (when (looking-at "[ \t]+")
2896
 
                         (goto-char (match-end 0)))
2897
 
                       (current-column)))
 
2894
                       (progn (goto-char (+ py-lhs-inbound-indent (nth 1 pps)))
 
2895
                              (when (looking-at "[ \t]+")
 
2896
                                (goto-char (match-end 0)))
 
2897
                              (current-column)))
2898
2898
                      (t
2899
 
                (goto-char (nth 1 pps))
 
2899
                       (goto-char (nth 1 pps))
2900
2900
                       (py-compute-indentation orig origline closing line inside repeat))))
2901
2901
               ((py-preceding-line-backslashed-p)
2902
2902
                (progn
2955
2955
                      (progn
2956
2956
                        (py-line-backward-maybe)
2957
2957
                        (py-compute-indentation orig origline closing line inside repeat))
2958
 
                  (py-beginning-of-statement)
 
2958
                    (py-beginning-of-statement)
2959
2959
                    (py-compute-indentation orig origline closing line inside repeat))))
2960
2960
               ((py-statement-opens-block-p)
2961
2961
                (if (< (py-count-lines) origline)
3391
3391
  (save-restriction
3392
3392
    (widen)
3393
3393
    (let ((beg (cond (start)
3394
 
                           (t (point-min))))
3395
 
                (end (cond (end)
3396
 
                           (t (point))))
3397
 
                erg)
3398
 
    (if (featurep 'xemacs)
3399
 
        (setq erg (count-lines beg end))
3400
 
      (setq erg (1+ (count-matches "[\n\C-m]" beg end))))
3401
 
    (when (interactive-p) (message "%s" erg))
 
3394
                     (t (point-min))))
 
3395
          (end (cond (end)
 
3396
                     (t (point))))
 
3397
          erg)
 
3398
      (if (featurep 'xemacs)
 
3399
          (setq erg (count-lines beg end))
 
3400
        (setq erg (1+ (count-matches "[\n\C-m]" beg end))))
 
3401
      (when (interactive-p) (message "%s" erg))
3402
3402
      erg)))
3403
3403
 
3404
3404
(defun py-which-function ()
3497
3497
  (interactive "P")
3498
3498
 
3499
3499
  (let* ((regexp (if arg
3500
 
                    py-block-re
3501
 
                  py-block-or-clause-re))
3502
 
        (erg (ignore-errors (cdr (py-go-to-keyword regexp -1 indent)))))
 
3500
                     py-block-re
 
3501
                   py-block-or-clause-re))
 
3502
         (erg (ignore-errors (cdr (py-go-to-keyword regexp -1 indent)))))
3503
3503
    (when (interactive-p) (message "%s" erg))
3504
3504
    erg))
3505
3505
 
4012
4012
            (cond
4013
4013
             ((nth 3 pps)
4014
4014
              (goto-char (nth 8 pps))
4015
 
            (when (looking-at "\"\"\"\\|'''")
4016
 
              (goto-char (match-end 0))
 
4015
              (when (looking-at "\"\"\"\\|'''")
 
4016
                (goto-char (match-end 0))
4017
4017
                (while (and (re-search-forward (match-string-no-properties 0) nil (quote move) 1)
4018
4018
                            (setq done nil)
4019
4019
                            (nth 3
4020
4020
                                 (if (featurep 'xemacs)
4021
4021
                                     (parse-partial-sexp (point-min) (point))
4022
4022
                                   (syntax-ppss)))))
4023
 
            (setq done t)
4024
 
            (end-of-line)
4025
 
            (skip-chars-backward " \t\r\n\f" (line-beginning-position))
4026
 
            (setq erg (point))
 
4023
                (setq done t)
 
4024
                (end-of-line)
 
4025
                (skip-chars-backward " \t\r\n\f" (line-beginning-position))
 
4026
                (setq erg (point))
4027
4027
                (py-end-of-statement orig origline done)))
4028
 
           ;; in comment
4029
 
                  ((nth 4 pps)
4030
 
            (if (eobp)
4031
 
                nil
4032
 
              (forward-line 1)
4033
 
              (end-of-line)
4034
 
              (skip-chars-backward " \t\r\n\f" (line-beginning-position))
4035
 
              (setq erg (point))
4036
 
              (setq done t)
 
4028
             ;; in comment
 
4029
             ((nth 4 pps)
 
4030
              (if (eobp)
 
4031
                  nil
 
4032
                (forward-line 1)
 
4033
                (end-of-line)
 
4034
                (skip-chars-backward " \t\r\n\f" (line-beginning-position))
 
4035
                (setq erg (point))
 
4036
                (setq done t)
4037
4037
                (py-end-of-statement orig origline done)))))
4038
4038
           ((and (looking-at "[ \t]*#")(looking-back "^[ \t]*"))
4039
4039
            (while (and (looking-at "[ \t]*#") (forward-line 1)(not (eobp))
4063
4063
                (goto-char orig))))
4064
4064
           ((eq (point) orig)
4065
4065
            (cond ((not (looking-at "[ \t]*$"))
4066
 
            (end-of-line)
4067
 
            (py-beginning-of-comment)
4068
 
            (skip-chars-backward " \t")
4069
 
            (if (< orig (point))
4070
 
                (py-end-of-statement orig origline t)
4071
 
              (py-forward-line)
4072
 
              (py-end-of-statement orig origline done)))
 
4066
                   (end-of-line)
 
4067
                   (py-beginning-of-comment)
 
4068
                   (skip-chars-backward " \t")
 
4069
                   (if (< orig (point))
 
4070
                       (py-end-of-statement orig origline t)
 
4071
                     (py-forward-line)
 
4072
                     (py-end-of-statement orig origline done)))
4073
4073
                  ((and (looking-at "[ \t]*$")(not (eobp)))
4074
 
            (py-forward-line)
4075
 
            (setq done t)
4076
 
            (py-end-of-statement orig origline done))
 
4074
                   (py-forward-line)
 
4075
                   (setq done t)
 
4076
                   (py-end-of-statement orig origline done))
4077
4077
                  ((not (eobp))
4078
 
            (py-forward-line)
 
4078
                   (py-forward-line)
4079
4079
                   (py-end-of-statement orig origline done))))
4080
4080
           ((and (bolp) (not (empty-line-p)))
4081
4081
            (end-of-line)
4088
4088
            (skip-chars-forward "A-Za-z_0-9")
4089
4089
            (forward-char 1)
4090
4090
            (py-end-of-statement orig origline done)))
4091
 
      (unless (or (eq (point) orig)(empty-line-p)
4092
 
                  (if (featurep 'xemacs)
4093
 
                      (nth 4 (parse-partial-sexp (point-min) (point)))
4094
 
                    (nth 4 (syntax-ppss)))
4095
 
                  (eq 0 (current-column)))
4096
 
        (setq erg (point)))
4097
 
      (when (interactive-p) (message "%s" erg))
 
4091
          (unless (or (eq (point) orig)(empty-line-p)
 
4092
                      (if (featurep 'xemacs)
 
4093
                          (nth 4 (parse-partial-sexp (point-min) (point)))
 
4094
                        (nth 4 (syntax-ppss)))
 
4095
                      (eq 0 (current-column)))
 
4096
            (setq erg (point)))
 
4097
          (when (interactive-p) (message "%s" erg))
4098
4098
          ;; (message "%s" erg)
4099
4099
          erg)))))
4100
4100
 
4102
4102
  "Goto beginning of next statement. "
4103
4103
  (interactive)
4104
4104
  (let ((orig (point))
4105
 
                (erg (py-end-of-statement)))
 
4105
        (erg (py-end-of-statement)))
4106
4106
    (py-beginning-of-statement)
4107
4107
    (when (< (point) orig)
4108
4108
      (goto-char erg)
4168
4168
Returns beginning and end positions of marked area, a cons."
4169
4169
 
4170
4170
  (interactive "P")
4171
 
    (let ((py-mark-decorators (or arg py-mark-decorators)))
 
4171
  (let ((py-mark-decorators (or arg py-mark-decorators)))
4172
4172
    (py-mark-base "class" py-mark-decorators)
4173
4173
    (exchange-point-and-mark)))
4174
4174
 
4179
4179
Returns beginning and end positions of marked area, a cons."
4180
4180
 
4181
4181
  (interactive "P")
4182
 
    (let ((py-mark-decorators (or arg py-mark-decorators)))
 
4182
  (let ((py-mark-decorators (or arg py-mark-decorators)))
4183
4183
    (py-mark-base "def" py-mark-decorators)
4184
4184
    (exchange-point-and-mark)))
4185
4185
 
4204
4204
    erg))
4205
4205
 
4206
4206
(defun py-end-of-decorator ()
4207
 
    "Go to the end of a decorator.
 
4207
  "Go to the end of a decorator.
4208
4208
 
4209
4209
Returns position if succesful "
4210
4210
  (interactive)
4243
4243
    (when py-mark-decorators
4244
4244
      (save-excursion
4245
4245
        (when (setq erg (py-beginning-of-decorator))
4246
 
        (setq beg erg))))
 
4246
          (setq beg erg))))
4247
4247
    (setq end (funcall endform))
4248
4248
    (push-mark beg t t)
4249
4249
    (unless end (when (< beg (point))
4471
4471
  (save-restriction
4472
4472
    (widen)
4473
4473
    (let ((pps
4474
 
                   (if (featurep 'xemacs)
4475
 
                       (parse-partial-sexp (line-beginning-position) (point))
4476
 
                     (syntax-ppss))))
 
4474
           (if (featurep 'xemacs)
 
4475
               (parse-partial-sexp (line-beginning-position) (point))
 
4476
             (syntax-ppss))))
4477
4477
      (when (nth 4 pps)
4478
4478
        (goto-char
4479
4479
         (nth 8 pps))))))
4567
4567
                (not (eval stop)))
4568
4568
      (funcall function)
4569
4569
      (when (and (looking-at regexp)(if maxindent
4570
 
                                      (< (current-indentation) maxindent)t))
 
4570
                                        (< (current-indentation) maxindent)t))
4571
4571
        (setq erg (point))
4572
4572
        (setq done t)))
4573
4573
    (when erg (setq erg (cons (current-indentation) erg)))
4691
4691
        (forward-line 1)
4692
4692
        (beginning-of-line)
4693
4693
        (setq erg (point))))
4694
 
  (when (interactive-p) (message "%s" erg))
4695
 
  erg))
 
4694
    (when (interactive-p) (message "%s" erg))
 
4695
    erg))
4696
4696
 
4697
4697
(defun py-down-def-lc ()
4698
4698
  "Goto beginning of line following end of def.
4709
4709
        (forward-line 1)
4710
4710
        (beginning-of-line)
4711
4711
        (setq erg (point))))
4712
 
  (when (interactive-p) (message "%s" erg))
4713
 
  erg))
 
4712
    (when (interactive-p) (message "%s" erg))
 
4713
    erg))
4714
4714
 
4715
4715
(defun py-down-class-lc ()
4716
4716
  "Goto beginning of line following end of class.
4727
4727
        (forward-line 1)
4728
4728
        (beginning-of-line)
4729
4729
        (setq erg (point))))
4730
 
  (when (interactive-p) (message "%s" erg))
4731
 
  erg))
 
4730
    (when (interactive-p) (message "%s" erg))
 
4731
    erg))
4732
4732
 
4733
4733
(defun py-down-statement-lc ()
4734
4734
  "Goto beginning of line following end of statement.
4745
4745
        (forward-line 1)
4746
4746
        (beginning-of-line)
4747
4747
        (setq erg (point))))
4748
 
  (when (interactive-p) (message "%s" erg))
4749
 
  erg))
 
4748
    (when (interactive-p) (message "%s" erg))
 
4749
    erg))
4750
4750
 
4751
4751
(defun py-down-statement ()
4752
4752
  "Go to the beginning of next statement below in buffer.
4782
4782
                  (nth 8 (if (featurep 'xemacs)
4783
4783
                             (parse-partial-sexp ppstart (point))
4784
4784
                           (syntax-ppss)))))
4785
 
    (when (interactive-p) (message "%s" erg))
 
4785
      (when (interactive-p) (message "%s" erg))
4786
4786
      erg)))
4787
4787
 
4788
4788
(defun py-down-clause ()
4894
4894
              (setq erg (point))
4895
4895
            (setq erg nil)))
4896
4896
      (if (and (< orig (point)) (not (eobp)))
4897
 
        (setq erg (point))
 
4897
          (setq erg (point))
4898
4898
        (setq erg nil)))
4899
4899
    (when (and py-report-position-p (or iact (interactive-p))) (message "%s" erg))
4900
4900
    erg))
5031
5031
 
5032
5032
(defalias 'py-dedicated-shell 'py-shell-dedicated)
5033
5033
(defun py-shell-dedicated (&optional argprompt)
5034
 
   "Start an interactive Python interpreter in another window.
 
5034
  "Start an interactive Python interpreter in another window.
5035
5035
 
5036
5036
With optional \\[universal-argument] user is prompted by
5037
5037
`py-choose-shell' for command and options to pass to the Python
5053
5053
          (cond ((eq 4 (prefix-numeric-value argprompt))
5054
5054
                 (py-choose-shell '(4)))
5055
5055
                (py-use-local-default
5056
 
                            (if (not (string= "" py-shell-local-path))
5057
 
                                (expand-file-name py-shell-local-path)
 
5056
                 (if (not (string= "" py-shell-local-path))
 
5057
                     (expand-file-name py-shell-local-path)
5058
5058
                   (message "Abort: `py-use-local-default' is set to `t' but `py-shell-local-path' is empty. Maybe call `py-toggle-local-default-use'")))
5059
5059
                (pyshellname pyshellname)
5060
5060
                ((stringp py-shell-name) py-shell-name)
5251
5251
"
5252
5252
  (interactive "r\nP")
5253
5253
  (let ((py-shell-switch-buffers-on-execute t))
5254
 
  (py-execute-base start end async)))
 
5254
    (py-execute-base start end async)))
5255
5255
 
5256
5256
(defun py-execute-region (start end &optional async)
5257
5257
  "Send the region to a common shell calling a Python interpreter. "
5286
5286
(defun py-execute-intern (strg &optional procbuf proc temp file filebuf name py-execute-directory)
5287
5287
  (let (
5288
5288
        (pec (if (string-match "Python3" name)
5289
 
         (format "exec(compile(open('%s').read(), '%s', 'exec')) # PYTHON-MODE\n" file file)
5290
 
         (format "execfile(r'%s') # PYTHON-MODE\n" file)))
 
5289
                 (format "exec(compile(open('%s').read(), '%s', 'exec')) # PYTHON-MODE\n" file file)
 
5290
               (format "execfile(r'%s') # PYTHON-MODE\n" file)))
5291
5291
        shell)
5292
5292
    (set-buffer filebuf)
5293
5293
    (erase-buffer)
5430
5430
    (switch-to-buffer procbuf)
5431
5431
    (insert cmd)
5432
5432
    (comint-send-input)
5433
 
;;    (ipython-send-and-indent)
 
5433
    ;;    (ipython-send-and-indent)
5434
5434
    ;; (when (< 1 lines)
5435
 
;;      (goto-char (point-max))
 
5435
    ;;      (goto-char (point-max))
5436
5436
    ;; (comint-send-input))
5437
5437
    ))
5438
5438
 
5439
5439
(defun ipython-get-indenting-buffer ()
5440
 
 "Return a temporary buffer set in python-mode. Create one if necessary."
5441
 
 (let ((buf (get-buffer-create ipython-indenting-buffer-name)))
5442
 
   (set-buffer buf)
5443
 
   (unless (eq major-mode 'python-mode)
5444
 
     (python-mode))
5445
 
   buf))
 
5440
  "Return a temporary buffer set in python-mode. Create one if necessary."
 
5441
  (let ((buf (get-buffer-create ipython-indenting-buffer-name)))
 
5442
    (set-buffer buf)
 
5443
    (unless (eq major-mode 'python-mode)
 
5444
      (python-mode))
 
5445
    buf))
5446
5446
 
5447
5447
(defvar ipython-autoindent t
5448
 
 "If non-nil, enable autoindent for IPython shell through python-mode.")
 
5448
  "If non-nil, enable autoindent for IPython shell through python-mode.")
5449
5449
 
5450
5450
(defun ipython-send-and-indent ()
5451
 
 "Send the current line to IPython, and calculate the indentation for
 
5451
  "Send the current line to IPython, and calculate the indentation for
5452
5452
the next line."
5453
 
 (interactive)
5454
 
 (if ipython-autoindent
5455
 
     (let ((line (buffer-substring (point-at-bol) (point)))
5456
 
           (after-prompt1)
5457
 
           (after-prompt2))
5458
 
       (save-excursion
5459
 
           (comint-bol t)
5460
 
           (if (looking-at py-shell-input-prompt-1-regexp)
5461
 
               (setq after-prompt1 t)
5462
 
             (setq after-prompt2 (looking-at py-shell-input-prompt-2-regexp)))
5463
 
           (with-current-buffer (ipython-get-indenting-buffer)
5464
 
             (when after-prompt1
5465
 
               (erase-buffer))
5466
 
             (when (or after-prompt1 after-prompt2)
5467
 
               (delete-region (point-at-bol) (point))
5468
 
               (insert line)
5469
 
               (newline-and-indent))))))
5470
 
 ;; send input line to ipython interpreter
5471
 
 (comint-send-input))
 
5453
  (interactive)
 
5454
  (if ipython-autoindent
 
5455
      (let ((line (buffer-substring (point-at-bol) (point)))
 
5456
            (after-prompt1)
 
5457
            (after-prompt2))
 
5458
        (save-excursion
 
5459
          (comint-bol t)
 
5460
          (if (looking-at py-shell-input-prompt-1-regexp)
 
5461
              (setq after-prompt1 t)
 
5462
            (setq after-prompt2 (looking-at py-shell-input-prompt-2-regexp)))
 
5463
          (with-current-buffer (ipython-get-indenting-buffer)
 
5464
            (when after-prompt1
 
5465
              (erase-buffer))
 
5466
            (when (or after-prompt1 after-prompt2)
 
5467
              (delete-region (point-at-bol) (point))
 
5468
              (insert line)
 
5469
              (newline-and-indent))))))
 
5470
  ;; send input line to ipython interpreter
 
5471
  (comint-send-input))
5472
5472
 
5473
5473
(defun py-execute-region-in-shell (start end &optional async)
5474
5474
  "Execute the region in a Python shell. "
5525
5525
        (pop-to-buffer temp)
5526
5526
        (py-postprocess-output-buffer temp)
5527
5527
        ;; TBD: clean up the temporary file!
5528
 
))
 
5528
        ))
5529
5529
     ;; if the Python interpreter shell is running, queue it up for
5530
5530
     ;; execution there.
5531
5531
     (proc
5595
5595
  ;; (switch-to-buffer (current-buffer))
5596
5596
  (goto-char (point-min))
5597
5597
  (unless (re-search-forward py-encoding-string-re nil t)
5598
 
  (goto-char (point-min))
 
5598
    (goto-char (point-min))
5599
5599
    (if (re-search-forward py-shebang-regexp nil t 1)
5600
5600
        (progn
5601
5601
          (newline)
5677
5677
          (let ((proc (if dedicated
5678
5678
                          (get-process (py-shell nil dedicated))
5679
5679
                        (get-process (py-shell)))))
5680
 
          ;; Maybe save some buffers
5681
 
          (save-some-buffers (not py-ask-about-save) nil)
 
5680
            ;; Maybe save some buffers
 
5681
            (save-some-buffers (not py-ask-about-save) nil)
5682
5682
            (py-execute-file proc file
5683
 
           (if (string-match "\\.py$" file)
5684
 
               (let ((m (py-qualified-module-name (expand-file-name file))))
5685
 
                 (format "import sys\nif sys.modules.has_key('%s'):\n reload(%s)\nelse:\n import %s\n"
5686
 
                         m m m))
5687
 
             ;; (format "execfile(r'%s')\n" file)
 
5683
                             (if (string-match "\\.py$" file)
 
5684
                                 (let ((m (py-qualified-module-name (expand-file-name file))))
 
5685
                                   (format "import sys\nif sys.modules.has_key('%s'):\n reload(%s)\nelse:\n import %s\n"
 
5686
                                           m m m))
 
5687
                               ;; (format "execfile(r'%s')\n" file)
5688
5688
                               (py-which-execute-file-command file)))))
5689
5689
      ;; else
5690
5690
      (py-execute-buffer async))))
5699
5699
                   (if (file-exists-p initpy)
5700
5700
                       (let ((d2 (directory-file-name d)))
5701
5701
                         (funcall rec (file-name-directory d2)
5702
 
                                (concat (file-name-nondirectory d2) "." f)))
 
5702
                                  (concat (file-name-nondirectory d2) "." f)))
5703
5703
                     f)))))
5704
5704
    (funcall rec (file-name-directory file)
5705
5705
             (file-name-sans-extension (file-name-nondirectory file)))))
5910
5910
  "Send the current defun (class or method) to the inferior Python process."
5911
5911
  (interactive)
5912
5912
  (save-excursion (py-execute-region (progn (beginning-of-defun) (point))
5913
 
                                      (progn (end-of-defun) (point)))))
 
5913
                                     (progn (end-of-defun) (point)))))
5914
5914
 
5915
5915
(defun py-process-file (filename &optional output-buffer error-buffer)
5916
5916
  "Process \"python filename\".
5939
5939
    (with-temp-buffer
5940
5940
      (insert imports)
5941
5941
      (insert strg)
5942
 
;;      (py-if-needed-insert-if)
 
5942
      ;;      (py-if-needed-insert-if)
5943
5943
      (setq shell (py-choose-shell))
5944
5944
      (py-insert-coding)
5945
5945
      (py-if-needed-insert-shell shell)
6147
6147
    (pop-to-buffer buffer)
6148
6148
    ;; Force Python mode
6149
6149
    (unless(eq major-mode 'python-mode)
6150
 
        (python-mode))
 
6150
      (python-mode))
6151
6151
    (goto-char (point-min))
6152
6152
    (forward-line (1- line))
6153
6153
    (message "Jumping to exception in file %s on line %d" file line)))
6213
6213
                            pos (point)
6214
6214
                            line (string-to-number (match-string-no-properties 3))))
6215
6215
                  (save-excursion
6216
 
                  ;; file and line-number are in different lines
6217
 
                  (setq line (string-to-number (match-string-no-properties 1))
6218
 
                        pos (point)
6219
 
                        file (progn
6220
 
                               (when (and (re-search-backward "\\(^IPython\\|^In \\[[0-9]+\\]: *\\|^>>>\\|^[^\t >]+\\)>?[ \t]+in[ \t]+\\([^ \t\n]+\\)" nil t 1)
6221
 
                                          (not (save-match-data (string-match "<\\|^IPython\\|^In \\[[0-9]+\\]: *\\|^>>>" (match-string-no-properties 1)))))
 
6216
                    ;; file and line-number are in different lines
 
6217
                    (setq line (string-to-number (match-string-no-properties 1))
 
6218
                          pos (point)
 
6219
                          file (progn
 
6220
                                 (when (and (re-search-backward "\\(^IPython\\|^In \\[[0-9]+\\]: *\\|^>>>\\|^[^\t >]+\\)>?[ \t]+in[ \t]+\\([^ \t\n]+\\)" nil t 1)
 
6221
                                            (not (save-match-data (string-match "<\\|^IPython\\|^In \\[[0-9]+\\]: *\\|^>>>" (match-string-no-properties 1)))))
6222
6222
                                   (match-string-no-properties 1))))))
6223
6223
                (if file
6224
 
                (when (string-match ".+\.pyc" file)
6225
 
                  (setq file (substring file 0 -1)))
 
6224
                    (when (string-match ".+\.pyc" file)
 
6225
                      (setq file (substring file 0 -1)))
6226
6226
                  (error "%s of traceback" errwhere))
6227
6227
                (if (and file line)
6228
6228
                    (if
6329
6329
            (setq target_buffer (cadr target))
6330
6330
            (setq target_fname (buffer-file-name target_buffer))
6331
6331
            (switch-to-buffer-other-window target_buffer)
6332
 
;;            (goto-line target_lineno)
 
6332
            ;;            (goto-line target_lineno)
6333
6333
            (goto-char (point-min))
6334
6334
            (forward-line target_lineno)
6335
6335
            (message "pdbtrack: line %s, file %s" target_lineno target_fname)
6352
6352
 
6353
6353
  (if (and (not (string-match py-pdbtrack-stack-entry-regexp block))
6354
6354
           ;; (not (string-match py-pydbtrack-stack-entry-regexp block))
6355
 
)
 
6355
           )
6356
6356
      "Traceback cue not found"
6357
6357
    (let* ((filename (match-string
6358
6358
                      py-pdbtrack-marker-regexp-file-group block))
6359
6359
           (lineno (string-to-number (match-string
6360
 
                                   py-pdbtrack-marker-regexp-line-group
6361
 
                                   block)))
 
6360
                                      py-pdbtrack-marker-regexp-line-group
 
6361
                                      block)))
6362
6362
           (funcname (match-string py-pdbtrack-marker-regexp-funcname-group
6363
6363
                                   block))
6364
6364
           funcbuffer)
6463
6463
(defun py-find-imports ()
6464
6464
  (let* (imports
6465
6465
         (erg
6466
 
    (save-excursion
6467
 
      (goto-char (point-min))
6468
 
      (while (re-search-forward
6469
 
              "^import *[A-Za-z_][A-Za-z_0-9].*\\|^from +[A-Za-z_][A-Za-z_0-9]+ +import .*" nil t)
6470
 
        (setq imports
6471
 
              (concat
6472
 
               imports
6473
 
                    (buffer-substring-no-properties (match-beginning 0) (match-end 0)) "\n"))))))
 
6466
          (save-excursion
 
6467
            (goto-char (point-min))
 
6468
            (while (re-search-forward
 
6469
                    "^import *[A-Za-z_][A-Za-z_0-9].*\\|^from +[A-Za-z_][A-Za-z_0-9]+ +import .*" nil t)
 
6470
              (setq imports
 
6471
                    (concat
 
6472
                     imports
 
6473
                     (buffer-substring-no-properties (match-beginning 0) (match-end 0)) "\n"))))))
6474
6474
    (when (interactive-p) (message "%s" erg))
6475
6475
    erg))
6476
6476
 
6482
6482
  "Find top-level imports, updating `python-imports'."
6483
6483
  (interactive)
6484
6484
  (save-excursion
6485
 
      (let (lines)
6486
 
        (goto-char (point-min))
6487
 
        (while (re-search-forward "^import\\>\\|^from\\>" nil t)
6488
 
          (unless (syntax-ppss-context (syntax-ppss))
6489
 
            (let ((start (line-beginning-position)))
6490
 
              ;; Skip over continued lines.
6491
 
              (while (and (eq ?\\ (char-before (line-end-position)))
6492
 
                          (= 0 (forward-line 1)))
6493
 
                t)
6494
 
              (push (buffer-substring start (line-beginning-position 2))
6495
 
                    lines))))
6496
 
        (setq python-imports
6497
 
              (if lines
6498
 
                  (apply #'concat
6499
 
                         (nreverse lines))
6500
 
                "None"))
6501
 
        (when lines
6502
 
          (set-text-properties 0 (length python-imports) nil python-imports)
6503
 
          ;; The output ends up in the wrong place if the string we
6504
 
          ;; send contains newlines (from the imports).
6505
 
          (setq python-imports
6506
 
                (replace-regexp-in-string "\n" "\\n"
6507
 
                                          (format "%S" python-imports) t t)))))
 
6485
    (let (lines)
 
6486
      (goto-char (point-min))
 
6487
      (while (re-search-forward "^import\\>\\|^from\\>" nil t)
 
6488
        (unless (syntax-ppss-context (syntax-ppss))
 
6489
          (let ((start (line-beginning-position)))
 
6490
            ;; Skip over continued lines.
 
6491
            (while (and (eq ?\\ (char-before (line-end-position)))
 
6492
                        (= 0 (forward-line 1)))
 
6493
              t)
 
6494
            (push (buffer-substring start (line-beginning-position 2))
 
6495
                  lines))))
 
6496
      (setq python-imports
 
6497
            (if lines
 
6498
                (apply #'concat
 
6499
                       (nreverse lines))
 
6500
              "None"))
 
6501
      (when lines
 
6502
        (set-text-properties 0 (length python-imports) nil python-imports)
 
6503
        ;; The output ends up in the wrong place if the string we
 
6504
        ;; send contains newlines (from the imports).
 
6505
        (setq python-imports
 
6506
              (replace-regexp-in-string "\n" "\\n"
 
6507
                                        (format "%S" python-imports) t t)))))
6508
6508
  (when (interactive-p) (message "%s" (car (read-from-string python-imports))))
6509
6509
  python-imports)
6510
6510
 
6855
6855
    (with-current-buffer (process-buffer proc)
6856
6856
      (when (python-check-comint-prompt proc)
6857
6857
        (set (make-local-variable 'python-preoutput-result) nil)
6858
 
                    (accept-process-output proc py-send-receive-delay)
 
6858
        (accept-process-output proc py-send-receive-delay)
6859
6859
        (if (null python-preoutput-result)
6860
 
          (message "No output from: %s, maybe set `py-send-receive-delay' onto a higher value " string))
 
6860
            (message "No output from: %s, maybe set `py-send-receive-delay' onto a higher value " string))
6861
6861
        (prog1 python-preoutput-result
6862
6862
          (kill-local-variable 'python-preoutput-result))))))
6863
6863
 
6876
6876
  (unless python-imports
6877
6877
    (error "Not called from buffer visiting Python file"))
6878
6878
  (let* ((loc (py-send-receive (format "emacs.location_of (%S, %s)"
6879
 
                                           name python-imports)))
 
6879
                                       name python-imports)))
6880
6880
         (loc (car (read-from-string loc)))
6881
6881
         (file (car loc))
6882
6882
         (line (cdr loc)))
7463
7463
(setq py-shell-map
7464
7464
      (let ((map (copy-keymap comint-mode-map)))
7465
7465
        (substitute-key-definition 'complete-symbol 'completion-at-point
7466
 
                                     map global-map)
 
7466
                                   map global-map)
7467
7467
        (define-key map [tab] 'py-shell-complete)
7468
7468
        (define-key map (kbd "RET") 'comint-send-input)
7469
7469
        (define-key map "\C-c-" 'py-up-exception)
7478
7478
  ;; look for an interpreter specified in the first line
7479
7479
  ;; similar to set-auto-mode (files.el)
7480
7480
  (let* (erg
7481
 
        (interpreter (save-excursion
7482
 
                       (goto-char (point-min))
7483
 
                       (when (looking-at py-shebang-regexp)
7484
 
                         (setq erg (match-string-no-properties 0))
7485
 
                         (substring erg (string-match "[ijp]+ython" erg))))))
 
7481
         (interpreter (save-excursion
 
7482
                        (goto-char (point-min))
 
7483
                        (when (looking-at py-shebang-regexp)
 
7484
                          (setq erg (match-string-no-properties 0))
 
7485
                          (substring erg (string-match "[ijp]+ython" erg))))))
7486
7486
    (when (interactive-p) (message "%s" interpreter))
7487
7487
    interpreter))
7488
7488
 
7610
7610
                            (if path (concat path path-separator))
7611
7611
                            (expand-file-name py-install-directory) "/Pymacs")))
7612
7612
 
7613
 
  (if (or (not (boundp 'py-install-directory)) (not (stringp py-install-directory)))
7614
 
      (error "`py-install-directory' not set, see INSTALL")
 
7613
    (if (or (not (boundp 'py-install-directory)) (not (stringp py-install-directory)))
 
7614
        (error "`py-install-directory' not set, see INSTALL")
7615
7615
      (load (concat py-install-directory "/pymacs.el") nil t)
7616
7616
      (setenv "PYMACS_PYTHON" (if (string-match "IP" pyshell)
7617
7617
                                  "python"
7618
7618
                                pyshell))
7619
 
    (autoload 'pymacs-apply "pymacs")
7620
 
    (autoload 'pymacs-call "pymacs")
7621
 
    (autoload 'pymacs-eval "pymacs")
7622
 
    (autoload 'pymacs-exec "pymacs")
7623
 
    (autoload 'pymacs-load "pymacs")
 
7619
      (autoload 'pymacs-apply "pymacs")
 
7620
      (autoload 'pymacs-call "pymacs")
 
7621
      (autoload 'pymacs-eval "pymacs")
 
7622
      (autoload 'pymacs-exec "pymacs")
 
7623
      (autoload 'pymacs-load "pymacs")
7624
7624
      (require 'pymacs))
7625
7625
    (unwind-protect
7626
7626
        (progn
7648
7648
         (add-to-list 'load-path (concat (expand-file-name py-install-directory) "/test"))
7649
7649
         (add-to-list 'load-path (concat (expand-file-name py-install-directory) "/tools")))
7650
7650
        ((when py-guess-py-install-directory-p
7651
 
         (py-guess-py-install-directory)))
 
7651
           (py-guess-py-install-directory)))
7652
7652
        (t (error "Please set `py-install-directory', see INSTALL"))
7653
7653
        (when (interactive-p) (message "%s" load-path))))
7654
7654
 
7781
7781
  (when py-load-pymacs-p (py-load-pymacs)
7782
7782
        (unwind-protect
7783
7783
            (progn
7784
 
        (find-file (concat py-install-directory "/completion/pycomplete.el"))
 
7784
              (find-file (concat py-install-directory "/completion/pycomplete.el"))
7785
7785
              (eval-buffer)))
7786
7786
        (kill-buffer "pycomplete.el"))
7787
7787
  (add-hook 'python-mode-hook
7828
7828
  (when (interactive-p) (message "python-mode loaded from: %s" "python-mode.el")))
7829
7829
 
7830
7830
(defadvice pdb (before gud-query-cmdline activate)
7831
 
   "Provide a better default command line when called interactively."
7832
 
   (interactive
7833
 
    (list (gud-query-cmdline pdb-path
7834
 
        (file-name-nondirectory buffer-file-name)))))
 
7831
  "Provide a better default command line when called interactively."
 
7832
  (interactive
 
7833
   (list (gud-query-cmdline pdb-path
 
7834
                            (file-name-nondirectory buffer-file-name)))))
7835
7835
 
7836
7836
(defalias 'py-hungry-delete-forward 'c-hungry-delete-forward)
7837
7837
(defalias 'py-hungry-delete-backwards 'c-hungry-delete-backwards)
7971
7971
Returns `py-use-local-default'
7972
7972
 
7973
7973
See also `py-install-local-shells'
7974
 
Installing named virualenv shells is the preffered way, 
 
7974
Installing named virualenv shells is the preffered way,
7975
7975
as it leaves your system default unchanged."
7976
7976
  (setq py-use-local-default (not py-use-local-default))
7977
7977
  (when (interactive-p) (message "py-use-local-default set to %s" py-use-local-default))
8021
8021
Eval resulting buffer to install it, see customizable `py-extensions'. "
8022
8022
  (interactive)
8023
8023
  (let* ((local-dir (if local
8024
 
                             (expand-file-name local)
8025
 
                           (read-from-minibuffer "Virtualenv directory: " default-directory)))
 
8024
                        (expand-file-name local)
 
8025
                      (read-from-minibuffer "Virtualenv directory: " default-directory)))
8026
8026
         (path-separator (if (string-match "/" local-dir)
8027
8027
                             "/"
8028
8028
                           "\\" t))
8785
8785
                                                  (buffer-substring
8786
8786
                                                   (point-min) (point-max)))
8787
8787
                                    )))))))
8788
 
               (list lineno funcbuffer))
 
8788
             (list lineno funcbuffer))
8789
8789
 
8790
8790
            ((= (elt filename 0) ?\<)
8791
8791
             (format "(Non-file source: '%s')" filename))
8822
8822
`kill-output-from-shell' does The Right Thing."
8823
8823
  (let ((curbuf (current-buffer))
8824
8824
        (procbuf (process-buffer proc))
8825
 
;       (comint-scroll-to-bottom-on-output t)
 
8825
                                        ;       (comint-scroll-to-bottom-on-output t)
8826
8826
        (msg (format "## working on region in file %s...\n" filename))
8827
8827
        ;; add some comment, so that we can filter it out of history
8828
8828
        (cmd (format "execfile(r'%s') # PYTHON-MODE\n" filename)))
8962
8962
          (get-process (py-process-name)))
8963
8963
         (cmd (format "exec '''%s''' in {}"
8964
8964
                      (mapconcat 'identity (split-string string "\n") "\\n")))
8965
 
        (procbuf (process-buffer proc))
8966
 
        (outbuf (get-buffer-create " *pyshellcomplete-output*"))
8967
 
        (lines (reverse py-shell-input-lines)))
 
8965
         (procbuf (process-buffer proc))
 
8966
         (outbuf (get-buffer-create " *pyshellcomplete-output*"))
 
8967
         (lines (reverse py-shell-input-lines)))
8968
8968
    (if (and proc (not py-file-queue))
8969
8969
        (unwind-protect
8970
8970
            (condition-case nil
8990
8990
                      (while (not comint-redirect-completed) ; wait for output
8991
8991
                        (accept-process-output proc 1)))
8992
8992
                    (signal 'quit nil)))
8993
 
            (if (with-current-buffer procbuf comint-redirect-completed)
8994
 
                (while lines
8995
 
                  (with-current-buffer procbuf
8996
 
                    (py-shell-redirect-send-command-to-process
8997
 
                     (car lines) outbuf proc nil t))
8998
 
                  (accept-process-output proc 1)
8999
 
                  (setq lines (cdr lines))))))))
 
8993
          (if (with-current-buffer procbuf comint-redirect-completed)
 
8994
              (while lines
 
8995
                (with-current-buffer procbuf
 
8996
                  (py-shell-redirect-send-command-to-process
 
8997
                   (car lines) outbuf proc nil t))
 
8998
                (accept-process-output proc 1)
 
8999
                (setq lines (cdr lines))))))))
9000
9000
 
9001
9001
(defun py-dot-word-before-point ()
9002
9002
  (buffer-substring
9103
9103
    ;; (setq python-process (get-process (ipython-dedicated))))
9104
9104
    (if (string= pattern "")
9105
9105
        (tab-to-tab-stop)
9106
 
    (process-send-string python-process
9107
 
                         (format completion-command-string pattern))
9108
 
    (accept-process-output python-process)
9109
 
    (setq completions
9110
 
          (split-string (substring ugly-return 0 (position ?\n ugly-return)) sep))
9111
 
    (setq completion-table (loop for str in completions
9112
 
                                 collect (list str nil)))
9113
 
    (setq completion (try-completion pattern completion-table))
9114
 
    (cond ((eq completion t))
9115
 
          ((null completion)
9116
 
           (message "Can't find completion for \"%s\"" pattern)
9117
 
           (ding))
9118
 
          ((not (string= pattern completion))
9119
 
           (delete-region beg end)
9120
 
           (insert completion))
9121
 
          (t
9122
 
           (message "Making completion list...")
9123
 
           (with-output-to-temp-buffer "*Python Completions*"
9124
 
             (display-completion-list (all-completions pattern completion-table)))
 
9106
      (process-send-string python-process
 
9107
                           (format completion-command-string pattern))
 
9108
      (accept-process-output python-process)
 
9109
      (setq completions
 
9110
            (split-string (substring ugly-return 0 (position ?\n ugly-return)) sep))
 
9111
      (setq completion-table (loop for str in completions
 
9112
                                   collect (list str nil)))
 
9113
      (setq completion (try-completion pattern completion-table))
 
9114
      (cond ((eq completion t))
 
9115
            ((null completion)
 
9116
             (message "Can't find completion for \"%s\"" pattern)
 
9117
             (ding))
 
9118
            ((not (string= pattern completion))
 
9119
             (delete-region beg end)
 
9120
             (insert completion))
 
9121
            (t
 
9122
             (message "Making completion list...")
 
9123
             (with-output-to-temp-buffer "*Python Completions*"
 
9124
               (display-completion-list (all-completions pattern completion-table)))
9125
9125
             (message "Making completion list...%s" "done"))))))
9126
9126
 
9127
9127
;;; Pychecker
9130
9130
  (interactive
9131
9131
   (let ((default
9132
9132
           (if (buffer-file-name)
9133
 
           (format "%s %s %s" py-pychecker-command
9134
 
                   (mapconcat 'identity py-pychecker-command-args " ")
 
9133
               (format "%s %s %s" py-pychecker-command
 
9134
                       (mapconcat 'identity py-pychecker-command-args " ")
9135
9135
                       (buffer-file-name))
9136
9136
             (format "%s %s" py-pychecker-command
9137
9137
                     (mapconcat 'identity py-pychecker-command-args " "))))