2010-01-18 11 views
7

Emacs wiki dice:Circa la correzione per l'interferenza tra la modalità Società e Yasnippet

Società non interferisce con il comportamento nativo di Yasnippet. Ecco un soluzione rapida: http://gist.github.com/265010

Il codice è il seguente:

(define-key company-active-map "\t" 'company-yasnippet-or-completion) 

(defun company-yasnippet-or-completion() 
    (interactive) 
    (if (yas/expansion-at-point) 
     (progn (company-abort) 
      (yas/expand)) 
    (company-complete-common))) 

(defun yas/expansion-at-point() 
    "Tested with v0.6.1. Extracted from `yas/expand-1'" 
    (first (yas/current-key))) 

ho messo che il codice nelle mie .emacs e il seguente messaggio apparso:

Warning (initialization): An error occurred while loading `c:/Documents and Settings/Alex.AUTOINSTALL.001/Application Data/.emacs.elc': 

Symbol's value as variable is void: company-active-map 

To ensure normal operation, you should investigate and remove the 
cause of the error in your initialization file. Start Emacs with 
the `--debug-init' option to view a complete error backtrace. 

Do I è necessario posizionare il codice di correzione all'interno di un file .EL di YASnippet? o nel mio .emacs (che mi lancia un errore)?

risposta

-2

Sembra un problema con il percorso di caricamento. Il valore del simbolo vuoto significa che emacs non riesce a trovare una definizione per esso - molto probabilmente perché il file che contiene la sua definizione non è ancora stato caricato.

Si può provare ad aggiungere qualcosa di simile nel vostro .emacs (prima che il codice di errore che causano):

;; where ~/.emacs.d/ is the path to a directory containing 
;; additional library code you want emacs to load 
(add-to-list 'load-path "~/.emacs.d/") 
+0

Spiacente, non ha funzionato. – alexchenco

+2

Questo non sarebbe il problema dato che non sta caricando specificatamente nulla quando accede alla mappa. Il problema è che non ha caricato la modalità azienda in quel momento. – RichieHH

3

Il frammento di lei ha citato non funziona più comunque.

Ecco un frammento di codice che è possibile utilizzare invece:

(defun company-yasnippet-or-completion() 
    (interactive) 
    (let ((yas-fallback-behavior nil)) 
    (unless (yas-expand) 
     (call-interactively #'company-complete-common)))) 

Per assicurarsi che questo si chiama invece di company-complete-common, utilizzare

(add-hook 'company-mode-hook (lambda() 
    (substitute-key-definition 'company-complete-common 
          'company-yasnippet-or-completion 
          company-active-map))) 

Contesto: Questo cambia localmente il valore di yas-fallback-behaviour, che ti permette di chiamare company-complete-common se non viene trovato alcun completamento.

+2

Come autore di yasnippet, posso confermare che si tratta di un uso legale dell'API, mentre il codice precedente non lo era. –

+1

non '(applica 'company-complete-common nil)' solo un modo verboso di dire '(company-complete-common)'? O si suppone che sia '(citare (applicare società-completo-comune))'? – npostavs

+0

@npostavs: hai ragione, c'era una citazione mancante lì. Ho colto l'occasione per semplificare il frammento. –

Problemi correlati