Як зробити автоматичне завершення роботи в режимі 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 і пакети були оновлені.


Ваша проблема полягає в тому, щоб змінна робота працювала разом ясніппетом або просто окремо, перебуваючи в режимі LaTex? В останньому випадку я використовую ac з AUCTeX без особливої ​​роботи.
giordano

По-перше, мені хочеться acдобре попрацювати auctex. Я згадав, yasnippetтому що я також використовую його, щоб мати деякі визначені користувачем фрагменти в латексі. Тож поки ви не вкажете свій код, я не можу сказати, чи yasвдасться перешкодити ac.
докторантура

Тон, будь ласка! Спробуйте вийняти, yasnippetщоб перевірити, чи працюють автозаповнення та AUCTeX разом, як запропонував @giordano. Якщо так, то проблема полягає у включенні yasnippet. Якщо це так, це, ймовірно, ваше автозавершення налаштування.
Дан

Ми можемо забути про те, що yasnippetя видалив його з init.el. Проблема, швидше за все, полягає в налаштуванні auctexта ac.
докторантура

1
Дивіться пакет від Christopher Monsanto 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також може вирішити проблему. Я тестував і те, і вони обоє добре працюють. Було б непогано порівняти рішення @doktora та вищевказаний пакет, даючи знімки екрана. Якщо я напишу $\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у своїх відповідях поганих практик, таких як ручне управління.
місячник

2
@lunaryorn Я не думаю, що я рекомендував погану практику, я чітко написав, що це брудна хакерство просто для завантаження допоміжного пакету. Я спробую все-таки покращити відповідь, використовуючи package-initializeпізніше.
giordano
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.