Quick and extremely dirty hacks to toggle between using CPython and
JPython interpreters. This implementation may suck.
(py-jpython-command, py-jpython-command-args): New variables.
(py-mode-map): py-toggle-shells bound to C-c C-t
(py-toggle-shells): Command to toggle between using CPython (the
default) and JPython. This is buffer local, and notice the mode-name
change.
(py-shell): Use either CPython or JPython. Note that py-execute-*
still needs to be modified.
diff --git a/Misc/python-mode.el b/Misc/python-mode.el
index a183000..558d766 100644
--- a/Misc/python-mode.el
+++ b/Misc/python-mode.el
@@ -142,11 +142,21 @@
:type 'string
:group 'python)
+(defcustom py-jpython-command "jpython"
+ "*Shell command used to start the JPython interpreter."
+ :type 'string
+ :group 'python)
+
(defcustom py-python-command-args '("-i")
"*List of string arguments to be used when starting a Python shell."
:type '(repeat string)
:group 'python)
+(defcustom py-jpython-command-args '("-i")
+ "*List of string arguments to be used when starting a JPython shell."
+ :type '(repeat string)
+ :group 'python)
+
(defcustom py-indent-offset 4
"*Amount of offset per level of indentation
Note that `\\[py-guess-indent-offset]' can usually guess a good value
@@ -565,6 +575,7 @@
(define-key py-mode-map "\C-c\C-c" 'py-execute-buffer)
(define-key py-mode-map "\C-c|" 'py-execute-region)
(define-key py-mode-map "\C-c!" 'py-shell)
+ (define-key py-mode-map "\C-c\C-t" 'py-toggle-shells)
;; Caution! Enter here at your own risk. We are trying to support
;; several behaviors and it gets disgusting. :-( This logic ripped
;; largely from CC Mode.
@@ -1158,6 +1169,47 @@
(defvar py-serial-number 0)
(defvar py-exception-buffer nil)
(defconst py-output-buffer "*Python Output*")
+(make-variable-buffer-local 'py-output-buffer)
+
+;; for toggling between CPython and JPython
+(defvar py-which-shell py-python-command)
+(defvar py-which-args py-python-command-args)
+(defvar py-which-bufname "Python")
+(make-variable-buffer-local 'py-which-shell)
+(make-variable-buffer-local 'py-which-args)
+(make-variable-buffer-local 'py-which-bufname)
+
+(defun py-toggle-shells (arg)
+ "Toggles between the CPython and JPython shells.
+With positive \\[universal-argument], uses the CPython shell, with
+negative \\[universal-argument] uses the JPython shell, and with a
+zero argument, toggles the shell."
+ (interactive "P")
+ ;; default is to toggle
+ (if (null arg)
+ (setq arg 0))
+ ;; toggle if zero
+ (if (= arg 0)
+ (if (string-equal py-which-bufname "Python")
+ (setq arg -1)
+ (setq arg 1)))
+ (let (msg)
+ (cond
+ ((< 0 arg)
+ ;; set to CPython
+ (setq py-which-shell py-python-command
+ py-which-args py-python-command-args
+ py-which-bufname "Python"
+ msg "CPython"
+ mode-name "Python"))
+ ((> 0 arg)
+ (setq py-which-shell py-jpython-command
+ py-which-args py-jpython-command-args
+ py-which-bufname "JPython"
+ msg "JPython"
+ mode-name "JPython"))
+ )
+ (setq py-output-buffer (format "*%s Output*" py-which-bufname))))
;;;###autoload
(defun py-shell ()
@@ -1170,6 +1222,12 @@
See the docs for variable `py-scroll-buffer' for info on scrolling
behavior in the process window.
+Note: You can toggle between using the CPython interpreter and the
+JPython interpreter by hitting \\[py-toggle-shells]. This toggles
+buffer local variables which control whether all your subshell
+interactions happen to the `*JPython*' or `*Python*' buffers (the
+latter is the name used for the CPython buffer).
+
Warning: Don't use an interactive Python if you change sys.ps1 or
sys.ps2 from their default values, or if you're running code that
prints `>>> ' or `... ' at the start of a line. `python-mode' can't
@@ -1191,7 +1249,7 @@
(interactive)
(require 'comint)
(switch-to-buffer-other-window
- (apply 'make-comint "Python" py-python-command nil py-python-command-args))
+ (apply 'make-comint py-which-bufname py-which-shell nil py-which-args))
(make-local-variable 'comint-prompt-regexp)
(setq comint-prompt-regexp "^>>> \\|^[.][.][.] ")
(set-process-filter (get-buffer-process (current-buffer)) 'py-process-filter)