¿Cómo hacer que el autocompletado funcione en modo AucTeX?


11

Quiero que auto-complete(ac) funcione cuando estoy dentro del AucTeXmodo. Recibo todos los paquetes de MELPA mediante la instalación del paquete.

Este es mi código relevante en el init.elarchivo:

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

como puede ver, aunque estoy configurando acglobalmente, no aparece en AucTeX. Sin embargo, siguiendo las instrucciones en este emacswiki , el acmodo se mostró en la barra de estado AucTeXpero no funciona, no se completa automáticamente escribiendo caracteres.

Notas
Emacs 24.4 bajo Windows 7 de 32 bits y se actualizaron los paquetes.


¿Su problema es hacer que ac funcione junto con y solo o solo, mientras está en modo LaTex? En el último caso, uso ac con AUCTeX sin mucho trabajo.
giordano 01 de

Primero, quiero achacerlo bien auctex. Mencioné yasnippetporque también lo uso para tener algunos fragmentos definidos por el usuario en látex. Entonces, hasta que proporcione su código, no puedo decir si yasse interpondrá en el camino ac.
doctorado el

Tono, por favor! Intente sacar yasnippetpara ver si el autocompletado y AUCTeX funcionan juntos como sugirió @giordano. Si es así, entonces el problema es con la inclusión de yasnippet. Si es así, probablemente sea su configuración de autocompletar.
Dan

Podemos olvidar yasnippetque lo eliminé de mi init.el. El problema probablemente esté en la configuración de auctexy ac.
doctorado el

1
Vea un paquete de Christopher Monsanto github.com/monsanto/auto-complete-auctex . No lo he probado.
Nombre

Respuestas:


11

Después de una larga investigación en la web y un examen cuidadoso de la acdocumentación con muchas pruebas en mi máquina para examinar el código línea por línea, se me ocurrió esta solución que también puede yasnippetfuncionar (optioinal) sin ningún tipo de conflicto.

pon esto en tu init.elo .emacscuidando la secuencia:

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

Notas:
como se menciona en la documentación de ac, la adición ac-modesy los ganchos deben realizarse antes de cargar (ac-config-default).

Algunos sugirieron poner un código para jugar con la TABclave que no necesitaba y no recomiendo, ya que de alguna manera destruirá algo más más tarde. Sin embargo, vi a personas poner algo como esto al final justo antes global-auto-complete:

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

Hasta que agregué (ac-flyspell-workaround)la finalización automática fue demasiado lenta para pensar en usarla en Auctex ya que uso flyspell. Este error también se mencionó en la documentación. ¡Gracias!

Bono ¡
Me alegra saber de la documentación, aunque no está muy claro cómo, que uno puede agregar uno o más diccionarios definidos por el usuario! Intenté esto y funcionó bien.

agregue estas dos líneas justo después de la require-auto-completelínea de arriba:

(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  

Ahora en su .txtarchivo agregue sus candidatos favoritos para completar. Ahórrese de candidatos de menos de 4 letras, ¡no valen la pena! Simplemente ponga palabras de su gusto separadas por un salto de línea o RET.

Ejemplo de los contenidos en el .txtarchivo:

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

¡Disfrute de la finalización automática en LaTeX / AUCTeX con Emacs!


¡Sería bueno si hubiera una elispfunción para tirar cualquier palabra marcada en un búfer mientras escribía en ese .txtdictioinario sobre la marcha y agregarlo sin mucho esfuerzo!
doctorado

6

Como dije en mi comentario anterior, el paquete auto-complete-auctextambién puede resolver el problema. Probé ambos, y ambos funcionan muy bien. Sería bueno comparar la solución de @doctorate y el paquete anterior haciendo capturas de pantalla. Si escribo $\sig$, el código de doctorado da algo como esto

ingrese la descripción de la imagen aquí

y el del paquete auto-complete-auctexda algo como esto

ingrese la descripción de la imagen aquí

Agregado: Debo mencionar que la solución de @giordano también funciona, aquí una captura de pantalla:

ingrese la descripción de la imagen aquí


Creo que auto-completedebería ser el paquete principal, aunque auto-complete-auctexpodría tener algunas características adicionales. Lo intentaré e informaré si es necesario. Gracias
doctorado

2
He instalado el paquete pero no puedo abrir la ventana emergente con las terminaciones ... ¿Cómo lo hiciste? ¿Hay alguna documentación sobre este?
Cuervo

@Raven No estoy seguro de tenerlo "realmente" funcionando. Pero si agrega los pasos clave de TAB que el doctorado dice evitar, presionar TAB hace que funcione (para mí).
Chill2Macht

4

La siguiente es mi auto-completeconfiguración relacionada:

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

Como puede ver, no hay nada especial para AUCTeX, es la configuración estándar de auto-complete. La configuración de ac-mathse describe en su sitio web. Si no lo usa ac-math, la única diferencia sensata con su configuración es (add-to-list 'ac-modes 'latex-mode).


-1: uso package-initialize. Es posible que no le guste, pero no recomiende las malas prácticas como la load-pathgestión manual en sus respuestas.
lunaryorn

2
@lunaryorn No creo que haya recomendado malas prácticas, claramente escribí que es un truco sucio solo para cargar un paquete auxiliar. Intentaré mejorar la respuesta usando package-initializemás tarde de todos modos.
giordano
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.