Подтвердить что ты не робот

Управление смертью помощника

Я установил 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, чтобы сделать сохранение буфера без сообщений об ошибках.
4b9b3361

Ответ 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)