unix-conf/.emacs.d/elpa/ac-math-20141116.1327/ac-math.el
2016-02-18 14:53:30 +01:00

174 lines
5.8 KiB
EmacsLisp

;;; ac-math.el --- Auto-complete sources for input of mathematical symbols and latex tags
;;
;; Copyright (C) 2011-2013, Vitalie Spinu
;; Author: Vitalie Spinu
;; URL: https://github.com/vitoshka/ac-math
;; Package-Version: 20141116.1327
;; Keywords: latex, auto-complete, Unicode, symbols
;; Version: 1.1
;; Package-Requires: ((auto-complete "1.4") (math-symbol-lists "1.0"))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;; This file is *NOT* part of GNU Emacs.
;;
;; 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, 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; see the file COPYING. If not, write to
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth
;; Floor, Boston, MA 02110-1301, USA.
;;
;; Features that might be required by this library:
;;
;; auto-complete http://cx4a.org/software/auto-complete/
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;; Commentary:
;;
;;
;; This add-on defines three ac-sources for the
;; *[auto-complete](https://github.com/auto-complete)* package:
;;
;; * ac-source-latex-commands - input latex commands
;; * ac-source-math-latex - input math latex tags (by default, active only in math environments in latex modes)
;; * ac-source-math-unicode - input of unicode symbols (by default, active everywhere except math environments)
;;
;; Start math completion by typing the prefix "\" key. Select the completion
;; type RET (`ac-complete`). Completion on TAB (`ac-expand`) is not that great
;; as you will see dummy characters, but it's usable.
;;
;; (See https://github.com/vitoshka/ac-math#readme for more)
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;; Code:
(require 'math-symbol-lists)
(require 'auto-complete)
(defgroup ac-math nil
"Auto completion."
:group 'auto-complete
:prefix "ac-math")
(defcustom ac-math-unicode-in-math-p nil
"Set this to t if unicode in math latex environments is needed."
:group 'ac-math)
(defcustom ac-math-prefix-regexp "\\\\\\(.*\\)"
"Regexp matching the prefix of the ac-math symbol."
:group 'ac-math)
(defvar ac-math--dummy " ")
(defun ac-math--make-candidates (alist &optional unicode)
"Build a list of math symbols ready to be used in ac source.
Each element is a cons cell (SYMB . VALUE) where SYMB is the
string to be displayed during the completion and the VALUE is the
actually value inserted on RET completion. If UNICODE is non-nil
the value of VALUE is the unicode character else it's the latex
command."
(delq nil
(mapcar
#'(lambda (el)
(let* ((symb (substring (nth 1 el) 1))
;; (sep (propertize ac-math--dummy 'display ""))
(sep ac-math--dummy)
(ch (and (nth 2 el) (decode-char 'ucs (nth 2 el))))
(uni-symb (and ch (char-to-string ch)))
(uni-string (concat sep uni-symb)))
(unless (and unicode (null uni-symb))
(cons (concat symb uni-string)
(if unicode
uni-symb
symb)))))
alist)))
(defconst ac-math-symbols-latex
(delete-dups
(append (ac-math--make-candidates math-symbol-list-basic)
(ac-math--make-candidates math-symbol-list-extended)))
"List of math completion candidates.")
(defconst ac-math-symbols-unicode
(delete-dups
(append (ac-math--make-candidates math-symbol-list-basic t)
(ac-math--make-candidates math-symbol-list-extended t)))
"List of math completion candidates.")
(defun ac-math-action-latex (&optional del-backward)
"Function to be used in ac action property.
Deletes the unicode symbol from the end of the completed
string. If DEL-BACKWARD is non-nil, delete the name of the symbol
instead."
(let ((pos (point))
(start-dummy (save-excursion
(re-search-backward ac-math--dummy (point-at-bol) 'no-error)))
(end-dummy (match-end 0))
(inhibit-point-motion-hooks t))
(when start-dummy
(if del-backward
(when end-dummy
(goto-char start-dummy)
(when (re-search-backward ac-math-prefix-regexp)
(delete-region (match-beginning 0) end-dummy))
(forward-word 1))
(delete-region start-dummy (point))))))
(defun ac-math-action-unicode ()
(ac-math-action-latex 'backward))
(defun ac-math-latex-math-face-p ()
(let ((face (get-text-property (point) 'face)))
(if (consp face)
(eq (car face) 'font-latex-math-face)
(eq face 'font-latex-math-face))))
(defun ac-math-candidates-latex ()
(when (ac-math-latex-math-face-p)
ac-math-symbols-latex))
(defun ac-math-candidates-unicode ()
(when (or ac-math-unicode-in-math-p
(not (ac-math-latex-math-face-p)))
ac-math-symbols-unicode))
(defun ac-math-prefix ()
"Return the location of the start of the current symbol.
Uses `ac-math-prefix-regexp'."
(when (re-search-backward ac-math-prefix-regexp (point-at-bol) 'no-error)
(match-beginning 1)))
;;;###autoload
(defvar ac-source-latex-commands
'((candidates . math-symbol-list-latex-commands)
(symbol . "c")
(prefix . ac-math-prefix)))
;;;###autoload
(defvar ac-source-math-latex
'((candidates . ac-math-candidates-latex)
(symbol . "l")
(prefix . ac-math-prefix)
(action . ac-math-action-latex)))
;;;###autoload
(defvar ac-source-math-unicode
'((candidates . ac-math-candidates-unicode)
(symbol . "u")
(prefix . ac-math-prefix)
(action . ac-math-action-unicode)))
(provide 'ac-math)
;;; ac-math.el ends here