init-lsp.el 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. ;;; init-lsp.el --- LSP Configuration File -*- lexical-binding: t -*-
  2. ;;; Commentary:
  3. ;;; Code:
  4. (setenv "LSP_USE_PLISTS" "true")
  5. (use-package lsp-ui
  6. :config
  7. (setq lsp-ui-sideline-enable t
  8. lsp-ui-peek-enable t
  9. lsp-ui-peek-always-show t
  10. lsp-ui-doc-delay 1
  11. lsp-ui-doc-enable t
  12. lsp-ui-doc-show-with-mouse t
  13. lsp-ui-doc-show-with-cursor nil
  14. lsp-ui-sideline-show-diagnostics t
  15. lsp-ui-sideline-show-code-actions nil
  16. lsp-ui-doc-position 'at-point))
  17. (use-package lsp-treemacs)
  18. (use-package lsp-mode
  19. :diminish
  20. :hook
  21. (clojure-mode . lsp)
  22. (lsp-lens-mode . really-diminish-lsp-lens-mode)
  23. (lsp-completion-mode . my/lsp-mode-setup-completion)
  24. (sql-mode . lsp)
  25. (lsp-after-apply-edits . save-buffer)
  26. :config
  27. (defun really-diminish-lsp-lens-mode ()
  28. (diminish 'lsp-lens-mode)
  29. (remove-hook 'lsp-lens-mode-hook 'really-diminish-lsp-lens-mode))
  30. (defun my/lsp-mode-setup-completion ()
  31. (setf (alist-get 'styles (alist-get 'lsp-capf completion-category-defaults))
  32. '(orderless))
  33. ;; Remove this, as we use cape-clojure (in init-clojure.el), which includes
  34. ;; lsp-completion-at-point
  35. (remove-hook 'completion-at-point-functions #'lsp-completion-at-point t))
  36. (if (eq system-type 'darwin)
  37. (setq lsp-keymap-prefix "s-l")
  38. (setq lsp-keymap-prefix "C-c C-l"))
  39. (define-key lsp-mode-map (kbd lsp-keymap-prefix) lsp-command-map)
  40. (setq lsp-sqls-workspace-config-path nil)
  41. (setq read-process-output-max (* 1024 1024)
  42. lsp-log-io nil
  43. lsp-lens-enable t
  44. lsp-headerline-breadcrumb-enable t
  45. lsp-idle-delay 1.000
  46. lsp-enable-symbol-highlighting t
  47. lsp-headerline-breadcrumb-enable-diagnostics nil
  48. lsp-modeline-code-actions-enable nil
  49. lsp-modeline-diagnostics-enable nil
  50. lsp-treemacs-theme "Iconless"
  51. lsp-completion-provider :none ;; use corfu
  52. lsp-references-exclude-definition t
  53. ;; user cider for indendation and eldoc
  54. lsp-enable-indentation nil
  55. lsp-eldoc-enable-hover nil)
  56. ;; Copied from https://github.com/blahgeek/emacs-lsp-booster/blob/4200ed6ae0cd83b8e3fd1dbefb09121480951a22/README.md#configure-lsp-mode
  57. (defun lsp-booster--advice-json-parse (old-fn &rest args)
  58. "Try to parse bytecode instead of json."
  59. (or
  60. (when (equal (following-char) ?#)
  61. (let ((bytecode (read (current-buffer))))
  62. (when (byte-code-function-p bytecode)
  63. (funcall bytecode))))
  64. (apply old-fn args)))
  65. (advice-add (if (progn (require 'json)
  66. (fboundp 'json-parse-buffer))
  67. 'json-parse-buffer
  68. 'json-read)
  69. :around
  70. #'lsp-booster--advice-json-parse)
  71. (defun lsp-booster--advice-final-command (old-fn cmd &optional test?)
  72. "Prepend emacs-lsp-booster command to lsp CMD."
  73. (let ((orig-result (funcall old-fn cmd test?)))
  74. (if (and (not test?) ;; for check lsp-server-present?
  75. (not (file-remote-p default-directory)) ;; see lsp-resolve-final-command, it would add extra shell wrapper
  76. lsp-use-plists
  77. (not (functionp 'json-rpc-connection)) ;; native json-rpc
  78. (executable-find "emacs-lsp-booster"))
  79. (progn
  80. (when-let ((command-from-exec-path (executable-find (car orig-result)))) ;; resolve command from exec-path (in case not found in $PATH)
  81. (setcar orig-result command-from-exec-path))
  82. (message "Using emacs-lsp-booster for %s!" orig-result)
  83. (cons "emacs-lsp-booster" orig-result))
  84. orig-result)))
  85. (advice-add 'lsp-resolve-final-command :around #'lsp-booster--advice-final-command))
  86. (provide 'init-lsp)
  87. ;;; init-lsp.el ends here