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

这是我的初始化文件:

(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 以尽量减少此类问题的最佳方法是什么?只有当我使用 Python 并再次安全终止它时才可以运行 Pymacs?
  • 有什么pymacs-terminate-services用,我应该运行它吗?
  • 如果我不小心跑了pymacs-terminate-services怎么办?我对如何编辑before-save-hook以使缓冲区保存成为可能而没有错误消息特别感兴趣。
4

2 回答 2

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用来强制重新加载所有模块。我有一个类似于http://www.emacswiki.org/emacs/AntonNazarovpymacs-reload-rope的功能。

可能您可以添加pymacs-terminate-serviceskill-buffer-hook(本地*Pymacs*缓冲区中)以获得更优雅的终止。但我不确定。对于您的其余问题,我想最好在 Pymacs问题跟踪器中询问/请求。

于 2012-11-27T17:22:56.200 回答
0

如果您不小心杀死了 *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)
于 2013-01-18T19:31:21.567 回答