仅在打开 Python 文件时加载 Pymacs 和 Ropemacs?

5 投票
3 回答
2388 浏览
提问于 2025-04-15 23:02

我在我的.emacs文件中使用Pymacs来加载ropemacsrope,具体的做法可以参考这里

(autoload 'pymacs-load "pymacs" nil t)
(pymacs-load "ropemacs" "rope-")

不过,这样做会让Emacs启动变得很慢,因为加载Ropemacs需要一些时间。

我试过用下面这一行,但这样每次打开Python文件时都会加载Ropemacs

(add-hook 'python-mode-hook (lambda () (pymacs-load "ropemacs" "rope-")))

有没有办法在打开Python文件时执行pymacs-load操作,但只有在ropemacsrope还没有加载的情况下?

3 个回答

1

这是我的解决方案:

(defun my-python-hook-mode ()
  (interactive)
  (require 'pymacs)
  (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)
  (ac-ropemacs-setup)
  (setq ropemacs-confirm-saving 'nil)
  (ropemacs-mode t)
  (define-key python-mode-map "\C-m" 'newline-and-indent)
 )
(add-hook 'python-mode-hook 'my-python-hook-mode)

其中 ac-ropemacs-setup 是在 auto-complete 模块中定义的:

(defun ac-ropemacs-require ()
  (with-no-warnings
    (unless ac-ropemacs-loaded
      (pymacs-load "ropemacs" "rope-")
      (if (boundp 'ropemacs-enable-autoimport)
          (setq ropemacs-enable-autoimport t))
      (setq ac-ropemacs-loaded t))))

(defun ac-ropemacs-setup ()
  (ac-ropemacs-require)
  ;(setq ac-sources (append (list 'ac-source-ropemacs) ac-sources))
  (setq ac-omni-completion-sources '(("\\." ac-source-ropemacs))))

这个解决方案假设你同时使用 auto-complete

2

这就是 eval-after-load 的用途。

(eval-after-load "python-mode"
  '(progn
     ;; Do whatever you need to do here. It will only get executed
     ;; after python-mode.el has loaded.
     (require 'pymacs)
     (pymacs-load "ropemacs" "rope-")))

如果你使用的是 python.el 而不是 python-mode.el,那么你需要写 "python" 而不是 "python-mode"。

其实我把 ropemacs 的加载代码放在一个单独的函数里,这样可以随时调用。这样做是因为有时候 ropemacs 会崩溃,崩溃后我只需要调用那个函数就能重新加载它。

9

在我的 .emacs 文件里,我有:

(autoload 'python-mode "my-python-setup" "" t)

然后在一个单独的文件 my-python-setup.el 中,我保存了:

(require 'python)
(add-to-list 'auto-mode-alist '("\\.py\\'" . python-mode))
;; Initialize Pymacs
(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)
;; Initialize Rope
(pymacs-load "ropemacs" "rope-")
(setq ropemacs-enable-autoimport t)

这样一来,Pymacsropemacs 只会被加载一次。这会在第一个打开的 .py 文件时发生。

撰写回答