2012-04-15 184 views
37

我已经安装了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 manual介绍Pymacs帮手死亡。它告诉我不应该关闭*Pymacs*缓冲区,因为这会杀死帮助程序,并且如果帮助程序被终止,还应该重新启动Emacs。这是不可接受的,因为我有习惯随时关闭所有缓冲区,并且很少重新启动Emacs。我现在有几个相关的问题:

  • 什么是最好的方式来处理Pymacs最小化这种问题?仅当我使用Python并且然后再次安全地终止它时,是否可以运行Pymacs?
  • 什么是pymacs-terminate-services,我应该运行它吗?
  • 如果我意外运行pymacs-terminate-services,该怎么办?我特别感兴趣的是如何编辑before-save-hook以使缓冲区保存成为可能而没有错误消息。
+1

没有尝试过,但是[Pymacs/contrib/Giorgi/dir中的这一点](https:// github。com/pinard/Pymacs/blob/b4e462f52566ad51c18f5d65e1db32af1e24bc13/contrib/Giorgi/dotEmacs.py)似乎是相关的,也许..? – dbr 2012-10-24 04:26:20

+1

一个非常详细的,语法正确的问题,还没有收到确凿的答案...绝对值得一个赏金。 – 2012-11-25 20:05:02

回答

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*缓冲与否。你甚至可以把它不可能从keybinds这个杀:

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

我用pymacs-terminate-services强行加载所有模块。我有一个类似于http://www.emacswiki.org/emacs/AntonNazarov中的pymacs-reload-rope的函数。

也许您可以将pymacs-terminate-services添加到kill-buffer-hook(本地位于*Pymacs*缓冲区中)以获得更优雅的终止。但我不确定。对于您的其余问题,我想最好是在Pymacs issue tracker中询问/请求。

0

如果不小心杀死了* Pymacs *缓冲区或执行pymacs-terminate-services,则可以通过执行以下命令并在提示符下回答“是”来恢复进程。

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

您可以修改您的init文件功能,允许重启与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)