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

Я установил Pymacs, rope, ropemode, ropemacs, и когда я pymacs-terminate-services выполнил pymacs-terminate-services , я не смог сохранить измененные буферы. Сначала он спросил меня – The Pymacs helper died. Restart it? (yes or no) The Pymacs helper died. Restart it? (yes or no) 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 чтобы сделать сохранение в буфере без сообщений об ошибках.

    2 Solutions collect form web for “Управление смертью помощника”

    Самое легкое решение, о котором я могу думать, – использовать hook 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* buffer) для более грациозного завершения. Но я не уверен. Для остальной части вашего вопроса, я думаю, лучше спросить / запросить в трекер проблема Pymacs.

    Если вы случайно убили буфер * Pymacs * или выполнили pymacs-terminate-services вы можете восстановить процесс, выполнив следующую команду и отвечая «да» в приглашении.

     (pymacs-load "ropemacs" "rope-") 

    Вы можете изменить функцию init-file, чтобы разрешить интерактивный Mx python-restart с Mx python-restart . Перезапуск Pymacs таким образом позволит избежать ошибки TypeError 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) 
    Python - лучший язык программирования в мире.