Como fazer o preenchimento automático funcionar no modo AucTeX?

11

Quero auto-complete(ac) funcionar quando estiver no AucTeXmodo interno . Eu recebo todos os pacotes do MELPA pela instalação do pacote.

Este é o meu código relevante no init.elarquivo:

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

como você pode ver, embora eu esteja configurando acglobalmente, ele não aparece AucTeX. No entanto, seguindo as instruções deste emacswiki , o acmodo foi exibido na barra de status, AucTeXmas não está funcionando, sem preenchimento automático, digitando caracteres.

Notas O
Emacs 24.4 no Windows 7 32bit e os pacotes foram atualizados.

doutorado
fonte
Seu problema é fazer com que um trabalho em conjunto yasnippet ou sozinho, enquanto estiver no modo LaTex? Neste último caso, eu uso ac com o AUCTeX sem muito trabalho.
Giordano
Primeiro, eu quero me dar acbem auctex. Mencionei yasnippetporque também o uso para ter alguns trechos definidos pelo usuário no látex. Então, até que você forneça seu código, não sei dizer se o yasimpedirá ac.
doctorado
Tom, por favor! Tente yasnippetverificar se o preenchimento automático e o AUCTeX funcionam juntos, como o @giordano sugeriu. Se sim, então o problema está na inclusão de yasnippet. Nesse caso, provavelmente é sua configuração de preenchimento automático.
Dan
Podemos esquecer que yasnippeteu o removi do meu init.el. O problema está provavelmente na configuração de auctexe ac.
doctorate
1
Veja um pacote de Christopher Monsanto github.com/monsanto/auto-complete-auctex . Eu não testei.
Nome

Respostas:

11

Depois de fazer uma longa pesquisa na web e um exame cuidadoso da acdocumentação com várias tentativas em minha máquina para examinar o código linha por linha, eu vim com essa solução que pode yasnippetfuncionar bem (optioinal) sem nenhum conflito.

coloque isso no seu init.elou .emacscuidando da sequência:

(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:
conforme mencionado na documentação de ac, a adição ac-modese os ganchos devem ser feitos antes do carregamento (ac-config-default).

Alguns sugeriram colocar algum código para tocar com a TABtecla que eu não precisava e não recomendo, pois de alguma forma destruirá outra coisa mais tarde. No entanto, vi pessoas colocar algo assim no final, pouco antes global-auto-complete:

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

Até eu adicionar o (ac-flyspell-workaround)preenchimento automático, era muito lento para pensar em usá-lo no Auctex desde que eu use o flyspell. Este bug também foi mencionado na documentação. Obrigado!

Bônus
Fiquei feliz em saber da documentação, embora não seja muito claro como, que se pode adicionar um (s) dicionário (s) definido pelo usuário! Eu tentei isso e funcionou bem.

adicione estas duas linhas logo após a require-auto-completelinha acima:

(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  

Agora, no seu .txtarquivo, adicione seus candidatos favoritos para conclusão. Salve-se de candidatos com menos de 4 letras, eles não valem a pena! Basta colocar palavras do seu gosto separadas por um feed de linha ou RET.

Exemplo do conteúdo do .txtarquivo:

inconsistencies
[email protected]
do-not-put-your-password-here
long-line-in-any-programming-language-of-your-like

Aproveite o preenchimento automático no LaTeX / AUCTeX com o Emacs!

doutorado
fonte
seria bom se houvesse uma elispfunção para lançar qualquer palavra marcada em um buffer enquanto escrevia naquele .txtdictioinary on-the-fly e anexá-lo sem muito esforço!
doutorado
6

Como eu disse no meu comentário acima, o pacote auto-complete-auctextambém pode resolver o problema. Eu testei os dois, e ambos funcionam bem. Seria bom comparar a solução do @doctorate e o pacote acima dando capturas de tela. Se eu escrever $\sig$, o código de doutorado dá algo assim

insira a descrição da imagem aqui

e o do pacote auto-complete-auctexdá algo assim

insira a descrição da imagem aqui

Adicionado: devo mencionar que a solução do @giordano também funciona, aqui está uma captura de tela:

insira a descrição da imagem aqui

Nome
fonte
Eu acho que auto-completedeveria ser o pacote principal, embora auto-complete-auctexpossa ter alguns recursos extras. Vou tentar e relatar se necessário. Obrigado
doutorado
2
Instalei o pacote, mas não consigo abrir o pop-up com as conclusões ... Como você o fez e há alguma documentação sobre este?
Raven
@ Ravena Não tenho certeza se tenho "realmente" funcionando. Mas se você adicionar as etapas da tecla TAB que o doutorado disse para evitar, pressionar TAB fará com que funcione (para mim).
Chill2Macht 27/02
4

A seguir está minha auto-completeconfiguração 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 você pode ver, não há nada de especial para o AUCTeX, é a configuração padrão do auto-complete. A configuração para ac-mathé descrita em seu site. Se você não usar ac-math, a única diferença sensata com sua configuração é (add-to-list 'ac-modes 'latex-mode).

Giordano
fonte
-1: use package-initialize. Você pode não gostar, mas não recomende práticas ruins, como load-pathgerenciamento manual , em suas respostas.
lunaryorn
2
@ lunaryorn Eu não acho que recomendei más práticas, escrevi claramente que é um truque sujo apenas para carregar um pacote auxiliar. Vou tentar melhorar a resposta usando package-initializemais tarde de qualquer maneira.
Giordano