Bagaimana cara menyelesaikan otomatis dalam mode AucTeX?

11

Saya ingin auto-complete(ac) bekerja ketika saya berada di dalam AucTeXmode. Saya mendapatkan semua paket dari MELPA dengan instalasi paket.

Ini adalah kode saya yang relevan dalam init.elfile:

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

seperti yang Anda lihat, meskipun saya menetapkan acsecara global itu tidak muncul di AucTeX. Namun, dengan mengikuti instruksi dalam emacswiki ini , acmode ditampilkan di bilah status AucTeXtetapi tidak berfungsi, tidak ada penyelesaian otomatis dengan mengetikkan karakter.

Notes
Emacs 24.4 di bawah Windows 7 32bit dan paket diperbarui.

gelar doktor
sumber
Masalah Anda adalah membuat ac bekerja bersama-sama yasnippet atau sendirian, saat dalam mode LaTex? Dalam kasus terakhir, saya menggunakan ac dengan AUCTeX tanpa banyak pekerjaan.
giordano
1st, saya ingin acmelakukannya dengan baik auctex. Saya sebutkan yasnippetkarena saya juga menggunakannya untuk memiliki snippet yang ditentukan pengguna dalam lateks. Jadi sampai Anda memberikan kode Anda, saya tidak tahu apakah yasakan menghalangi ac.
gelar doktor
Nada, kumohon! Cobalah yasnippetuntuk melihat apakah autocomplete dan AUCTeX bekerja bersama seperti yang disarankan @giordano. Jika ya, maka masalahnya adalah dengan dimasukkannya yasnippet. Jika demikian, mungkin pengaturan autocomplete Anda.
Dan
Kita bisa melupakan bahwa yasnippetsaya menghapusnya dari init.el. Masalahnya paling mungkin dalam pengaturan auctexdan ac.
gelar doktor
1
Lihat paket oleh Christopher Monsanto github.com/monsanto/auto-complete-auctex . Saya belum mengujinya.
Nama

Jawaban:

11

Setelah melakukan riset panjang di web dan memeriksa acdokumentasi dengan hati-hati dengan banyak uji coba di mesin saya untuk memeriksa kode baris demi baris, saya menemukan solusi ini yang bisa yasnippetberfungsi dengan baik (optioinal) tanpa konfik.

letakkan ini di init.elatau .emacsatur urutannya:

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

Catatan:
seperti yang disebutkan dalam dokumentasi dari ac, yang menambah ac-modesdan kait harus dilakukan sebelum pemuatan (ac-config-default).

Beberapa menyarankan untuk meletakkan beberapa kode untuk bermain dengan TABkunci yang saya tidak perlu dan tidak merekomendasikan karena entah bagaimana akan menghancurkan sesuatu yang lain nanti. Namun, saya melihat orang-orang meletakkan sesuatu seperti ini di ujung sebelum global-auto-complete:

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

Sampai saya menambahkan (ac-flyspell-workaround)penyelesaian otomatis terlalu lambat untuk berpikir untuk menggunakannya di Auctex karena saya menggunakan flyspell. Bug ini juga disebutkan dalam dokumentasi. Terima kasih!

Bonus
saya senang mengetahui dari dokumentasi, meskipun tidak begitu jelas bagaimana, bahwa seseorang dapat menambahkan kamus yang ditentukan pengguna! Saya mencoba ini dan bekerja dengan baik.

tambahkan dua baris ini tepat setelah require-auto-completebaris di atas:

(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  

Sekarang di .txtfile Anda, tambahkan kandidat favorit Anda untuk penyelesaian. Selamatkan diri Anda dari kandidat yang panjangnya kurang dari 4 huruf, mereka tidak layak! Sederhananya kata-kata seperti Anda dipisahkan oleh umpan baris atau RET.

Contoh konten dalam .txtfile:

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

Nikmati pelengkapan otomatis di LaTeX / AUCTeX dengan Emacs!

gelar doktor
sumber
alangkah baiknya jika akan ada elispfungsi untuk membuang kata yang ditandai di buffer sambil menulis ke dalam .txtdiktio itu dengan cepat dan menambahkannya tanpa banyak usaha!
doktoral
6

Seperti yang saya katakan di komentar saya di atas, paket itu auto-complete-auctexjuga dapat menyelesaikan masalah. Saya menguji keduanya, dan keduanya bekerja dengan baik. Akan lebih baik untuk membandingkan solusi @doctorate dan paket di atas dengan memberikan screenshot. Jika saya menulis $\sig$, kode doktor memberi sesuatu seperti ini

masukkan deskripsi gambar di sini

dan paket auto-complete-auctexmemberikan sesuatu seperti ini

masukkan deskripsi gambar di sini

Ditambahkan: Saya harus menyebutkan bahwa solusi @giordano juga berfungsi, berikut screenshot:

masukkan deskripsi gambar di sini

Nama
sumber
Saya pikir auto-completeharus menjadi paket utama sementara auto-complete-auctexmungkin memiliki beberapa fitur tambahan. Saya akan mencobanya dan melaporkan jika perlu. Terima kasih
doktoral
2
Saya telah menginstal paket tetapi saya tidak dapat membuka popup dengan kelengkapannya ... Bagaimana Anda melakukannya dan apakah ada dokumentasi yang satu ini?
Raven
@Raven Saya tidak yakin saya "benar-benar" bekerja Tetapi jika Anda menambahkan dalam langkah-langkah kunci TAB yang dikatakan doktor untuk menghindari, menekan TAB membuatnya bekerja (untuk saya).
Chill2Macht
4

Berikut ini adalah auto-completekonfigurasi terkait saya :

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

Seperti yang Anda lihat, tidak ada yang spesial untuk AUCTeX, ini adalah konfigurasi standar auto-complete. Konfigurasi untuk ac-mathdijelaskan di situs webnya. Jika Anda tidak menggunakan ac-math, satu-satunya perbedaan yang masuk akal dengan konfigurasi Anda adalah (add-to-list 'ac-modes 'latex-mode).

giordano
sumber
-1: Gunakan package-initialize. Anda mungkin tidak menyukainya, tapi tolong jangan rekomendasikan praktik buruk seperti load-pathmanajemen manual dalam jawaban Anda.
lunaryorn
2
@Lunaryorn Saya tidak berpikir saya merekomendasikan praktik buruk, saya jelas menulis ini adalah hack kotor hanya untuk memuat paket tambahan. Saya akan mencoba meningkatkan jawabannya package-initializenanti.
giordano