|
;;; ac-slime.el --- An auto-complete source using slime completions
|
|
|
|
;; Copyright (C) 2010-2017 Steve Purcell
|
|
|
|
;; Author: Steve Purcell <steve@sanityinc.com>
|
|
;; URL: https://github.com/purcell/ac-slime
|
|
;; Package-Version: 20171027.2100
|
|
;; Package-X-Original-Version: 0
|
|
;; Package-Requires: ((auto-complete "1.4") (slime "2.9") (cl-lib "0.5"))
|
|
|
|
;; 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 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:
|
|
|
|
;; Usage:
|
|
|
|
;; (require 'ac-slime)
|
|
;; (add-hook 'slime-mode-hook 'set-up-slime-ac)
|
|
;; (add-hook 'slime-repl-mode-hook 'set-up-slime-ac)
|
|
;; (eval-after-load "auto-complete"
|
|
;; '(add-to-list 'ac-modes 'slime-repl-mode))
|
|
;;
|
|
|
|
;;; Code:
|
|
|
|
(require 'cl-lib)
|
|
(require 'slime)
|
|
(require 'auto-complete)
|
|
|
|
(defgroup ac-slime nil
|
|
"Slime auto-complete customizations"
|
|
:prefix "ac-slime-"
|
|
:group 'slime)
|
|
|
|
(defcustom ac-slime-show-flags t
|
|
"When non-nil, show completion result flags during fuzzy completion."
|
|
:group 'ac-slime)
|
|
|
|
(defun ac-source-slime-fuzzy-candidates ()
|
|
"Return a possibly-empty list of fuzzy completions for the symbol at point."
|
|
(when (slime-connected-p)
|
|
(let ((slime-fuzzy-completion-limit 50))
|
|
(mapcar (lambda (result)
|
|
(let ((sym (car result))
|
|
(flags (car (last result))))
|
|
(if ac-slime-show-flags
|
|
(propertize sym 'summary flags)
|
|
sym)))
|
|
(car (slime-fuzzy-completions (substring-no-properties ac-prefix)))))))
|
|
|
|
(defun ac-source-slime-simple-candidates ()
|
|
"Return a possibly-empty list of completions for the symbol at point."
|
|
(when (slime-connected-p)
|
|
(let ((completions (slime-simple-completions (substring-no-properties ac-prefix))))
|
|
(if (listp (car completions))
|
|
(car completions)
|
|
completions))))
|
|
|
|
(defun ac-source-slime-case-correcting-completions (name collection)
|
|
(mapcar #'(lambda (completion)
|
|
;; FIXME
|
|
(cl-replace completion name))
|
|
(all-completions (downcase name) collection)))
|
|
|
|
(defvar ac-slime-current-doc nil "Holds slime docstring for current symbol.")
|
|
(defun ac-slime-documentation (symbol-name)
|
|
"Return a documentation string for SYMBOL-NAME."
|
|
(let ((symbol-name (substring-no-properties symbol-name)))
|
|
(slime-eval `(swank:documentation-symbol ,symbol-name))))
|
|
|
|
(defun ac-slime-init ()
|
|
"Called when completion source is initialized."
|
|
(setq ac-slime-current-doc nil))
|
|
|
|
;;;###autoload
|
|
(defface ac-slime-menu-face
|
|
'((t (:inherit ac-candidate-face)))
|
|
"Face for slime candidate menu."
|
|
:group 'auto-complete)
|
|
|
|
;;;###autoload
|
|
(defface ac-slime-selection-face
|
|
'((t (:inherit ac-selection-face)))
|
|
"Face for the slime selected candidate."
|
|
:group 'auto-complete)
|
|
|
|
;;;###autoload
|
|
(defvar ac-source-slime-fuzzy
|
|
'((init . ac-slime-init)
|
|
(candidates . ac-source-slime-fuzzy-candidates)
|
|
(candidate-face . ac-slime-menu-face)
|
|
(selection-face . ac-slime-selection-face)
|
|
(prefix . slime-symbol-start-pos)
|
|
(symbol . "l")
|
|
(match . (lambda (prefix candidates) candidates))
|
|
(document . ac-slime-documentation))
|
|
"Source for fuzzy slime completion.")
|
|
|
|
;;;###autoload
|
|
(defvar ac-source-slime-simple
|
|
'((init . ac-slime-init)
|
|
(candidates . ac-source-slime-simple-candidates)
|
|
(candidate-face . ac-slime-menu-face)
|
|
(selection-face . ac-slime-selection-face)
|
|
(prefix . slime-symbol-start-pos)
|
|
(symbol . "l")
|
|
(document . ac-slime-documentation)
|
|
(match . ac-source-slime-case-correcting-completions))
|
|
"Source for slime completion.")
|
|
|
|
|
|
;;;###autoload
|
|
(defun set-up-slime-ac (&optional fuzzy)
|
|
"Add an optionally FUZZY slime completion source to `ac-sources'."
|
|
(interactive)
|
|
(add-to-list 'ac-sources
|
|
(if fuzzy
|
|
'ac-source-slime-fuzzy
|
|
'ac-source-slime-simple)))
|
|
|
|
|
|
(provide 'ac-slime)
|
|
|
|
;;; ac-slime.el ends here
|