Emacs defadvice для функции в режиме Python - PullRequest
5 голосов
/ 13 сентября 2009

В режиме python есть функция, называемая py-execute-region, которая отправляет выделенную область кода в буфер Python для оценки. После оценки курсор находится в буфере Python, но я бы предпочел, чтобы он оставался в буфере сценария, чтобы я мог продолжать создавать больше кода. Я написал простую функцию консультирования:

(defadvice py-execute-region                                                
   (after py-execute-region-other-window activate)                          
   """ After execution, return cursor to script buffer """                  
   (other-window 1)                                                         
) 

Но это ничего не делает вообще. Я пробовал другие варианты, такие как «вокруг», а не «после»; установка переменной для имени буфера скрипта и затем pop-to-buffer для этого буфера и тому подобное. Нет успеха! Интересно, механика этого для кого-то очевидна ... Спасибо!

Ответы [ 4 ]

8 голосов
/ 05 декабря 2009

В этом случае решение выглядит как

(custom-set-variables
 '(py-shell-switch-buffers-on-execute nil))
2 голосов
/ 13 сентября 2009

Используйте обходной совет, чтобы обернуть функцию при вызове save-window-excursion, который восстановит предыдущее окно Конфигурация после завершения команды.

(defadvice py-execute-region
   (around preserve-window-configuration activate)
   "After execution, return cursor to script buffer"
   (save-window-excursion ad-do-it))

Имейте в виду, однако, что если буфер Python еще не был показан, он все еще будет скрыт после завершения команды. Чтобы исправить это, Вы можете добавить еще один совет для вызова switch-to-buffer-other-window на конец:

(defadvice py-execute-region
   (after show-pybuf-other-window activate)
   "After execution, show the python buffer in another window."
   (switch-to-buffer-other-window "[PYTHON BUFFER NAME]"))

Также убедитесь, что вы не используете """triple quotes""" в elisp. Я не думаю, что они работают.

1 голос
/ 17 февраля 2010

Я на самом деле не пробовал это, но я делал что-то похожее для find-file, и там мне нужно было вызвать интерактив, прежде чем вызывать other-window. На самом деле я понятия не имею о Emacs Lisp, но это может сработать.

(defadvice py-execute-region                                                
   (after py-execute-region-other-window activate)                          
   (interactive)
   (other-window 1)                                                         
)
1 голос
/ 13 сентября 2009

То, что у вас там, прекрасно работает для меня. И он должен автоматически активироваться, поэтому отдельная активация должна быть ненужной. Однако для вступления изменений в силу необходимо деактивировать и повторно активировать рекомендацию:

1) определить и активировать совет

2) он не делает то, что вы хотите, поэтому измените совет

3) деактивировать его: (деактивировать 'py-execute-region)

4) реактивировать его: (ad-activate py-execute-region)

Шаг 4 должен забрать изменения, сделанные на шаге 2. Кроме того, вы можете изменить код на шаге 2, а затем просто пересмотреть код на шаге 4 (при условии, что установлен флаг активации).

...