37

I had installed Pymacs, rope, ropemode, ropemacs, and when I executed pymacs-terminate-servicesby accident, I couldn't save modified buffers. It first asked me - The Pymacs helper died. Restart it? (yes or no). If I answered "yes", it threw - Debugger entered--Lisp error: (error "There is no Pymacs helper!"). If I answered "no", it threw:

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
")

I managed to work around by executing pymacs-load, loading os module, and answering yes to Pymacs helper restart question. The buffer was saved, but then I started to get another error everytime I saved the file:

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)
")

This is my init-file:

(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 manual describes death of Pymacs helper. It tells that I shouldn't close *Pymacs* buffer, because this kills the helper, and should also restart Emacs if helper is killed. This is unacceptable as I have a habit of closing all buffers from time to time and also rarely restart Emacs. I have several related questions now:

  • What is the best way to handle Pymacs to minimize such problems? Is it possible to run Pymacs only when i work with Python and then safely terminate it again?
  • What is pymacs-terminate-services for and should I ever run it?
  • What should I do if I ever accidentally run pymacs-terminate-services? I'm especially interested in how to edit before-save-hook to make buffer saves possible without error messages.
Dilberted
  • 1,172
  • 10
  • 23
Mirzhan Irkegulov
  • 17,660
  • 12
  • 105
  • 166
  • 1
    Not tried it, but [this bit in the Pymacs/contrib/Giorgi/ dir](https://github.com/pinard/Pymacs/blob/b4e462f52566ad51c18f5d65e1db32af1e24bc13/contrib/Giorgi/dotEmacs.py) seems relevant, maybe..? – dbr Oct 24 '12 at 04:26
  • 1
    A very detailed, grammatically correct question that hasn't received a conclusive answer... definitely deserving of a bounty. – username tbd Nov 25 '12 at 20:05

2 Answers2

2

The easiest solution I can think of is to use kill-buffer-query-functions hook to prevent *Pymacs* to be killed. Like this:

(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)

It will ask you if you really want to kill *Pymacs* buffer or not. You can even make it impossible to kill from keybinds by this:

(defun my-pymacs-saver ()
  (if (equal (buffer-name) "*Pymacs*")
      (progn
        (message "NEVER kill *Pymacs*!")
        nil)
    t))

I use pymacs-terminate-services to forcefully reload all modules. I have a function similar to pymacs-reload-rope in http://www.emacswiki.org/emacs/AntonNazarov.

Probably you can add pymacs-terminate-services to kill-buffer-hook (locally in *Pymacs* buffer) for more graceful termination. But I am not sure. For the rest of your question, I guess it's better to ask/request in the Pymacs issue tracker.

tkf
  • 2,990
  • 18
  • 32
0

If you accidentally kill the *Pymacs* buffer or execute pymacs-terminate-services you can recover the process by executing the following command and answering "yes" at the prompt.

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

You can modify your init-file function to allow for the restart to be called interactively with M-x python-restart. Restarting Pymacs in this manner will avoid the TypeError: major()... error.

(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)
gleitz
  • 595
  • 4
  • 12