加载Pymacs& Ropemacs只在打开Python文件时?

时间:2010-05-22 23:54:02

标签: python emacs ropemacs pymacs

我使用 Pymacs .emacs 文件中使用以下行加载 ropemacs rope ,如上所述here

(autoload 'pymacs-load "pymacs" nil t)
(pymacs-load "ropemacs" "rope-")
然而,由于加载 Ropemacs 需要一段时间,因此它显着减慢了Emacs的启动速度。

我尝试了以下行,但每次打开Python文件时都会加载 Ropemacs

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

打开Python文件时是否有办法执行pymacs-load操作,但仅当 ropemacs rope 尚未加载?

3 个答案:

答案 0 :(得分: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)

这样, Pymacs ropemacs 只会加载一次。当第一个 .py 文件打开时会发生这种情况。

答案 1 :(得分: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 会崩溃,当它发生时,我只是调用该函数来重新加载它。

答案 2 :(得分: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自动完成模块中定义:

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

此解决方案假设您同时使用自动完成