feat(emacs/lean-company): add lean-company
This commit is contained in:
parent
e7f6228001
commit
cc89cd051a
2 changed files with 49 additions and 70 deletions
|
@ -1,81 +1,61 @@
|
||||||
|
;; -*- lexical-binding: t; -*-
|
||||||
|
;; Copyright (c) 2014 Microsoft Corporation. All rights reserved.
|
||||||
|
;; Released under Apache 2.0 license as described in the file LICENSE.
|
||||||
|
;;
|
||||||
|
;; Author: Soonho Kong
|
||||||
|
;;
|
||||||
(require 'company)
|
(require 'company)
|
||||||
(defun company-lean ()
|
(require 'company-etags)
|
||||||
(set (make-local-variable 'company-backends) '(company-lean))
|
(require 'dash)
|
||||||
(company-mode))
|
(require 'dash-functional)
|
||||||
(add-hook 'lean-mode-hook 'company-lean)
|
(require 'lean-tags)
|
||||||
|
(require 'lean-server)
|
||||||
|
|
||||||
(setq company-tooltip-limit 20) ; bigger popup window
|
(defun company-lean-hook ()
|
||||||
(setq company-idle-delay .3) ; decrease delay before autocompletion popup shows
|
(set (make-local-variable 'company-backends) '(company-lean))
|
||||||
(setq company-echo-delay 0) ; remove annoying blinking
|
(setq-local company-tooltip-limit 20) ; bigger popup window
|
||||||
(setq company-begin-commands '(self-insert-command)) ; start autocompletion only after typing
|
(setq-local company-idle-delay .3) ; decrease delay before autocompletion popup shows
|
||||||
|
(setq-local company-echo-delay 0) ; remove annoying blinking
|
||||||
|
(setq-local company-begin-commands '(self-insert-command)) ; start autocompletion only after typing
|
||||||
|
(company-mode t))
|
||||||
|
|
||||||
(defun company-lean--prefix ()
|
(defun company-lean--prefix ()
|
||||||
"Returns the symbol to complete. Also, if point is on a dot,
|
"Returns the symbol to complete. Also, if point is on a dot,
|
||||||
triggers a completion immediately."
|
triggers a completion immediately."
|
||||||
(if company-lean-begin-after-member-access
|
(let ((prefix (company-grab-symbol)))
|
||||||
(company-grab-symbol-cons "\\." 1)
|
(when (or
|
||||||
(company-grab-symbol)))
|
(> (length prefix) 3))
|
||||||
|
prefix)))
|
||||||
|
|
||||||
(defun company-go--invoke-autocomplete ()
|
(defun company-lean--make-candidate (arg)
|
||||||
(let ((temp-buffer (generate-new-buffer "*leancompany*")))
|
(propertize (car arg) 'type (cdr arg)))
|
||||||
(prog2
|
|
||||||
(call-process-region (point-min)
|
|
||||||
(point-max)
|
|
||||||
"leancompany"
|
|
||||||
nil
|
|
||||||
temp-buffer
|
|
||||||
nil
|
|
||||||
"-f=csv"
|
|
||||||
"autocomplete"
|
|
||||||
(or (buffer-file-name) "")
|
|
||||||
(concat "c" (int-to-string (- (point) 1))))
|
|
||||||
(with-current-buffer temp-buffer (buffer-string))
|
|
||||||
(kill-buffer temp-buffer))))
|
|
||||||
|
|
||||||
(defun company-lean--candidates ()
|
(defun company-lean--candidates (prefix)
|
||||||
(company-lean--get-candidates (split-string (company-lean--invoke-autocomplete) "\n" t)))
|
(let ((line-number (line-number-at-pos)))
|
||||||
|
(lean-server-send-cmd-sync (lean-cmd-findp line-number prefix)
|
||||||
|
(lambda (candidates)
|
||||||
|
(-map 'company-lean--make-candidate candidates)))))
|
||||||
|
|
||||||
|
(defun company-lean--location (arg)
|
||||||
|
(lean-generate-tags)
|
||||||
|
(let ((tags-table-list (company-etags-buffer-table)))
|
||||||
|
(when (fboundp 'find-tag-noselect)
|
||||||
|
(save-excursion
|
||||||
|
(let ((buffer (find-tag-noselect arg)))
|
||||||
|
(cons buffer (with-current-buffer buffer (point))))))))
|
||||||
|
|
||||||
|
(defun company-lean--annotation (candidate)
|
||||||
|
(let ((type (get-text-property 0 'type candidate)))
|
||||||
|
(when type
|
||||||
|
(format " : %s" type))))
|
||||||
|
|
||||||
;;;###autoload
|
;;;###autoload
|
||||||
(defun company-lean (command &optional arg &rest ignored)
|
(defun company-lean (command &optional arg &rest ignored)
|
||||||
(case command
|
(case command
|
||||||
(prefix (and (derived-mode-p 'lean-mode)
|
(prefix (company-lean--prefix))
|
||||||
(not (company-in-string-or-comment))
|
(candidates (company-lean--candidates arg))
|
||||||
(or (company-lean--prefix) 'stop)))
|
(annotation (company-lean--annotation arg))
|
||||||
(candidates (company-lean--candidates))
|
|
||||||
(meta (get-text-property 0 'meta arg))
|
|
||||||
(annotation
|
|
||||||
(when company-lean-show-annotation
|
|
||||||
(get-text-property 0 'meta arg)))
|
|
||||||
(location (company-lean--location arg))
|
(location (company-lean--location arg))
|
||||||
(sorted t)))
|
(sorted t)))
|
||||||
|
|
||||||
(provide 'company-lean)
|
(provide 'lean-company)
|
||||||
|
|
||||||
(defun company-lean--doc-buffer (candidate)
|
|
||||||
(message "doc candidate = %S" candidate)
|
|
||||||
(company-doc-buffer (get-text-property 0 'doc candidate)))
|
|
||||||
|
|
||||||
(defun company-lean--annotation (candidate)
|
|
||||||
(message "annotation candidate = %S" candidate)
|
|
||||||
(let ((anno (get-text-property 0 'kind candidate)))
|
|
||||||
(when anno (concat " blabla" anno)))
|
|
||||||
" : annotation1")
|
|
||||||
|
|
||||||
(defun company-lean--candidates (prefix)
|
|
||||||
(cl-loop for x in '("foobar" "foobaz" "foobarbaz")
|
|
||||||
collect x
|
|
||||||
))
|
|
||||||
|
|
||||||
(defun company-my-backend (command &optional arg &rest ignored)
|
|
||||||
(interactive (list 'interactive))
|
|
||||||
(case command
|
|
||||||
(interactive (company-begin-backend 'company-my-backend))
|
|
||||||
(prefix (when (looking-back "foo\\>")
|
|
||||||
(match-string 0)))
|
|
||||||
(candidates (company-lean--candidates arg))
|
|
||||||
(annotation (company-lean--annotation arg))
|
|
||||||
))
|
|
||||||
|
|
||||||
(set (make-local-variable 'company-backends) '(company-my-backend))
|
|
||||||
(company-mode)
|
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
(require 'lean-option)
|
(require 'lean-option)
|
||||||
(require 'lean-syntax)
|
(require 'lean-syntax)
|
||||||
(require 'lean-mmm-lua)
|
(require 'lean-mmm-lua)
|
||||||
|
(require 'lean-company)
|
||||||
|
|
||||||
(defun lean-compile-string (exe-name args file-name)
|
(defun lean-compile-string (exe-name args file-name)
|
||||||
"Concatenate exe-name, args, and file-name"
|
"Concatenate exe-name, args, and file-name"
|
||||||
|
@ -108,7 +109,7 @@
|
||||||
;; ;; Immediately show error popups when navigating to an error
|
;; ;; Immediately show error popups when navigating to an error
|
||||||
;; (next-error-hook . lean-display-error-at-point))
|
;; (next-error-hook . lean-display-error-at-point))
|
||||||
)
|
)
|
||||||
"Hooks which lean-mode needs to hook in.
|
"Hooks which lean-mode needs to hook in.
|
||||||
|
|
||||||
The `car' of each pair is a hook variable, the `cdr' a function
|
The `car' of each pair is a hook variable, the `cdr' a function
|
||||||
to be added or removed from the hook variable if Flycheck mode is
|
to be added or removed from the hook variable if Flycheck mode is
|
||||||
|
@ -139,9 +140,7 @@ enabled and disabled respectively.")
|
||||||
(lean-eldoc-documentation-function))
|
(lean-eldoc-documentation-function))
|
||||||
;; company-mode
|
;; company-mode
|
||||||
(when lean-company-use
|
(when lean-company-use
|
||||||
(require 'company)
|
(company-lean-hook)))
|
||||||
(company-mode t)
|
|
||||||
(set (make-local-variable 'company-backends) '(company-etags))))
|
|
||||||
|
|
||||||
;; Automode List
|
;; Automode List
|
||||||
;;;###autoload
|
;;;###autoload
|
||||||
|
|
Loading…
Reference in a new issue