;;; auto-complete-config.el --- auto-complete additional configuations
|
|
|
|
;; Copyright (C) 2009, 2010 Tomohiro Matsuyama
|
|
|
|
;; Author: Tomohiro Matsuyama <m2ym.pub@gmail.com>
|
|
;; Keywords: convenience
|
|
;; Version: 1.5.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:
|
|
|
|
;;
|
|
|
|
;;; Code:
|
|
|
|
(require 'cl-lib)
|
|
(require 'auto-complete)
|
|
|
|
(declare-function semantic-analyze-current-context "semantic/analyze")
|
|
(declare-function semantic-tag-class "semantic/tag")
|
|
(declare-function semantic-tag-function-arguments "semantic/tag")
|
|
(declare-function semantic-format-tag-type "semantic/format")
|
|
(declare-function semantic-format-tag-name "semantic/format")
|
|
(declare-function yas-expand-snippet "yasnippet")
|
|
(declare-function oref "eieio" (obj slot))
|
|
|
|
|
|
|
|
;;;; Additional sources
|
|
|
|
;; imenu
|
|
|
|
(defvar ac-imenu-index nil)
|
|
|
|
(ac-clear-variable-every-10-minutes 'ac-imenu-index)
|
|
|
|
(defun ac-imenu-candidates ()
|
|
(cl-loop with i = 0
|
|
with stack = (progn
|
|
(unless (local-variable-p 'ac-imenu-index)
|
|
(make-local-variable 'ac-imenu-index))
|
|
(or ac-imenu-index
|
|
(setq ac-imenu-index
|
|
(ignore-errors
|
|
(with-no-warnings
|
|
(imenu--make-index-alist))))))
|
|
with result
|
|
while (and stack (or (not (integerp ac-limit))
|
|
(< i ac-limit)))
|
|
for node = (pop stack)
|
|
if (consp node)
|
|
do
|
|
(let ((car (car node))
|
|
(cdr (cdr node)))
|
|
(if (consp cdr)
|
|
(mapc (lambda (child)
|
|
(push child stack))
|
|
cdr)
|
|
(when (and (stringp car)
|
|
(string-match (concat "^" (regexp-quote ac-prefix)) car))
|
|
;; Remove extra characters
|
|
(if (string-match "^.*\\(()\\|=\\|<>\\)$" car)
|
|
(setq car (substring car 0 (match-beginning 1))))
|
|
(push car result)
|
|
(cl-incf i))))
|
|
finally return (nreverse result)))
|
|
|
|
(ac-define-source imenu
|
|
'((depends imenu)
|
|
(candidates . ac-imenu-candidates)
|
|
(symbol . "s")))
|
|
|
|
;; gtags
|
|
|
|
(defface ac-gtags-candidate-face
|
|
'((t (:inherit ac-candidate-face :foreground "navy")))
|
|
"Face for gtags candidate"
|
|
:group 'auto-complete)
|
|
|
|
(defface ac-gtags-selection-face
|
|
'((t (:inherit ac-selection-face :background "navy")))
|
|
"Face for the gtags selected candidate."
|
|
:group 'auto-complete)
|
|
|
|
(defun ac-gtags-candidate ()
|
|
(ignore-errors
|
|
(split-string (shell-command-to-string (format "global -ciq %s" ac-prefix)) "\n")))
|
|
|
|
(ac-define-source gtags
|
|
'((candidates . ac-gtags-candidate)
|
|
(candidate-face . ac-gtags-candidate-face)
|
|
(selection-face . ac-gtags-selection-face)
|
|
(requires . 3)
|
|
(symbol . "s")))
|
|
|
|
;; yasnippet
|
|
|
|
(defface ac-yasnippet-candidate-face
|
|
'((t (:inherit ac-candidate-face
|
|
:background "sandybrown" :foreground "black")))
|
|
"Face for yasnippet candidate."
|
|
:group 'auto-complete)
|
|
|
|
(defface ac-yasnippet-selection-face
|
|
'((t (:inherit ac-selection-face :background "coral3")))
|
|
"Face for the yasnippet selected candidate."
|
|
:group 'auto-complete)
|
|
|
|
(defun ac-yasnippet-table-hash (table)
|
|
(cond
|
|
((fboundp 'yas/snippet-table-hash)
|
|
(yas/snippet-table-hash table))
|
|
((fboundp 'yas/table-hash)
|
|
(yas/table-hash table))))
|
|
|
|
(defun ac-yasnippet-table-parent (table)
|
|
(cond
|
|
((fboundp 'yas/snippet-table-parent)
|
|
(yas/snippet-table-parent table))
|
|
((fboundp 'yas/table-parent)
|
|
(yas/table-parent table))))
|
|
|
|
(defun ac-yasnippet-candidate-1 (table)
|
|
(with-no-warnings
|
|
(let ((hashtab (ac-yasnippet-table-hash table))
|
|
(parent (ac-yasnippet-table-parent table))
|
|
candidates)
|
|
(maphash (lambda (key value)
|
|
(push key candidates))
|
|
hashtab)
|
|
(setq candidates (all-completions ac-prefix (nreverse candidates)))
|
|
(if parent
|
|
(setq candidates
|
|
(append candidates (ac-yasnippet-candidate-1 parent))))
|
|
candidates)))
|
|
|
|
(defun ac-yasnippet-candidates ()
|
|
(with-no-warnings
|
|
(cond (;; 0.8 onwards
|
|
(fboundp 'yas-active-keys)
|
|
(all-completions ac-prefix (yas-active-keys)))
|
|
(;; >0.6.0
|
|
(fboundp 'yas/get-snippet-tables)
|
|
(apply 'append (mapcar 'ac-yasnippet-candidate-1
|
|
(condition-case nil
|
|
(yas/get-snippet-tables major-mode)
|
|
(wrong-number-of-arguments
|
|
(yas/get-snippet-tables)))))
|
|
)
|
|
(t
|
|
(let ((table
|
|
(if (fboundp 'yas/snippet-table)
|
|
;; <0.6.0
|
|
(yas/snippet-table major-mode)
|
|
;; 0.6.0
|
|
(yas/current-snippet-table))))
|
|
(if table
|
|
(ac-yasnippet-candidate-1 table)))))))
|
|
|
|
(ac-define-source yasnippet
|
|
'((depends yasnippet)
|
|
(candidates . ac-yasnippet-candidates)
|
|
(action . yas/expand)
|
|
(candidate-face . ac-yasnippet-candidate-face)
|
|
(selection-face . ac-yasnippet-selection-face)
|
|
(symbol . "a")))
|
|
|
|
;; semantic
|
|
|
|
(defun ac-semantic-candidates (prefix)
|
|
(with-no-warnings
|
|
(delete "" ; semantic sometimes returns an empty string
|
|
(mapcar (lambda (elem)
|
|
(cons (semantic-tag-name elem)
|
|
(semantic-tag-clone elem)))
|
|
(ignore-errors
|
|
(or (semantic-analyze-possible-completions
|
|
(semantic-analyze-current-context))
|
|
(senator-find-tag-for-completion prefix)))))))
|
|
|
|
(defun ac-semantic-doc (symbol)
|
|
(with-no-warnings
|
|
(let* ((proto (semantic-format-tag-summarize-with-file symbol nil t))
|
|
(doc (semantic-documentation-for-tag symbol))
|
|
(res proto))
|
|
(when doc
|
|
(setq res (concat res "\n\n" doc)))
|
|
res)))
|
|
|
|
(defun ac-semantic-action ()
|
|
(when (and (boundp 'yas-minor-mode) yas-minor-mode)
|
|
(let* ((tag (car (last (oref (semantic-analyze-current-context) prefix))))
|
|
(class (semantic-tag-class tag))
|
|
(args))
|
|
(when (eq class 'function)
|
|
(setq args (semantic-tag-function-arguments tag))
|
|
(yas-expand-snippet
|
|
(concat "("
|
|
(mapconcat
|
|
(lambda (arg)
|
|
(let ((arg-type (semantic-format-tag-type arg nil))
|
|
(arg-name (semantic-format-tag-name arg nil)))
|
|
(concat "${"
|
|
(if (string= arg-name "")
|
|
arg-type
|
|
(concat arg-type " " arg-name))
|
|
"}")))
|
|
args
|
|
", ")
|
|
")$0"))))))
|
|
|
|
(ac-define-source semantic
|
|
'((available . (or (require 'semantic-ia nil t)
|
|
(require 'semantic/ia nil t)))
|
|
(candidates . (ac-semantic-candidates ac-prefix))
|
|
(document . ac-semantic-doc)
|
|
(action . ac-semantic-action)
|
|
(prefix . cc-member)
|
|
(requires . 0)
|
|
(symbol . "m")))
|
|
|
|
(ac-define-source semantic-raw
|
|
'((available . (or (require 'semantic-ia nil t)
|
|
(require 'semantic/ia nil t)))
|
|
(candidates . (ac-semantic-candidates ac-prefix))
|
|
(document . ac-semantic-doc)
|
|
(action . ac-semantic-action)
|
|
(symbol . "s")))
|
|
|
|
;; eclim
|
|
|
|
(defun ac-eclim-candidates ()
|
|
(with-no-warnings
|
|
(cl-loop for c in (eclim/java-complete)
|
|
collect (nth 1 c))))
|
|
|
|
(ac-define-source eclim
|
|
'((candidates . ac-eclim-candidates)
|
|
(prefix . c-dot)
|
|
(requires . 0)
|
|
(symbol . "f")))
|
|
|
|
;; css
|
|
|
|
;; Copied from company-css.el
|
|
(defconst ac-css-property-alist
|
|
;; see http://www.w3.org/TR/CSS21/propidx.html
|
|
'(("azimuth" angle "left-side" "far-left" "left" "center-left" "center"
|
|
"center-right" "right" "far-right" "right-side" "behind" "leftwards"
|
|
"rightwards")
|
|
("background" background-color background-image background-repeat
|
|
background-attachment background-position)
|
|
("background-attachment" "scroll" "fixed")
|
|
("background-color" color "transparent")
|
|
("background-image" uri "none")
|
|
("background-position" percentage length "left" "center" "right" percentage
|
|
length "top" "center" "bottom" "left" "center" "right" "top" "center"
|
|
"bottom")
|
|
("background-repeat" "repeat" "repeat-x" "repeat-y" "no-repeat")
|
|
("border" border-width border-style border-color)
|
|
("border-bottom" border)
|
|
("border-bottom-color" border-color)
|
|
("border-bottom-style" border-style)
|
|
("border-bottom-width" border-width)
|
|
("border-collapse" "collapse" "separate")
|
|
("border-color" color "transparent")
|
|
("border-left" border)
|
|
("border-left-color" border-color)
|
|
("border-left-style" border-style)
|
|
("border-left-width" border-width)
|
|
("border-right" border)
|
|
("border-right-color" border-color)
|
|
("border-right-style" border-style)
|
|
("border-right-width" border-width)
|
|
("border-spacing" length length)
|
|
("border-style" border-style)
|
|
("border-top" border)
|
|
("border-top-color" border-color)
|
|
("border-top-style" border-style)
|
|
("border-top-width" border-width)
|
|
("border-width" border-width)
|
|
("bottom" length percentage "auto")
|
|
("caption-side" "top" "bottom")
|
|
("clear" "none" "left" "right" "both")
|
|
("clip" shape "auto")
|
|
("color" color)
|
|
("content" "normal" "none" string uri counter "attr()" "open-quote"
|
|
"close-quote" "no-open-quote" "no-close-quote")
|
|
("counter-increment" identifier integer "none")
|
|
("counter-reset" identifier integer "none")
|
|
("cue" cue-before cue-after)
|
|
("cue-after" uri "none")
|
|
("cue-before" uri "none")
|
|
("cursor" uri "*" "auto" "crosshair" "default" "pointer" "move" "e-resize"
|
|
"ne-resize" "nw-resize" "n-resize" "se-resize" "sw-resize" "s-resize"
|
|
"w-resize" "text" "wait" "help" "progress")
|
|
("direction" "ltr" "rtl")
|
|
("display" "inline" "block" "list-item" "run-in" "inline-block" "table"
|
|
"inline-table" "table-row-group" "table-header-group" "table-footer-group"
|
|
"table-row" "table-column-group" "table-column" "table-cell"
|
|
"table-caption" "none")
|
|
("elevation" angle "below" "level" "above" "higher" "lower")
|
|
("empty-cells" "show" "hide")
|
|
("float" "left" "right" "none")
|
|
("font" font-style font-variant font-weight font-size "/" line-height
|
|
font-family "caption" "icon" "menu" "message-box" "small-caption"
|
|
"status-bar")
|
|
("font-family" family-name generic-family)
|
|
("font-size" absolute-size relative-size length percentage)
|
|
("font-style" "normal" "italic" "oblique")
|
|
("font-variant" "normal" "small-caps")
|
|
("font-weight" "normal" "bold" "bolder" "lighter" "100" "200" "300" "400"
|
|
"500" "600" "700" "800" "900")
|
|
("height" length percentage "auto")
|
|
("left" length percentage "auto")
|
|
("letter-spacing" "normal" length)
|
|
("line-height" "normal" number length percentage)
|
|
("list-style" list-style-type list-style-position list-style-image)
|
|
("list-style-image" uri "none")
|
|
("list-style-position" "inside" "outside")
|
|
("list-style-type" "disc" "circle" "square" "decimal" "decimal-leading-zero"
|
|
"lower-roman" "upper-roman" "lower-greek" "lower-latin" "upper-latin"
|
|
"armenian" "georgian" "lower-alpha" "upper-alpha" "none")
|
|
("margin" margin-width)
|
|
("margin-bottom" margin-width)
|
|
("margin-left" margin-width)
|
|
("margin-right" margin-width)
|
|
("margin-top" margin-width)
|
|
("max-height" length percentage "none")
|
|
("max-width" length percentage "none")
|
|
("min-height" length percentage)
|
|
("min-width" length percentage)
|
|
("orphans" integer)
|
|
("outline" outline-color outline-style outline-width)
|
|
("outline-color" color "invert")
|
|
("outline-style" border-style)
|
|
("outline-width" border-width)
|
|
("overflow" "visible" "hidden" "scroll" "auto")
|
|
("padding" padding-width)
|
|
("padding-bottom" padding-width)
|
|
("padding-left" padding-width)
|
|
("padding-right" padding-width)
|
|
("padding-top" padding-width)
|
|
("page-break-after" "auto" "always" "avoid" "left" "right")
|
|
("page-break-before" "auto" "always" "avoid" "left" "right")
|
|
("page-break-inside" "avoid" "auto")
|
|
("pause" time percentage)
|
|
("pause-after" time percentage)
|
|
("pause-before" time percentage)
|
|
("pitch" frequency "x-low" "low" "medium" "high" "x-high")
|
|
("pitch-range" number)
|
|
("play-during" uri "mix" "repeat" "auto" "none")
|
|
("position" "static" "relative" "absolute" "fixed")
|
|
("quotes" string string "none")
|
|
("richness" number)
|
|
("right" length percentage "auto")
|
|
("speak" "normal" "none" "spell-out")
|
|
("speak-header" "once" "always")
|
|
("speak-numeral" "digits" "continuous")
|
|
("speak-punctuation" "code" "none")
|
|
("speech-rate" number "x-slow" "slow" "medium" "fast" "x-fast" "faster"
|
|
"slower")
|
|
("stress" number)
|
|
("table-layout" "auto" "fixed")
|
|
("text-align" "left" "right" "center" "justify")
|
|
("text-decoration" "none" "underline" "overline" "line-through" "blink")
|
|
("text-indent" length percentage)
|
|
("text-transform" "capitalize" "uppercase" "lowercase" "none")
|
|
("top" length percentage "auto")
|
|
("unicode-bidi" "normal" "embed" "bidi-override")
|
|
("vertical-align" "baseline" "sub" "super" "top" "text-top" "middle"
|
|
"bottom" "text-bottom" percentage length)
|
|
("visibility" "visible" "hidden" "collapse")
|
|
("voice-family" specific-voice generic-voice "*" specific-voice
|
|
generic-voice)
|
|
("volume" number percentage "silent" "x-soft" "soft" "medium" "loud"
|
|
"x-loud")
|
|
("white-space" "normal" "pre" "nowrap" "pre-wrap" "pre-line")
|
|
("widows" integer)
|
|
("width" length percentage "auto")
|
|
("word-spacing" "normal" length)
|
|
("z-index" "auto" integer))
|
|
"A list of CSS properties and their possible values.")
|
|
|
|
(defconst ac-css-value-classes
|
|
'((absolute-size "xx-small" "x-small" "small" "medium" "large" "x-large"
|
|
"xx-large")
|
|
(border-style "none" "hidden" "dotted" "dashed" "solid" "double" "groove"
|
|
"ridge" "inset" "outset")
|
|
(color "aqua" "black" "blue" "fuchsia" "gray" "green" "lime" "maroon" "navy"
|
|
"olive" "orange" "purple" "red" "silver" "teal" "white" "yellow"
|
|
"rgb")
|
|
(counter "counter")
|
|
(family-name "Courier" "Helvetica" "Times")
|
|
(generic-family "serif" "sans-serif" "cursive" "fantasy" "monospace")
|
|
(generic-voice "male" "female" "child")
|
|
(margin-width "auto") ;; length percentage
|
|
(relative-size "larger" "smaller")
|
|
(shape "rect")
|
|
(uri "url"))
|
|
"A list of CSS property value classes and their contents.")
|
|
|
|
(defconst ac-css-pseudo-classes
|
|
'("active" "after" "before" "first" "first-child" "first-letter" "first-line"
|
|
"focus" "hover" "lang" "left" "link" "right" "visited")
|
|
"Identifiers for CSS pseudo-elements and pseudo-classes.")
|
|
|
|
(defvar ac-css-property nil
|
|
"Current editing property.")
|
|
|
|
(defun ac-css-prefix ()
|
|
(when (save-excursion (re-search-backward "\\_<\\(.+?\\)\\_>\\s *:[^;]*\\=" nil t))
|
|
(setq ac-css-property (match-string 1))
|
|
(or (ac-prefix-symbol) (point))))
|
|
|
|
(defun ac-css-property-candidates ()
|
|
(let ((list (assoc-default ac-css-property ac-css-property-alist)))
|
|
(if list
|
|
(cl-loop with seen
|
|
with value
|
|
while (setq value (pop list))
|
|
if (symbolp value)
|
|
do (unless (memq value seen)
|
|
(push value seen)
|
|
(setq list
|
|
(append list
|
|
(or (assoc-default value ac-css-value-classes)
|
|
(assoc-default (symbol-name value) ac-css-property-alist)))))
|
|
else collect value)
|
|
ac-css-pseudo-classes)))
|
|
|
|
(ac-define-source css-property
|
|
'((candidates . ac-css-property-candidates)
|
|
(prefix . ac-css-prefix)
|
|
(requires . 0)))
|
|
|
|
;; slime
|
|
(ac-define-source slime
|
|
'((depends slime)
|
|
(candidates . (car (slime-simple-completions ac-prefix)))
|
|
(symbol . "s")
|
|
(cache)))
|
|
|
|
;; ghc-mod
|
|
(ac-define-source ghc-mod
|
|
'((depends ghc)
|
|
(candidates . (ghc-select-completion-symbol))
|
|
(symbol . "s")
|
|
(cache)))
|
|
|
|
|
|
|
|
;;;; Not maintained sources
|
|
|
|
;; ropemacs
|
|
|
|
(defvar ac-ropemacs-loaded nil)
|
|
(defun ac-ropemacs-require ()
|
|
(with-no-warnings
|
|
(unless ac-ropemacs-loaded
|
|
(pymacs-load "ropemacs" "rope-")
|
|
(if (boundp 'ropemacs-enable-autoimport)
|
|
(setq ropemacs-enable-autoimport t))
|
|
(setq ac-ropemacs-loaded t))))
|
|
|
|
(defun ac-ropemacs-setup ()
|
|
(ac-ropemacs-require)
|
|
;(setq ac-sources (append (list 'ac-source-ropemacs) ac-sources))
|
|
(setq ac-omni-completion-sources '(("\\." ac-source-ropemacs))))
|
|
|
|
(defun ac-ropemacs-initialize ()
|
|
(autoload 'pymacs-apply "pymacs")
|
|
(autoload 'pymacs-call "pymacs")
|
|
(autoload 'pymacs-eval "pymacs" nil t)
|
|
(autoload 'pymacs-exec "pymacs" nil t)
|
|
(autoload 'pymacs-load "pymacs" nil t)
|
|
(add-hook 'python-mode-hook 'ac-ropemacs-setup)
|
|
t)
|
|
|
|
(defvar ac-ropemacs-completions-cache nil)
|
|
(defvar ac-source-ropemacs
|
|
'((init
|
|
. (lambda ()
|
|
(setq ac-ropemacs-completions-cache
|
|
(mapcar
|
|
(lambda (completion)
|
|
(concat ac-prefix completion))
|
|
(ignore-errors
|
|
(rope-completions))))))
|
|
(candidates . ac-ropemacs-completions-cache)))
|
|
|
|
;; rcodetools
|
|
|
|
(defvar ac-source-rcodetools
|
|
'((init . (lambda ()
|
|
(require 'rcodetools)
|
|
(condition-case x
|
|
(save-excursion
|
|
(rct-exec-and-eval rct-complete-command-name "--completion-emacs-icicles"))
|
|
(error) (setq rct-method-completion-table nil))))
|
|
(candidates . (lambda ()
|
|
(all-completions
|
|
ac-prefix
|
|
(mapcar
|
|
(lambda (completion)
|
|
(replace-regexp-in-string "\t.*$" "" (car completion)))
|
|
rct-method-completion-table))))))
|
|
|
|
|
|
|
|
;;;; Default settings
|
|
|
|
(defun ac-common-setup ()
|
|
;(add-to-list 'ac-sources 'ac-source-filename)
|
|
)
|
|
|
|
(defun ac-emacs-lisp-mode-setup ()
|
|
(setq ac-sources (append '(ac-source-features ac-source-functions ac-source-yasnippet ac-source-variables ac-source-symbols) ac-sources)))
|
|
|
|
(defun ac-cc-mode-setup ()
|
|
(setq ac-sources (append '(ac-source-yasnippet ac-source-gtags) ac-sources)))
|
|
|
|
(defun ac-ruby-mode-setup ())
|
|
|
|
(defun ac-css-mode-setup ()
|
|
(setq ac-sources (append '(ac-source-css-property) ac-sources)))
|
|
|
|
;;;###autoload
|
|
(defun ac-config-default ()
|
|
(setq-default ac-sources '(ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers))
|
|
(add-hook 'emacs-lisp-mode-hook 'ac-emacs-lisp-mode-setup)
|
|
(add-hook 'c-mode-common-hook 'ac-cc-mode-setup)
|
|
(add-hook 'ruby-mode-hook 'ac-ruby-mode-setup)
|
|
(add-hook 'css-mode-hook 'ac-css-mode-setup)
|
|
(add-hook 'auto-complete-mode-hook 'ac-common-setup)
|
|
(global-auto-complete-mode t))
|
|
|
|
(provide 'auto-complete-config)
|
|
;;; auto-complete-config.el ends here
|