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 (при условии, что установлен флаг активации).