Permalink
Browse files

Initial commit.

  • Loading branch information...
0 parents commit 9ff50aa0b7d066ee04fe58a769e60a0604d913f7 @monsanto committed Jul 5, 2012
Showing with 247 additions and 0 deletions.
  1. +247 −0 auto-complete-auctex.el
@@ -0,0 +1,247 @@
+;;; auto-complete-auctex.el --- auto-completion for auctex
+
+;; Copyright (C) 2012 Christopher Monsanto
+
+;; Author: Christopher Monsanto <chris@monsan.to>
+;; Version: 1.0
+
+;; 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
+
+
+
+
+
+

0 comments on commit 9ff50aa

Please sign in to comment.