Управление смертью помощника
Я установил Pymacs, rope, ropemode, ropemacs, и когда я случайно выполнил pymacs-terminate-services
, я не смог сохранить измененные буферы. Сначала он спросил меня - The Pymacs helper died. Restart it? (yes or no)
. Если бы я ответил "да", он бросил - Debugger entered--Lisp error: (error "There is no Pymacs helper!")
. Если я ответил "нет", он бросил:
Debugger entered--Lisp error: (error "Python: Traceback (most recent call last):
File \"/usr/local/lib/python2.7/dist-packages/Pymacs.py\", line 258, in loop
value = eval(text)
File \"<string>\", line 1, in <module>
IndexError: list index out of range
")
Мне удалось обойтись, выполнив pymacs-load
, загрузив модуль os
и отвечая да на вопрос о перезапуске помощника Pymacs. Буфер был сохранен, но затем я начал получать другую ошибку каждый раз, когда я сохранил файл:
Debugger entered--Lisp error: (error "Python: Traceback (most recent call last):
File \"/usr/local/lib/python2.7/dist-packages/Pymacs.py\", line 258, in loop
value = eval(text)
File \"<string>\", line 1, in <module>
TypeError: major() takes exactly 1 argument (0 given)
")
Это мой init файл:
(load "~/.emacs.d/pymacs.el")
(autoload 'pymacs-apply "pymacs")
(autoload 'pymacs-call "pymacs")
(autoload 'pymacs-eval "pymacs" nil t)
(autoload 'pymacs-exec "pymacs" nil t)
(autoload 'pymacs-load "pymacs" nil t)
(autoload 'pymacs-autoload "pymacs")
(require 'pymacs)
(pymacs-load "ropemacs" "rope-")
Руководство пользователя Pymacs описывает смерть помощника Pymacs. Это говорит о том, что я не должен закрывать буфер *Pymacs*
, потому что это убивает помощника, а также должен перезапускать Emacs, если помощник убит. Это неприемлемо, поскольку у меня есть привычка время от времени закрывать все буферы, а также редко перезапускать Emacs. У меня есть несколько связанных вопросов:
- Каков наилучший способ обработки Pymacs для минимизации таких проблем? Можно ли запускать Pymac только тогда, когда я работаю с Python, а затем безопасно завершать его снова?
- Что такое
pymacs-terminate-services
для и должен ли я когда-либо запускать его?
- Что делать, если я случайно запускаю
pymacs-terminate-services
? Мне особенно интересно, как отредактировать before-save-hook
, чтобы сделать сохранение буфера без сообщений об ошибках.
Ответы
Ответ 1
Самое простое решение, о котором я могу думать, это использовать kill-buffer-query-functions
hook, чтобы предотвратить *Pymacs*
, чтобы быть убитым. Вот так:
(defun my-pymacs-saver ()
(if (equal (buffer-name) "*Pymacs*")
(yes-or-no-p "Really kill *Pymacs* buffer? ")
t))
(add-hook 'kill-buffer-query-functions 'my-pymacs-saver)
Он спросит вас, хотите ли вы действительно убить буфер *Pymacs*
или нет. Вы даже можете сделать невозможным убить из keybinds этим:
(defun my-pymacs-saver ()
(if (equal (buffer-name) "*Pymacs*")
(progn
(message "NEVER kill *Pymacs*!")
nil)
t))
Я использую pymacs-terminate-services
для принудительной перезагрузки всех модулей. У меня есть функция, похожая на pymacs-reload-rope
в http://www.emacswiki.org/emacs/AntonNazarov.
Возможно, вы можете добавить pymacs-terminate-services
в kill-buffer-hook
(локально в буфере *Pymacs*
) для более грациозного завершения. Но я не уверен. Для остальной части вашего вопроса, я думаю, лучше спросить/запросить в контролере ошибок.
Ответ 2
Если вы случайно убили буфер * Pymacs * или выполнили pymacs-terminate-services
, вы можете восстановить процесс, выполнив следующую команду и отвечая "да" в приглашении.
(pymacs-load "ropemacs" "rope-")
Вы можете изменить функцию init-file, чтобы позволить интерактивному вызову перезапуска с помощью M-x python-restart
. Перезапуск Pymacs таким образом позволит избежать ошибки TypeError: major()...
.
(defun pymacs-restart ()
(interactive)
(pymacs-load "ropemacs" "rope-"))
(load "~/.emacs.d/pymacs.el")
(autoload 'pymacs-apply "pymacs")
(autoload 'pymacs-call "pymacs")
(autoload 'pymacs-eval "pymacs" nil t)
(autoload 'pymacs-exec "pymacs" nil t)
(autoload 'pymacs-load "pymacs" nil t)
(autoload 'pymacs-autoload "pymacs")
(require 'pymacs)
(pymacs-restart)