comparison lisp/progmodes/python.el @ 58415:86ead4686506

(run-python): Don't hard code *Python*. Don't modify process-environment. (python-send-region, python-load-file): Don't assume that python-buffer == (process-buffer (python-proc)). (python-switch-to-python): Simplify.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Mon, 22 Nov 2004 05:52:39 +0000
parents 6ec84037b6bc
children d0581f1eef46
comparison
equal deleted inserted replaced
58414:1f06a555fba2 58415:86ead4686506
1 ;;; python.el --- silly walks for Python 1 ;;; python.el --- silly walks for Python
2 2
3 ;; Copyright (C) 2003, 04 Free Software Foundation, Inc. 3 ;; Copyright (C) 2003, 2004 Free Software Foundation, Inc.
4 4
5 ;; Author: Dave Love <fx@gnu.org> 5 ;; Author: Dave Love <fx@gnu.org>
6 ;; Maintainer: FSF 6 ;; Maintainer: FSF
7 ;; Created: Nov 2003 7 ;; Created: Nov 2003
8 ;; Keywords: languages 8 ;; Keywords: languages
1125 "Run an inferior Python process, input and output via buffer *Python*. 1125 "Run an inferior Python process, input and output via buffer *Python*.
1126 CMD is the Python command to run. NOSHOW non-nil means don't show the 1126 CMD is the Python command to run. NOSHOW non-nil means don't show the
1127 buffer automatically. 1127 buffer automatically.
1128 If there is a process already running in `*Python*', switch to 1128 If there is a process already running in `*Python*', switch to
1129 that buffer. Interactively, a prefix arg allows you to edit the initial 1129 that buffer. Interactively, a prefix arg allows you to edit the initial
1130 command line (default is `python-command'); `-i' etc. args will be added 1130 command line (default is `python-command'); `-i' etc. args will be added
1131 to this as appropriate. Runs the hook `inferior-python-mode-hook' 1131 to this as appropriate. Runs the hook `inferior-python-mode-hook'
1132 \(after the `comint-mode-hook' is run). 1132 \(after the `comint-mode-hook' is run).
1133 \(Type \\[describe-mode] in the process buffer for a list of commands.)" 1133 \(Type \\[describe-mode] in the process buffer for a list of commands.)"
1134 (interactive (list (if current-prefix-arg 1134 (interactive (list (if current-prefix-arg
1135 (read-string "Run Python: " python-command) 1135 (read-string "Run Python: " python-command)
1141 ;; invoked. Would support multiple processes better. 1141 ;; invoked. Would support multiple processes better.
1142 (unless (comint-check-proc python-buffer) 1142 (unless (comint-check-proc python-buffer)
1143 (let* ((cmdlist (append (python-args-to-list cmd) '("-i"))) 1143 (let* ((cmdlist (append (python-args-to-list cmd) '("-i")))
1144 (path (getenv "PYTHONPATH")) 1144 (path (getenv "PYTHONPATH"))
1145 (process-environment ; to import emacs.py 1145 (process-environment ; to import emacs.py
1146 (push (concat "PYTHONPATH=" data-directory 1146 (cons (concat "PYTHONPATH=" data-directory
1147 (if path (concat ":" path))) 1147 (if path (concat ":" path)))
1148 process-environment))) 1148 process-environment)))
1149 (set-buffer (apply 'make-comint "Python" (car cmdlist) nil 1149 (set-buffer (apply 'make-comint "Python" (car cmdlist) nil
1150 (cdr cmdlist))) 1150 (cdr cmdlist)))
1151 (setq python-buffer "*Python*")) 1151 (setq python-buffer (buffer-name)))
1152 (inferior-python-mode) 1152 (inferior-python-mode)
1153 ;; Load function defintions we need. 1153 ;; Load function defintions we need.
1154 ;; Before the preoutput function was used, this was done via -c in 1154 ;; Before the preoutput function was used, this was done via -c in
1155 ;; cmdlist, but that loses the banner and doesn't run the startup 1155 ;; cmdlist, but that loses the banner and doesn't run the startup
1156 ;; file. The code might be inline here, but there's enough that it 1156 ;; file. The code might be inline here, but there's enough that it
1202 (goto-char orig-start) 1202 (goto-char orig-start)
1203 ;; Wrong if we had indented code at buffer start. 1203 ;; Wrong if we had indented code at buffer start.
1204 (set-marker orig-start (line-beginning-position 0))) 1204 (set-marker orig-start (line-beginning-position 0)))
1205 (write-region "if True:\n" nil f nil 'nomsg)) 1205 (write-region "if True:\n" nil f nil 'nomsg))
1206 (write-region start end f t 'nomsg) 1206 (write-region start end f t 'nomsg)
1207 (let ((proc (python-proc))) ;Make sure we're running a process. 1207 (with-current-buffer (process-buffer (python-proc)) ;Runs python if needed.
1208 (with-current-buffer python-buffer 1208 (python-send-command command)
1209 (python-send-command command) 1209 ;; Tell compile.el to redirect error locations in file `f' to
1210 ;; Tell compile.el to redirect error locations in file `f' to 1210 ;; positions past marker `orig-start'. It has to be done *after*
1211 ;; positions past marker `orig-start'. It has to be done *after* 1211 ;; python-send-command's call to compilation-forget-errors.
1212 ;; python-send-command's call to compilation-forget-errors. 1212 (compilation-fake-loc orig-start f))))
1213 (compilation-fake-loc orig-start f)))))
1214 1213
1215 (defun python-send-string (string) 1214 (defun python-send-string (string)
1216 "Evaluate STRING in inferior Python process." 1215 "Evaluate STRING in inferior Python process."
1217 (interactive "sPython command: ") 1216 (interactive "sPython command: ")
1218 (comint-send-string (python-proc) string) 1217 (comint-send-string (python-proc) string)
1233 1232
1234 (defun python-switch-to-python (eob-p) 1233 (defun python-switch-to-python (eob-p)
1235 "Switch to the Python process buffer. 1234 "Switch to the Python process buffer.
1236 With prefix arg, position cursor at end of buffer." 1235 With prefix arg, position cursor at end of buffer."
1237 (interactive "P") 1236 (interactive "P")
1238 ;; Start python unless we have a buffer. 1237 (pop-to-buffer (process-buffer (python-proc))) ;Runs python if needed.
1239 (unless (and python-buffer
1240 (get-buffer python-buffer))
1241 (run-python nil t))
1242 (pop-to-buffer python-buffer)
1243 ;; Make extra sure python is running in this buffer.
1244 (python-proc)
1245 (when eob-p 1238 (when eob-p
1246 (push-mark) 1239 (push-mark)
1247 (goto-char (point-max)))) 1240 (goto-char (point-max))))
1248 1241
1249 (defun python-send-region-and-go (start end) 1242 (defun python-send-region-and-go (start end)
1275 python-source-modes 1268 python-source-modes
1276 t)) ; because execfile needs exact name 1269 t)) ; because execfile needs exact name
1277 (comint-check-source file-name) ; Check to see if buffer needs saving. 1270 (comint-check-source file-name) ; Check to see if buffer needs saving.
1278 (setq python-prev-dir/file (cons (file-name-directory file-name) 1271 (setq python-prev-dir/file (cons (file-name-directory file-name)
1279 (file-name-nondirectory file-name))) 1272 (file-name-nondirectory file-name)))
1280 (let ((proc (python-proc))) ;Make sure we have a process. 1273 (with-current-buffer (process-buffer (python-proc)) ;Runs python if needed.
1281 (with-current-buffer python-buffer 1274 ;; Fixme: I'm not convinced by this logic from python-mode.el.
1282 ;; Fixme: I'm not convinced by this logic from python-mode.el. 1275 (python-send-command
1283 (python-send-command 1276 (if (string-match "\\.py\\'" file-name)
1284 (if (string-match "\\.py\\'" file-name) 1277 (let ((module (file-name-sans-extension
1285 (let ((module (file-name-sans-extension 1278 (file-name-nondirectory file-name))))
1286 (file-name-nondirectory file-name)))) 1279 (format "emacs.eimport(%S,%S)"
1287 (format "emacs.eimport(%S,%S)" 1280 module (file-name-directory file-name)))
1288 module (file-name-directory file-name))) 1281 (format "execfile(%S)" file-name)))
1289 (format "execfile(%S)" file-name))) 1282 (message "%s loaded" file-name)))
1290 (message "%s loaded" file-name))))
1291 1283
1292 ;; Fixme: If we need to start the process, wait until we've got the OK 1284 ;; Fixme: If we need to start the process, wait until we've got the OK
1293 ;; from the startup. 1285 ;; from the startup.
1294 (defun python-proc () 1286 (defun python-proc ()
1295 "Return the current Python process. 1287 "Return the current Python process.