Управляющий смертью помощника
Я установил Pymacs, веревку, веревку, веревку, и когда я выполнил 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, чтобы минимизировать такие проблемы? Можно ли запускать Pymacs только тогда, когда я работаю с Python, а затем безопасно завершить его снова?
- Что такое
pymacs-terminate-services
и я должен когда-либо управлять этим? - Что мне делать, если я случайно запустил
pymacs-terminate-services
? Меня особенно интересует, как редактироватьbefore-save-hook
сделать возможным сохранение буфера без сообщений об ошибках.
2 ответа
Самое простое решение, которое я могу придумать, это использовать kill-buffer-query-functions
крюк, чтобы предотвратить *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*
буфер или нет. Вы даже можете сделать невозможным убийство с помощью клавиш:
(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*
буфер) для более изящного завершения. Но я не уверен. Для остальной части вашего вопроса, я думаю, что лучше спросить / запросить в системе отслеживания проблем Pymacs.
Если вы случайно убили буфер *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)