Emacs defadvice для функции в режиме Python

В режиме 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 ответа

Решение

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

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

Используйте вокруг советы, чтобы обернуть функцию в вызове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""" в элисп. Я не думаю, что они работают.

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

(defadvice py-execute-region                                                
   (after py-execute-region-other-window activate)                          
   (interactive)
   (other-window 1)                                                         
)

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

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

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

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

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

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

Другие вопросы по тегам