Show tooltip on the cursor with convenient information
Note: this package is still early stage. I'm going to support nim-mode first and then other programming major-modes.
You can see the instruction in suggestion-box-nim
The tooltip will be placed above on the current cursor, so most of the time, the tooltip doesn't destruct your auto-completion result. (hopefully)
- Step1: format string
(progn
(require 'suggestion-box)
(cl-defmethod suggestion-box-normalize ((_backend (eql test)) raw-str)
(format "foo %s bar" raw-str))
(let ((str "string"))
(suggestion-box-put str :backend 'test)
(insert "()")
(backward-char 1)
(suggestion-box str))) <- you can C-x C-e after the close parenthesis and
this will popup "foo string bar" on the cursor.
- Step2: more complex logic (work in progress) this is just example of nim-mode. Basically Nim's type signature is like this: "proc (a: string, b: int) {.gcsafe.}" and below configuration strip annoying part (outside of parenthesis). Output example: "a: string" if cursor is inside 1th arg's position.
(cl-defmethod suggestion-box-normalize ((_backend (eql nim)) raw-str)
"Return normalized string."
(suggestion-box-h-filter
:content (suggestion-box-h-trim raw-str "(" ")")
:split-func (lambda (content) (split-string content ", "))
:nth-arg (suggestion-box-h-compute-nth "," 'paren)
:sep "" :mask1 "" :mask2 ""))
- Step3: work with company-capf backend (work in progress) here is what I did in nim-mode:
(defcustom nim-capf-after-exit-function-hook 'nimsuggest-after-exit-function
"A hook that is called with an argument.
The argument is string that has some properties."
:type 'hook
:group 'nim)
(defun nimsuggest-after-exit-function (str)
"Default function that is called after :exit-function is called.
The STR is string that has several property you can utilize."
(when-let ((type (and str (get-text-property 0 :nim-type str))))
(suggestion-box-put type :backend 'nim)
(suggestion-box type)))
;; note I simplified this function because it was too long
(defun nim-capf-nimsuggest-completion-at-point ()
(list beg end (completion-table-with-cache 'nim-capf--nimsuggest-complete)
;; ... some properties ...
:exit-function #'nim-capf--exit-function))
(defun nim-capf--exit-function (str status)
"Insert necessary things for STR, when completion is done.
You may see information about STATUS at `completion-extra-properties'.
But, for some reason, currently this future is only supporting
company-mode. See also: https://github.com/company-mode/company-mode/issues/583"
(unless (eq 'completion-at-point this-command)
(cl-case status
;; finished -- completion was finished and there is no other completion
;; sole -- completion was finished and there is/are other completion(s)
((finished sole)
(when-let ((type-sig (get-text-property 0 :nim-sig str)))
(cl-case (intern type-sig)
((f T) ; <- this means current completion was function or
; template, which needs "()"
(insert "()")
(backward-char 1)
(run-hook-with-args 'nim-capf-after-exit-function-hook str)))))
(t
;; let other completion backends
(setq this-command 'self-insert-command)))))
GPLv3 License