emacs-ipython-notebook/ein-ac.el

123 lines
4.1 KiB
EmacsLisp
Raw Normal View History

;;; ein-ac.el --- Auto-complete extension
;; Copyright (C) 2012- Takafumi Arakaki
;; Author: Takafumi Arakaki
;; This file is NOT part of GNU Emacs.
;; ein-ac.el 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.
;; ein-ac.el 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 ein-ac.el. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;;
;;; Code:
(eval-when-compile (require 'cl))
(require 'auto-complete)
2012-05-16 03:31:22 +02:00
(eval-when-compile (require 'ein-notebook)
(require 'ein-mumamo))
2012-05-16 02:57:38 +02:00
(defvar ein:ac-sources (default-value 'ac-sources)
"Extra `ac-sources' used in notebook.")
2012-05-16 03:47:08 +02:00
(defvar ein:ac-max-cache 1000
"Maximum number of cache to store.")
(defvar ein:ac-dotty-syntax-table
(let ((table (make-syntax-table c-mode-syntax-table)))
(modify-syntax-entry ?. "w" table)
(modify-syntax-entry ?_ "w" table)
table)
"Adapted from `python-dotty-syntax-table'.")
2012-05-16 02:57:38 +02:00
(defvar ein:ac-cache-matches nil)
(defvar ein:ac-direct-matches nil
"Variable to store completion candidates for `auto-completion'.")
2012-05-16 02:57:38 +02:00
;; FIXME: Maybe this should be buffer-local?
(ac-define-source ein-direct
'((candidates . ein:ac-direct-matches)
(symbol . "s")))
2012-05-16 02:57:38 +02:00
(ac-define-source ein-cached
'((candidates . ein:ac-cache-matches)
(symbol . "c")))
(defun ein:completer-finish-completing-ac (matched-text matches)
"Invoke completion using `auto-complete'.
Only the argument MATCHES is used. MATCHED-TEXT is for
compatibility with `ein:completer-finish-completing-default'."
;; I don't need to check if the point is at right position, as in
;; `ein:completer-finish-completing-default' because `auto-complete'
;; checks it anyway.
(setq ein:ac-direct-matches matches) ; let-binding won't work
2012-05-16 02:57:38 +02:00
(setq ein:ac-cache-matches (append matches ein:ac-cache-matches))
2012-05-16 03:47:08 +02:00
(run-with-idle-timer 1 nil #'ein:ac-clear-cache)
(with-syntax-table ein:ac-dotty-syntax-table
(auto-complete '(ac-source-ein-direct))))
2012-05-16 03:47:08 +02:00
(defun ein:ac-clear-cache ()
(setq ein:ac-cache-matches
(setcdr (nthcdr (1- ein:ac-max-cache)
(delete-dups ein:ac-cache-matches)) nil)))
2012-05-16 02:57:38 +02:00
(defadvice ac-prefix
(around ein:ac-always-dotty (requires ignore-list))
"Monkey patch `auto-complete' internal function to enable
dotty completion."
(if ein:notebook
(with-syntax-table ein:ac-dotty-syntax-table
ad-do-it)
ad-do-it))
(defun ein:ac-superpack ()
"Enable dotty syntax table for auto-complete.
This function monkey patches `ac-prefix' to make \".\" as a part of word."
(interactive)
(ad-enable-advice 'ac-prefix 'around 'ein:ac-always-dotty)
(ad-activate 'ac-prefix))
(defun ein:ac-setup ()
"Call this function from mode hook (see `ein:ac-config')."
2012-05-16 03:02:44 +02:00
;; Note that `ac-source-ein-cached' can still be useful even if
;; `ein:ac-always-dotty' advice is not enabled. So add this source
;; anyway. Also note that this source must come at the head of the
;; sources.
2012-05-16 02:57:38 +02:00
(setq ac-sources (append '(ac-source-ein-cached) ein:ac-sources)))
2012-05-16 03:31:22 +02:00
(defun ein:ac-setup-maybe () ; [#hook]_
(and ein:notebook
(eql major-mode ein:mumamo-codecell-mode)
(ein:ac-setup)))
2012-05-16 02:57:38 +02:00
(defun ein:ac-config (&optional superpack)
"Install auto-complete-mode for notebook modes.
Specifying non-`nil' to SUPERPACK enables dotty auto completion
\(see `ein:ac-superpack')."
2012-05-16 03:31:22 +02:00
(add-hook 'after-change-major-mode-hook 'ein:ac-setup-maybe) ; [#hook]_
2012-05-16 02:57:38 +02:00
(add-hook 'ein:notebook-plain-mode 'ein:ac-setup)
(when superpack
(ein:ac-superpack)))
2012-05-16 03:31:22 +02:00
;; .. [#hook] Setting `ein:notebook-mumamo-mode-hook' does not work
;; because `ac-sources' in `ein:notebook-mumamo-mode'-enabled
;; buffer is *chunk local*, rather than buffer local.
2012-05-16 02:57:38 +02:00
(provide 'ein-ac)
;;; ein-ac.el ends here