переключать настройки буфера, используя Python-режим в Emacs? - PullRequest
1 голос
/ 28 марта 2012

Я давно пользуюсь emacs, но не очень знаком с программированием на lisp. Прошло всего пару дней, и я начал писать Python на emacs. Я нашел Python-режим весьма полезным, и я хочу изучить его дальше. Я нашел несколько функций emacs lips в интернете, немного подправил их, чтобы сделать интерфейс удобным для пользователя. Я пытаюсь добиться следующих действий

Я обычно запускаю emacs с 2 вертикальными окнами, одно с источником Python, а другое - оболочка. Я должен быть в состоянии сделать следующее, используя привязки клавиатуры

  • переключение между буферами (работает)
  • выполнить регион (рабочий) но заменяет исходный буфер буфером оболочки. Я хочу выполнить выбранную область в исходном буфере оболочки.
  • выполнить строку (работает) но та же проблема, что и выше. когда я говорю, строка должна быть выполнена в оболочке Python без замены каких-либо буферов. поэтому скопируйте строку, переключитесь на оболочку Python, выполните строку, вернитесь к исходному буферу Python.

Я не могу выполнить переключение выше. Ниже приведен мой код из моего файла init.el

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

 (defun goto-python-source ()
   "switch back to source window"
   (interactive)
  (setq current-python-shell-buffer (current-buffer))
   (switch-to-buffer-other-window current-python-script-buffer)
 )

 (defun py-execute-statement-and-step ()
   "select a statement, submit as a region and then step forward"
   (interactive)
   (beginning-of-line 1)
   (let ((beg (point)))
     (py-next-statement 1)
     ; if last statement.
        (if (= (point) beg) (end-of-buffer ))
 ; (switch-to-buffer-other-window current-python-shell-buffer)
   (py-execute-region beg (point))
   (switch-to-buffer-other-window current-python-script-buffer)
   )
 )

 ; some key bindings
 (define-key python-mode-map (quote [f9]) 'py-execute-statement-and-step)
 ;(define-key python-mode-map (quote [f10]) `py-execute-region)
 ;py-shell-switch-buffers-on-execute
 (define-key python-mode-map (quote [f10]) `py-shell-switch-buffers-on-execute)
 (define-key python-mode-map (quote [f11]) `py-execute-buffer)
 (define-key python-mode-map (quote [f12]) `goto-python-shell)
 (define-key py-shell-map (quote [f12]) `goto-python-source)

Пожалуйста, совет.

Кроме того, поскольку я новичок в python-mode, может кто-нибудь поделиться хорошими инициализациями для использования python-mode, подобного описанному выше?

Большое спасибо за вашу помощь.

С уважением, AJ

Ответы [ 3 ]

3 голосов
/ 29 марта 2012

Вы должны взглянуть на первый ответ на этот вопрос и настроить переменную py-shell-switch-buffers-on-execute.

Таким образом, вам не понадобятся все ваши пользовательские функции, чтобы заставить python-mode работать так, как вы хотите (т. Е. Поддерживать исходный буфер активным)

2 голосов
/ 29 марта 2012

Я думаю, что вы пытаетесь заново изобрести то, что доступно в Emacs 24 (по крайней мере, для оценки). Попробуйте Emacs 24. Когда вы редактируете исходный код Python, вы можете нажать C-c C-c для оценки буфера и нажать C-c C-r для оценки региона. Вам не нужно явно запускать оболочку Python.

Я не думаю, что есть прямая поддержка для оценки линии и шага. Вы можете добиться этого нажатием клавиш C-SPC C-n C-c C-r . Ваш фокус останется в исходном коде, и нет необходимости явно переключаться между исходным кодом и оболочкой.

FWIW, я ежедневно использую Emacs 24 в течение разумного периода времени, и у меня не было проблем со стабильностью.

0 голосов
/ 30 марта 2012

следующие изменения работают как шарм. f9 выполняет построчное выполнение, а f10 - выполнение по регионам. curser остается в окне скрипта после того, как я отключил py-shell-switch-buffers-on-execute.

(defun py-execute-statement-and-step ()
  "select a statement, submit as a region and then step forward"
  (interactive)
  (beginning-of-line 1)
  (let ((beg (point)))
    (py-next-statement 1) 
    ; if last statement.
        (if (= (point) beg) (end-of-buffer ))
        (py-execute-region beg (point))
        (next-line)
  )
) 

(custom-set-variables
'(py-shell-switch-buffers-on-execute nil))

(define-key python-mode-map (quote [f9]) 'py-execute-statement-and-step)
(define-key python-mode-map (quote [f10]) `py-execute-region)
...