2018-03-16 00:38:24 +00:00
|
|
|
;;; funcs.el --- Language Server Protocol Layer functions file for Spacemacs
|
2018-02-19 03:53:07 +00:00
|
|
|
;;
|
|
|
|
;; Copyright (c) 2012-2018 Sylvain Benner & Contributors
|
|
|
|
;;
|
|
|
|
;; Author: Fangrui Song <i@maskray.me>
|
|
|
|
;; URL: https://github.com/syl20bnr/spacemacs
|
|
|
|
;;
|
|
|
|
;; This file is not part of GNU Emacs.
|
|
|
|
;;
|
|
|
|
;;; License: GPLv3
|
|
|
|
|
|
|
|
(defun spacemacs//lsp-sync-peek-face ()
|
|
|
|
"Synchronize the face used in `lsp-ui' peek window according to the theme."
|
2018-01-21 20:27:33 +00:00
|
|
|
(set-face-attribute 'lsp-ui-peek-list nil
|
|
|
|
:background (face-attribute 'hl-line :background nil t))
|
|
|
|
(set-face-attribute 'lsp-ui-peek-peek nil
|
|
|
|
:background (face-attribute 'hl-line :background nil t))
|
|
|
|
(set-face-attribute 'lsp-ui-peek-selection nil
|
|
|
|
:background (face-attribute 'highlight :background nil t)
|
|
|
|
:foreground (face-attribute 'default :foreground nil t))
|
|
|
|
(set-face-attribute 'lsp-ui-peek-filename nil
|
2018-02-19 03:53:07 +00:00
|
|
|
:foreground (face-attribute 'font-lock-constant-face
|
|
|
|
:foreground nil t))
|
2018-01-21 20:27:33 +00:00
|
|
|
(set-face-attribute 'lsp-ui-peek-highlight nil
|
|
|
|
:background (face-attribute 'highlight :background nil t)
|
|
|
|
:foreground (face-attribute 'highlight :foreground nil t)
|
2018-02-19 03:53:07 +00:00
|
|
|
:distant-foreground (face-attribute 'highlight
|
|
|
|
:foreground nil t))
|
2018-01-21 20:27:33 +00:00
|
|
|
(set-face-attribute 'lsp-ui-peek-header nil
|
|
|
|
:background (face-attribute 'highlight :background nil t)
|
|
|
|
:foreground (face-attribute 'default :foreground nil t))
|
|
|
|
)
|
2018-04-28 06:16:20 +00:00
|
|
|
|
2018-05-08 04:17:56 +00:00
|
|
|
(defun spacemacs//setup-lsp-jump-handler (&rest modes)
|
|
|
|
"Set jump handler for LSP with the given MODE."
|
|
|
|
(dolist (m modes)
|
|
|
|
(add-to-list (intern (format "spacemacs-jump-handlers-%S" m))
|
2018-06-02 22:11:47 +00:00
|
|
|
#'lsp-ui-peek-find-definitions)))
|
2018-04-26 19:43:50 +00:00
|
|
|
|
|
|
|
(defun fix-lsp-company-prefix ()
|
|
|
|
"fix lsp-javascript company prefix
|
|
|
|
https://github.com/emacs-lsp/lsp-javascript/issues/9#issuecomment-379515379"
|
|
|
|
(interactive)
|
|
|
|
(defun lsp-prefix-company-transformer (candidates)
|
|
|
|
(let ((completion-ignore-case t))
|
|
|
|
(all-completions (company-grab-symbol) candidates)))
|
|
|
|
(make-local-variable 'company-transformers)
|
|
|
|
(add-to-list 'company-transformers 'lsp-prefix-company-transformer))
|
2018-03-16 00:38:24 +00:00
|
|
|
|
|
|
|
(defun spacemacs/lsp-bind-keys-for-mode (mode)
|
|
|
|
"Define key bindings for the specific MODE."
|
|
|
|
(spacemacs/declare-prefix-for-mode mode "m=" "format")
|
|
|
|
(spacemacs/declare-prefix-for-mode mode "mg" "goto")
|
|
|
|
(spacemacs/declare-prefix-for-mode mode "mh" "hierarchy")
|
|
|
|
(spacemacs/declare-prefix-for-mode mode "ml" "lsp/backend")
|
|
|
|
(spacemacs/declare-prefix-for-mode mode "mr" "refactor")
|
|
|
|
(spacemacs/declare-prefix-for-mode mode "mT" "toggle")
|
|
|
|
|
|
|
|
(spacemacs/set-leader-keys-for-major-mode mode
|
|
|
|
;;format
|
|
|
|
"=b" #'lsp-format-buffer
|
|
|
|
;;goto
|
|
|
|
"gi" #'lsp-goto-implementation
|
|
|
|
"gt" #'lsp-goto-type-definition
|
|
|
|
"ga" #'spacemacs/lsp-avy-document-symbol
|
|
|
|
"gm" #'lsp-ui-imenu
|
|
|
|
"gd" #'lsp-ui-peek-find-definitions
|
|
|
|
"gr" #'lsp-ui-peek-find-references
|
|
|
|
"gs" #'lsp-ui-peek-find-workspace-symbol
|
|
|
|
"gp" #'lsp-ui-peek-jump-backward
|
|
|
|
"gn" #'lsp-ui-peek-jump-forward
|
|
|
|
"gf" #'lsp-ui-flycheck-list
|
|
|
|
;;hierarchy
|
|
|
|
"hh" #'lsp-describe-thing-at-point
|
|
|
|
;;jump
|
|
|
|
;;lsp/backend
|
|
|
|
"la" #'lsp-execute-code-action
|
|
|
|
"lr" #'lsp-restart-workspace
|
|
|
|
;;refactor
|
|
|
|
"rr" #'lsp-rename
|
|
|
|
;;toggles
|
|
|
|
"Td" #'lsp-ui-doc-mode
|
|
|
|
"Ts" #'lsp-ui-sideline-mode
|
|
|
|
"TF" #'spacemacs/lsp-ui-doc-func
|
|
|
|
"TS" #'spacemacs/lsp-ui-sideline-symb
|
|
|
|
"TI" #'spacemacs/lsp-ui-sideline-ignore-duplicate
|
|
|
|
)
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
(defun spacemacs/lsp-ui-doc-func ()
|
|
|
|
"Toggle the function signature in the lsp-ui-doc overlay"
|
|
|
|
(interactive)
|
|
|
|
(setq lsp-ui-doc-include-signature (not lsp-ui-doc-include-signature)))
|
|
|
|
|
|
|
|
(defun spacemacs/lsp-ui-sideline-symb ()
|
|
|
|
"Toggle the symbol in the lsp-ui-sideline overlay.
|
|
|
|
(generally redundant in C modes)"
|
|
|
|
(interactive)
|
|
|
|
(setq lsp-ui-sideline-show-symbol (not lsp-ui-sideline-show-symbol)))
|
|
|
|
|
|
|
|
(defun spacemacs/lsp-ui-sideline-ignore-duplicate ()
|
|
|
|
"Toggle ignore duplicates for lsp-ui-sideline overlay"
|
|
|
|
(interactive)
|
|
|
|
(setq lsp-ui-sideline-ignore-duplicate (not lsp-ui-sideline-ignore-duplicate)))
|
|
|
|
|
|
|
|
;; Used for lsp-ui-peek-mode, but may be able to use some spacemacs fn. instead?
|
|
|
|
(defun spacemacs/lsp-define-key (keymap key def &rest bindings)
|
|
|
|
"Define multiple key bindings with KEYMAP KEY DEF BINDINGS."
|
|
|
|
(interactive)
|
|
|
|
(while key
|
|
|
|
(define-key keymap (kbd key) def)
|
|
|
|
(setq key (pop bindings)
|
|
|
|
def (pop bindings))))
|
|
|
|
|
|
|
|
;; From https://github.com/MaskRay/Config/blob/master/home/.config/doom/autoload/misc.el#L118
|
|
|
|
;;;###autoload
|
|
|
|
(defun spacemacs/lsp-avy-document-symbol ()
|
|
|
|
(interactive)
|
|
|
|
(let (ranges point0 point1 (line 0) (col 0) (w (selected-window)) candidates)
|
|
|
|
(save-excursion
|
|
|
|
(goto-char 1)
|
|
|
|
(dolist (loc
|
|
|
|
(lsp--send-request (lsp--make-request
|
|
|
|
"textDocument/documentSymbol"
|
|
|
|
;;;;;; I added :all t in ccls to return all symbols in the document
|
|
|
|
`(:textDocument ,(lsp--text-document-identifier) :all t))))
|
|
|
|
(let ((range (->> loc (gethash "location") (gethash "range"))))
|
|
|
|
(-let* [((&hash "line" l0 "character" c0) (gethash "start" range))
|
|
|
|
((&hash "line" l1 "character" c1) (gethash "end" range))]
|
|
|
|
(when (or (< line l0) (and (= line l0) (<= col c0)))
|
|
|
|
(forward-line (- l0 line))
|
|
|
|
(forward-char c0)
|
|
|
|
(setq point0 (point))
|
|
|
|
(forward-line (- l1 l0))
|
|
|
|
(forward-char c1)
|
|
|
|
(setq point1 (point))
|
|
|
|
(setq line l1 col c1)
|
|
|
|
(push `((,point0 . ,point1) . ,w) candidates))))))
|
|
|
|
(avy-with avy-document-symbol
|
|
|
|
(avy--process candidates
|
|
|
|
(avy--style-fn avy-style)))))
|