Как запустить emacs с оболочкой ipython, работающей на одной стороне разделенного окна?

Я хотел бы иметь следующий рабочий процесс с использованием emacs 23.4 в качестве IDE python (2.7) в Debian:

  1. Emacs запускается с двумя окнами рядом при открытии файла, такого как $ emacs file.py
  2. В левом окне уже есть оболочка, а в правом — файл буфера.
  3. Ярлык выполняет код (и другой ярлык для его частей), и результат можно увидеть в левом окне (оболочка ipython). Фокус остается в правом окне, и буферы не меняются при выполнении команды.
  4. Ярлык легко переключает фокус слева направо и наоборот.

До сих пор я мог выполнить все, кроме второго пункта (мне нужно сделать буфер видимым вручную), что кажется простым. Я читал справочное руководство по emacslips, чтобы самому настроить emacs, но я все еще новичок в emacs. Я также нашел некоторые похожие вопросы, но не полностью полезные. Вот некоторые важные части моего .emacs.

;; Initial frame size and position (1280x1024)
(setq default-frame-alist
  '((top . 45) (left . 45)
    (width . 142) (height . 54)))
(if (window-system) 
  (split-window-horizontally (floor (* 0.49 (window-width))))
)

; python-mode
(setq py-install-directory "~/.emacs.d/python-mode.el-6.1.3")
(add-to-list 'load-path py-install-directory)
(require 'python-mode)

; use IPython
(setq-default py-shell-name "ipython")
(setq-default py-which-bufname "IPython")
; use the wx backend, for both mayavi and matplotlib
(setq py-python-command-args
  '("--gui=wx" "--pylab=wx" "--colors=linux"))
(setq py-force-py-shell-name-p t)

; switch to the interpreter after executing code
(setq py-shell-switch-buffers-on-execute-p t)
 ;(setq py-switch-buffers-on-execute-p t)

; don't split windows
(setq py-split-windows-on-execute-p nil)
; try to automagically figure out indentation
(setq py-smart-indentation t)

(defun goto-python-shell () 
  "Go to the python command window (start it if needed)" 
  (interactive)
  (setq current-python-script-buffer (current-buffer))
  (py-shell)
  (end-of-buffer)
)
(goto-python-shell)

Я считаю, что решение простое и заключается в функциях/переменных: переключатель-буфер, выбор начального буфера, другое окно, py-shell-switch-buffers-on-execute-p, py-switch-buffers- при выполнении-p.

Тем не менее, я все еще не мог найти решение, которое заставило бы все это работать.


ИЗМЕНИТЬ:

Я смог получить желаемое поведение, заменив последнюю часть на:

(switch-to-buffer (py-shell))
(end-of-buffer)
(other-window 3)
(switch-to-buffer (current-buffer))

, так как с помощью get-buffer-window я узнал, что левое окно отображается как 3, а правое — как 6.


person Allan Felipe    schedule 24.11.2014    source источник


Ответы (1)


Когда установлены py-split-windows-on-execute-p, py-switch-buffers-on-execute-p, все должно работать как положено — нет необходимости вручную разбивать.

Остается вопрос по горизонтали/вертикали. Для этого python-mode.el предоставляет настройку py-split-windows-on-execute-function в текущем транке:

https://code.launchpad.net/python-mode

person Andreas Röhler    schedule 25.11.2014
comment
Окна должны быть в фиксированной желаемой пропорции. Я считаю, что у меня должно быть: (setq py-shell-switch-buffers-on-execute-p nil) и (setq py-switch-buffers-on-execute-p nil), хотя я не мог понять, что поведение первой функции есть, только вторая. Остается проблема инициализации. - person Allan Felipe; 26.11.2014
comment
@AllanFelipe M-x описать-переменную RET ... должен предоставить некоторую информацию. Один из способов запустить код при запуске — поместить их в хук, например: (add-hook 'python-mode-hook (lambda() Do-What-I-want)) - person Andreas Röhler; 26.11.2014
comment
Это именно то, что мне нужно узнать: порядок того, как все происходит, и как этим манипулировать. Спасибо, я проверю это. - person Allan Felipe; 27.11.2014