Permalink
Find file
c403915 Jan 23, 2014
@monsanto @purcell
244 lines (196 sloc) 7.23 KB
;;; auto-complete-auctex.el --- auto-completion for auctex
;; Copyright (C) 2012 Christopher Monsanto
;; Author: Christopher Monsanto <chris@monsan.to>
;; Version: 1.0
;; Package-Requires: ((yasnippet "0.6.1") (auto-complete "1.4"))
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; You can install this by (require 'auto-complete-auctex).
;; Feel free to contribute better documentation!
;;; Code:
(require 'tex)
(require 'latex)
(eval-when-compile
(require 'auto-complete)
(require 'yasnippet))
(defvar ac-auctex-arg-lookup-table
'((TeX-arg-define-macro . ("\\MacroName"))
(TeX-arg-counter . ("Counter"))
(TeX-arg-define-counter . ("\\CounterName"))
(TeX-arg-file . ("Filename"))
(TeX-arg-bibliography . ("Filename"))
(TeX-arg-bibstyle . ("Style"))
(TeX-arg-environment . ("Environment"))
(TeX-arg-define-environment . ("EnvironmentName"))
(TeX-arg-size . ("(w, h)"))
(TeX-arg-ref . ("Name"))
(TeX-arg-index . ("Index"))
(TeX-arg-define-label . ("Label"))
(LaTeX-arg-usepackage . (["opt1,..."] "Package"))
(LaTeX-env-label . nil)
(LaTeX-amsmath-env-aligned . (["htbp!"]))
(LaTeX-amsmath-env-alignat . (["# Columns"]))
(LaTeX-env-array . (["bct"] "lcrpmb|"))
(LaTeX-env-item . nil)
(LaTeX-env-document . nil)
(LaTeX-env-figure . (["htbp!"]))
(LaTeX-env-contents . ("Filename"))
(LaTeX-env-minipage . (["htbp!"] "Width"))
(LaTeX-env-list . ("Label" "\\itemsep,\\labelsep,..."))
(LaTeX-env-picture . ("(w, h)" "(x, y)"))
(LaTeX-env-tabular* . ("Width" ["htbp!"] "lcrpmb|><"))
(LaTeX-env-bib . ("WidestLabel"))
(TeX-arg-conditional . ([""]))
(2 . ("" ""))
(3 . ("" "" ""))
(4 . ("" "" "" ""))
(5 . ("" "" "" "" ""))
(6 . ("" "" "" "" "" ""))
(7 . ("" "" "" "" "" "" ""))
(8 . ("" "" "" "" "" "" "" ""))
(9 . ("" "" "" "" "" "" "" "" "")))
"Anything not in this table defaults to '(\"\")")
(defun ac-auctex-expand-arg-info (arg-info)
(loop for item in arg-info
append (cond
((or (stringp item) (and (vectorp item) (stringp (elt item 0))))
(list item))
((vectorp item)
(loop for item-2 in (or (assoc-default (or (car-safe (elt item 0)) (elt item 0))
ac-auctex-arg-lookup-table 'equal) '(""))
collect [item-2]))
(t
(or (assoc-default (or (car-safe item) item) ac-auctex-arg-lookup-table) '(""))))))
(defun ac-auctex-snippet-arg (n arg)
(let* ((opt (vectorp arg))
(item (if opt (elt arg 0) arg))
(m (if (vectorp arg) (1+ n) n))
(var (format "${%s}" item)))
(list (1+ m)
(if opt
(concat (format "${[") var "]}")
(concat "{" var "}")))))
;; Macros
;;
(defun ac-auctex-expand-args (str env)
(yas/expand-snippet (ac-auctex-macro-snippet (assoc-default str env))))
(defun ac-auctex-macro-snippet (arg-info)
(let ((count 1))
(apply 'concat (loop for item in (ac-auctex-expand-arg-info arg-info)
collect (destructuring-bind (n val)
(ac-auctex-snippet-arg count item)
(setq count n)
val)))))
(defun ac-auctex-macro-candidates ()
(let ((comlist (if TeX-symbol-list
(mapcar (lambda (item)
(or (car-safe (car item)) (car item)))
TeX-symbol-list))))
(all-completions ac-prefix comlist)))
(defun ac-auctex-macro-action ()
(yas/expand-snippet (ac-auctex-macro-snippet (assoc-default candidate TeX-symbol-list))))
(ac-define-source auctex-macros
'((init . TeX-symbol-list)
(candidates . ac-auctex-macro-candidates)
(action . ac-auctex-macro-action)
(requires . 0)
(symbol . "m")
(prefix . "\\\\\\([a-zA-Z]*\\)\\=")))
;; Symbols
;;
(defun ac-auctex-symbol-candidates ()
(all-completions ac-prefix (mapcar 'cadr LaTeX-math-default)))
(defun ac-auctex-symbol-action ()
(re-search-backward candidate)
(delete-region (1- (match-beginning 0)) (match-end 0))
(if (texmathp)
(progn
(insert "\\" candidate)
(yas/expand-snippet (ac-auctex-macro-snippet (assoc-default candidate TeX-symbol-list))))
(insert "$\\" candidate "$")
(backward-char)
(yas/expand-snippet (ac-auctex-macro-snippet (assoc-default candidate TeX-symbol-list)))))
(defun ac-auctex-symbol-document (c)
(let* ((cl (assoc c (mapcar 'cdr LaTeX-math-default)))
(decode (if (nth 2 cl) (char-to-string (decode-char 'ucs (nth 2 cl))) ""))
(st (nth 1 cl))
(hs (if (listp st) (mapconcat 'identity st " ") st)))
(and decode (concat hs " == " decode))))
(ac-define-source auctex-symbols
'((init . LaTeX-math-mode)
(candidates . ac-auctex-symbol-candidates)
(document . ac-auctex-symbol-document)
(action . ac-auctex-symbol-action)
(requires . 0)
(symbol . "s")
(prefix . "\\\\\\([a-zA-Z]*\\)\\=")))
;; Environments
;;
(defvar ac-auctex-environment-prefix "beg")
(defun ac-auctex-environment-candidates ()
(let ((envlist (mapcar (lambda (item) (concat ac-auctex-environment-prefix (car item)))
LaTeX-environment-list)))
(all-completions ac-prefix envlist)))
(defun ac-auctex-environment-action ()
(re-search-backward candidate)
(delete-region (1- (match-beginning 0)) (match-end 0))
(let ((candidate (substring candidate (length ac-auctex-environment-prefix))))
(yas/expand-snippet (format "\\begin{%s}%s\n$0\n\\end{%s}"
candidate
(ac-auctex-macro-snippet (assoc-default candidate LaTeX-environment-list))
candidate))))
(ac-define-source auctex-environments
'((init . LaTeX-environment-list)
(candidates . ac-auctex-environment-candidates)
(action . ac-auctex-environment-action)
(requires . 0)
(symbol . "e")
(prefix . "\\\\\\([a-zA-Z]*\\)\\=")))
;; Refs
;;
(defun ac-auctex-label-candidates ()
(all-completions ac-prefix (mapcar 'car LaTeX-label-list)))
(ac-define-source auctex-labels
'((init . LaTeX-label-list)
(candidates . ac-auctex-label-candidates)
(requires . 0)
(symbol . "r")
(prefix . "\\\\ref{\\([^}]*\\)\\=")))
;; Bibs
;;
(defun ac-auctex-bib-candidates ()
(all-completions ac-prefix (mapcar 'car LaTeX-bibitem-list)))
(ac-define-source auctex-bibs
`((init . LaTeX-bibitem-list)
(candidates . ac-auctex-bib-candidates)
(requires . 0)
(symbol . "b")
(prefix . ,(concat "\\\\cite"
"\\(?:"
"\\[[^]]*\\]"
"\\)?"
"{\\([^},]*\\)"
"\\="))))
;; Setup
;;
(defun ac-auctex-setup ()
(setq ac-sources (append
'(ac-source-auctex-symbols
ac-source-auctex-macros
ac-source-auctex-environments
ac-source-auctex-labels
ac-source-auctex-bibs)
ac-sources)))
(add-to-list 'ac-modes 'latex-mode)
(add-hook 'LaTeX-mode-hook 'ac-auctex-setup)
(provide 'auto-complete-auctex)
;;; auto-complete-auctex.el ends here