Как заставить автозаполнение работать в режиме AucTeX?

11

Я хочу auto-complete(AC) работать, когда я нахожусь в AucTeXрежиме. Я получаю все пакеты от MELPA путем установки пакета.

Это мой соответствующий код в init.elфайле:

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

как вы можете видеть, хотя я устанавливаю acглобально, он не появляется в AucTeX. Тем не менее, следуя инструкциям в этом emacswiki , acрежим отображался в строке состояния, AucTeXно не работал, без автозаполнения при наборе символов.

Заметки
Emacs 24.4 под Windows 7 32bit и пакеты были обновлены.

докторская степень
источник
Ваша проблема в том, чтобы заставить работать переменную вместе yasnippet или просто в одиночку, находясь в режиме LaTex? В последнем случае я использую AC с AUCTeX без особой работы.
Джордано
Во-первых, я хочу acпреуспеть с auctex. Я упомянул, yasnippetпотому что я также использую это, чтобы иметь некоторые пользовательские фрагменты в латексе. Поэтому, пока вы не предоставите свой код, я не могу сказать, yasбудет ли мешать ac.
докторская степень
Тон, пожалуйста! Попробуйте выяснить, yasnippetработают ли autocomplete и AUCTeX вместе, как предложено @giordano. Если да, то проблема с включением yasnippet. Если это так, это, вероятно, ваша настройка автозаполнения.
Дан
Мы можем забыть о том, что yasnippetя удалил его из моего init.el. Проблема, скорее всего, в настройке auctexи ac.
докторская степень
1
Посмотреть пакет Кристофера Монсанто github.com/monsanto/auto-complete-auctex . Я не проверял это.
Имя

Ответы:

11

После долгих исследований в интернете и тщательного изучения acдокументации на моей машине, чтобы построчно проверять код, я пришел к этому решению, которое также может yasnippetработать (опционально) без каких-либо конфликтов.

Поместите это в вашу последовательность init.elили .emacsпозаботьтесь о последовательности:

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

Примечания:
как указано в документации о ac, добавление к ac-modesи крюкам должны быть сделаны перед загрузкой (ac-config-default).

Некоторые предлагали использовать какой-то код для игры с TABключом, который мне не нужен, и не рекомендуют, так как это позже как-то разрушит что-то еще. Тем не менее, я видел, как люди ставили что-то вроде этого в конце как раз перед global-auto-complete:

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

Пока я не добавил (ac-flyspell-workaround)автозаполнение, было слишком медленно думать об его использовании в Auctex, так как я использую flyspell. Эта ошибка также упоминалась в документации. Спасибо!

Бонус
Я был рад узнать из документации, хотя не очень ясно, как, что можно добавить пользовательский словарь (и)! Я попробовал это и работал хорошо.

добавьте эти две строки сразу после require-auto-completeстроки выше:

(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  

Теперь в вашем .txtфайле добавьте ваших любимых кандидатов для завершения. Спасите себя от кандидатов длиной менее 4 букв, они того не стоят! Проще говоря, слова, которые вам нравятся, разделяются переводом строки или RET.

Пример содержимого в .txtфайле:

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

Наслаждайтесь автозаполнением в LaTeX / AUCTeX с Emacs!

докторская степень
источник
было бы неплохо, если бы была elispфункция, которая .txtбросала бы любое помеченное слово в буфер во время записи в эту диктовку на лету и добавляла его без особых усилий!
докторская степень
6

Как я уже сказал в моем комментарии выше, пакет auto-complete-auctexтакже может решить проблему. Я проверил оба, и они оба работают хорошо. Было бы неплохо сравнить решение @doctorate и вышеприведенного пакета, сделав скриншоты. Если я напишу $\sig$, код докторантуры приведу примерно так

введите описание изображения здесь

и что из пакета auto-complete-auctexдает что-то вроде этого

введите описание изображения здесь

Добавлено: Я должен упомянуть, что решение @giordano также работает, вот снимок экрана:

введите описание изображения здесь

название
источник
Я думаю, что auto-completeдолжен быть основной пакет, хотя auto-complete-auctexможет иметь некоторые дополнительные функции. Я попробую и сообщу при необходимости. Спасибо
докторская степень
2
Я установил пакет, но не могу открыть всплывающее окно с дополнениями ... Как вы это сделали и есть ли какая-нибудь документация по этому вопросу?
Ворон
@Raven Я не уверен, что у меня это "действительно" работает. Но если вы добавите в TAB ключевые шаги, которые, как сказал доктор, следует избегать, нажатие клавиши TAB заставит его работать (для меня).
Chill2Macht
4

Следующее - моя auto-completeсвязанная конфигурация:

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

Как видите, для AUCTeX нет ничего особенного, это стандартная конфигурация auto-complete. Конфигурация для ac-mathописана на его веб-сайте. Если вы не используете ac-math, единственная разумная разница с вашей конфигурацией (add-to-list 'ac-modes 'latex-mode).

Джордано
источник
-1: использовать package-initialize. Возможно, вам это не понравится, но, пожалуйста, не рекомендуйте load-pathв своих ответах плохие практики, такие как ручное управление.
lunaryorn
2
@lunaryorn Я не думаю, что рекомендую плохие методы, я ясно написал, что это грязный хак, просто загрузить вспомогательный пакет. Я постараюсь улучшить ответ, используя package-initializeпозже в любом случае.
Джордано