Come far funzionare il completamento automatico in modalità AucTeX?


11

Voglio che auto-complete(ac) funzioni quando sono all'interno della AucTeXmodalità. Ricevo tutti i pacchetti da MELPA tramite l'installazione del pacchetto.

Questo è il mio codice rilevante nel init.elfile:

(require 'package)
(package-initialize)
(require 'auto-complete-config)
(ac-config-default)   
(global-auto-complete-mode t)

come puoi vedere, anche se sto impostando a aclivello globale, non appare in AucTeX. Tuttavia, seguendo le istruzioni in questo emacswiki , la acmodalità è stata visualizzata nella barra di stato AucTeXma non funzionante, nessun completamento automatico digitando i caratteri.

Note
Emacs 24.4 in Windows 7 a 32 bit e pacchetti aggiornati.


Il tuo problema è far funzionare ac insieme yasnippet o da soli, mentre sei in modalità LaTex? In quest'ultimo caso, utilizzo ac con AUCTeX senza molto lavoro.
giordano,

1o, voglio acfare bene con auctex. Ho accennato yasnippetperché lo uso anche per avere alcuni snippet definiti dall'utente in lattice. Quindi, fino a quando non fornirai il tuo codice, non posso dire se yassi frapporrà ac.
dottorato il

Tono, per favore! Prova a scoprire yasnippetse il completamento automatico e AUCTeX funzionano insieme come suggerito da @giordano. Se sì, allora il problema è con l'inclusione di yasnippet. In tal caso, è probabilmente la tua configurazione di completamento automatico.
Dan

Possiamo dimenticare di yasnippetaverlo rimosso dal mio init.el. Molto probabilmente il problema riguarda l'installazione di auctexe ac.
dottorato il

1
Vedi un pacchetto di Christopher Monsanto github.com/monsanto/auto-complete-auctex . Non l'ho provato.
Nome

Risposte:


11

Dopo aver fatto una lunga ricerca nel web e un attento esame della acdocumentazione con molte prove sulla mia macchina per esaminare il codice riga per riga, ho trovato questa soluzione che può yasnippetfunzionare anche (optioinal) senza alcun dubbio.

mettilo nel tuo init.elo .emacsprenditi cura della sequenza:

(require 'package)
(package-initialize)

;; yasnippet code 'optional', before auto-complete
(require 'yasnippet)
(yas-global-mode 1)

;; auto-complete setup, sequence is important
(require 'auto-complete)
(add-to-list 'ac-modes 'latex-mode) ; beware of using 'LaTeX-mode instead
(require 'ac-math) ; package should be installed first 
(defun my-ac-latex-mode () ; add ac-sources for latex
   (setq ac-sources
         (append '(ac-source-math-unicode
           ac-source-math-latex
           ac-source-latex-commands)
                 ac-sources)))
(add-hook 'LaTeX-mode-hook 'my-ac-latex-mode)
(setq ac-math-unicode-in-math-p t)
(ac-flyspell-workaround) ; fixes a known bug of delay due to flyspell (if it is there)
(add-to-list 'ac-modes 'org-mode) ; auto-complete for org-mode (optional)
(require 'auto-complete-config) ; should be after add-to-list 'ac-modes and hooks
(ac-config-default)
(setq ac-auto-start nil)            ; if t starts ac at startup automatically
(setq ac-auto-show-menu t)
(global-auto-complete-mode t) 

Note:
come menzionato nella documentazione di ac, aggiungere ac-modese agganciare prima del caricamento (ac-config-default).

Alcuni hanno suggerito di mettere un po 'di codice per giocare con la TABchiave di cui non avevo bisogno e non lo consiglio, poiché in qualche modo distruggerà qualcos'altro. Tuttavia, ho visto persone mettere qualcosa del genere alla fine poco prima global-auto-complete:

(ac-set-trigger-key "TAB")
(ac-set-trigger-key "<tab>")  

Fino a quando ho aggiunto il (ac-flyspell-workaround)completamento automatico era troppo lento per pensare di usarlo in Auctex da quando utilizzo flyspell. Questo errore è stato menzionato anche nella documentazione. Grazie!

Bonus
Sono stato felice di sapere dalla documentazione, anche se non è molto chiaro come, che si possano aggiungere un dizionario (i) definito dall'utente! Ho provato questo e ha funzionato bene.

aggiungi queste due righe subito dopo la require-auto-completeriga sopra:

(add-to-list 'ac-dictionary-directories "~/.emacs.d/.dict") ; make sure this folder exists
(add-to-list 'ac-user-dictionary-files "~/.emacs.d/.dict/custom-dict.txt") ; put any name to your `.txt` file  

Ora nel tuo .txtfile aggiungi i tuoi candidati preferiti per il completamento. Salva te stesso dai candidati di meno di 4 lettere, non ne valgono la pena! Metti semplicemente le tue parole come separate da un feed di riga o RET.

Esempio dei contenuti nel .txtfile:

inconsistencies
foobaremaild@foobar.com
do-not-put-your-password-here
long-line-in-any-programming-language-of-your-like

Goditi il ​​completamento automatico in LaTeX / AUCTeX con Emacs!


sarebbe bello se ci fosse una elispfunzione per gettare qualsiasi parola marcata in un buffer mentre si scrive in quel .txtdittioinary al volo e aggiungerlo senza troppi sforzi!
dottorato il

6

Come ho detto nel mio commento sopra, il pacchetto auto-complete-auctexpuò anche risolvere il problema. Ho provato entrambi ed entrambi funzionano bene. Sarebbe bello confrontare la soluzione di @doctorate e il pacchetto sopra dando schermate. Se scrivo $\sig$, il codice del dottorato dà qualcosa del genere

inserisci qui la descrizione dell'immagine

e quello del pacchetto auto-complete-auctexdà qualcosa del genere

inserisci qui la descrizione dell'immagine

Aggiunto: dovrei menzionare che anche la soluzione di @giordano funziona, qui una schermata:

inserisci qui la descrizione dell'immagine


Penso che auto-completedovrebbe essere il pacchetto principale mentre auto-complete-auctexpotrebbe avere alcune funzionalità extra. Lo proverò e riferirò se necessario. Grazie
dottorato il

2
Ho installato il pacchetto ma non riesco ad aprire il popup con i completamenti ... Come hai fatto e c'è della documentazione su questo?
Raven,

@Raven Non sono sicuro di averlo "davvero" funzionante. Ma se aggiungi i punti chiave TAB che il dottorato ha detto di evitare, premendo TAB lo fai funzionare (per me).
Chill2Macht,

4

Di seguito è la mia auto-completeconfigurazione correlata:

(require 'package)
(package-initialize)
(require 'auto-complete-config)
(ac-config-default)

;; Activate auto-complete for latex modes (AUCTeX or Emacs' builtin one).
(add-to-list 'ac-modes 'latex-mode)

;; Activate ac-math.
(eval-after-load "latex"
  '(when (featurep 'auto-complete)
     ;; See https://github.com/vspinu/ac-math
     (require 'ac-math)
     (defun ac-latex-mode-setup ()       ; add ac-sources to default ac-sources
       (setq ac-sources
         (append '(ac-source-math-unicode ac-source-math-latex ac-source-latex-commands)
             ac-sources)))
     (add-hook 'LaTeX-mode-hook 'ac-latex-mode-setup)))

Come puoi vedere, non c'è nulla di speciale per AUCTeX, è la configurazione standard di auto-complete. La configurazione per ac-mathè descritta sul suo sito web. Se non lo usi ac-math, l'unica differenza sensata con la tua configurazione è (add-to-list 'ac-modes 'latex-mode).


-1: utilizzare package-initialize. Potrebbe non piacerti, ma per favore non raccomandare cattive pratiche come la load-pathgestione manuale nelle tue risposte.
lunaryorn,

2
@lunaryorn Non credo di aver raccomandato cattive pratiche, ho chiaramente scritto che è un trucco sporco solo per caricare un pacchetto ausiliario. Cercherò di migliorare la risposta usando in package-initializeseguito comunque.
giordano,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.