Commit 2da4c3ab authored by Stefan Monnier's avatar Stefan Monnier
Browse files

* lisp/emacs-lisp/lisp.el (lisp--company-doc-buffer)

(lisp--company-doc-string, lisp--company-location): New functions.
(lisp-completion-at-point): Use them to improve Company support.
parent f069bba8
2013-08-29 Stefan Monnier <>
* emacs-lisp/lisp.el (lisp--company-doc-buffer)
(lisp--company-doc-string, lisp--company-location): New functions.
(lisp-completion-at-point): Use them to improve Company support.
* progmodes/ruby-mode.el (ruby-smie-grammar): Add rule for formal
params of lambda expressions.
(ruby-smie--implicit-semi-p): Refine rule (bug#15208).
......@@ -752,6 +752,57 @@ considered."
(mapcar #'symbol-name (lisp--local-variables))))))
;; FIXME: Support for Company brings in features which straddle eldoc.
;; We should consolidate this, so that major modes can provide all that
;; data all at once:
;; - a function to extract "the reference at point" (may be more complex
;; than a mere string, to distinguish various namespaces).
;; - a function to jump to such a reference.
;; - a function to show the signature/interface of such a reference.
;; - a function to build a help-buffer about that reference.
;; FIXME: Those functions should also be used by the normal completion code in
;; the *Completions* buffer.
(defun lisp--company-doc-buffer (str)
(let ((symbol (intern-soft str)))
;; FIXME: we really don't want to "display-buffer and then undo it".
;; Make sure we don't display it in another frame, otherwise
;; save-window-excursion won't be able to undo it.
(let ((display-buffer-overriding-action
'(nil . ((inhibit-switch-frame . t)))))
((fboundp symbol) (describe-function symbol))
((boundp symbol) (describe-variable symbol))
((featurep symbol) (describe-package symbol))
((facep symbol) (describe-face symbol))
(t (signal 'user-error nil)))
(defun lisp--company-doc-string (str)
(let* ((symbol (intern-soft str))
(doc (if (fboundp symbol)
(documentation symbol t)
(documentation-property symbol 'variable-documentation t))))
(and (stringp doc)
(string-match ".*$" doc)
(match-string 0 doc))))
(declare-function find-library-name "find-func" (library))
(defun lisp--company-location (str)
(let ((sym (intern-soft str)))
((fboundp sym) (find-definition-noselect sym nil))
((boundp sym) (find-definition-noselect sym 'defvar))
((featurep sym)
(require 'find-func)
(cons (find-file-noselect (find-library-name
(symbol-name sym)))
((facep sym) (find-definition-noselect sym 'defface)))))
(defun lisp-completion-at-point (&optional _predicate)
"Function used for `completion-at-point-functions' in `emacs-lisp-mode'."
(with-syntax-table emacs-lisp-mode-syntax-table
......@@ -783,7 +834,10 @@ considered."
obarray) ;Could be anything.
(lambda (str) (if (fboundp (intern-soft str)) " <f>")))
(lambda (str) (if (fboundp (intern-soft str)) " <f>"))
:company-doc-buffer #'lisp--company-doc-buffer
:company-docsig #'lisp--company-doc-string
:company-location #'lisp--company-location)
;; Looks like a funcall position. Let's double check.
(goto-char (1- beg))
......@@ -800,10 +854,12 @@ considered."
;; we should use something like a symbol-property.
(list t (mapcar (lambda (x) (symbol-name (car x)))
;; FIXME: We should include some
;; docstring with each entry.
((and (or `condition-case `condition-case-unless-debug)
(guard (save-excursion
......@@ -811,7 +867,12 @@ considered."
(< (point) beg)))))
(list t obarray
:predicate (lambda (sym) (get sym 'error-conditions))))
(_ (list nil obarray #'fboundp))))))))
(_ (list nil obarray
:predicate #'fboundp
:company-doc-buffer #'lisp--company-doc-buffer
:company-docsig #'lisp--company-doc-string
:company-location #'lisp--company-location
(when end
(let ((tail (if (null (car table-etc))
(cdr table-etc)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment