2010-05-22 14 views
5

Io uso Pymacs per caricare ropemacs e corda con le seguenti righe nel mio .emacs file come descritto here.Carica Pymacs & Ropemacs solo quando si apre un file Python?

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

E tuttavia rallenta l'avvio di Emacs in modo significativo come ci vuole un po 'a carico Ropemacs.

ho provato la seguente riga, invece, ma che carica Ropemacs ogni volta che un file Python viene aperto:

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

C'è un modo per eseguire l'operazione pymacs-load quando si apre un file di Python, ma solo se ropemacs e corda non sono ancora stati caricati?

risposta

9

Nei miei .emacs ho:

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

E in un file separato my-python-setup.el io continuo:

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

In questo modo, Pymacs e ropemacs verranno caricati una sola volta. Ciò accade quando viene aperto il primo file .py.

2

Questo è ciò che è 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-"))) 

Avrai bisogno di scrivere "python" invece di "python-mode" se si utilizza python.el invece di python-mode.el.

In realtà ho il mio codice ropemacs caricamento in una funzione separata che può essere chiamata in modo interattivo. Questo perché occasionalmente lo ropemacs si arresta in modo anomalo per me e, quando lo fa, lo chiamo semplicemente per ricaricarlo.

+0

E come [questa risposta] (http://stackoverflow.com/a/2736153/1497596) indica, 'eval-after-load' viene eseguito solo * una volta *, quindi è l'ideale per la configurazione iniziale di una modalità. – DavidRR

1

Questa è la mia soluzione:

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

dove ac-ropemacs-setup è definito nella completamento automatico modulo:

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

Questa soluzione per scontato che si utilizza completamento automatico a lo stesso tempo.

+0

Come [questa risposta] (http://stackoverflow.com/a/2736153/1497596) indica che l'utilizzo di un hook di modalità non è realmente l'approccio giusto qui perché un hook di modalità viene eseguito per ogni nuovo buffer a cui si applica la modalità. Ma fare uso di ** completamento automatico ** è una buona idea. – DavidRR

Problemi correlati