Загружать Pymacs & Ropemacs только при открытии файла Python? - PullRequest
5 голосов
/ 23 мая 2010

Я использую Pymacs для загрузки Ropemacs и Rope со следующими строками в моем файле .emacs , как описано здесь .

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

Тем не менее, он значительно замедляет запуск Emacs, поскольку для загрузки Ropemacs требуется некоторое время.

Я попробовал следующую строку вместо этого, но она загружает Ropemacs каждый раз, когда открывается файл Python:

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

Есть ли способ выполнить операцию pymacs-load при открытии файла Python, но только если ropemacs и веревка еще не загружены?

Ответы [ 3 ]

9 голосов
/ 02 июня 2010

В моем .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 .

2 голосов
/ 19 сентября 2010

Это то, для чего 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» вместо «python-mode», если вы используете python.el вместо python-mode.el .

У меня на самом деле есть ropemacs код загрузки в отдельной функции, которую можно вызывать в интерактивном режиме. Это потому, что иногда ropemacs вылетает для меня, и когда это происходит, я просто вызываю эту функцию, чтобы перезагрузить его.

1 голос
/ 08 марта 2011

Это мое решение:

(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 одновременно.

...