feat(emacs): completely refactor company and lsp mode

Update the lsp to improve the performance and editing experience. The completion
has been disabled so we can configure it manually to include snippets and file
paths into the company code completion.

Company has been configured to override the tab behaviour to always expand
snippets whenever there is a available snippet. The default behaviour is to
cycle through the completion.
This commit is contained in:
Ade Attwood 2021-07-10 20:42:41 +01:00
parent ea87574031
commit 1270157bdf

View file

@ -9,28 +9,20 @@
;; The main development configuration common development packages
;; like lsp and flycheck
(defun efs/lsp-mode-setup ()
"Set up the LSP mode."
(setq lsp-enable-which-key-integration t
lsp-enable-xref nil
lsp-intelephense-completion-trigger-parameter-hints nil
lsp-intelephense-multi-root nil
lsp-enable-file-watchers nil
lsp-enable-snippet t
lsp-ui-doc-position 'top
lsp-headerline-breadcrumb-enable nil))
(use-package lsp-mode
:commands (lsp lsp-deferred)
:config
(setq
lsp-intelephense-completion-trigger-parameter-hints nil
lsp-intelephense-multi-root nil
lsp-enable-file-watchers nil
lsp-enable-snippet t
lsp-ui-doc-position 'top
lsp-headerline-breadcrumb-enable nil))
;;:hook (lsp-mode . efs/lsp-mode-setup))
(setq-default
lsp-intelephense-completion-trigger-parameter-hints nil
lsp-auto-guess-root t
lsp-headerline-breadcrumb-enable nil
lsp-enable-file-watchers nil
lsp-keep-workspace-alive nil
lsp-ui-doc-position 'top
lsp-modeline-diagnostics-scope :project
lsp-completion-provider :none))
(advice-add 'lsp :before (lambda (&rest _args) (eval '(setf (lsp-session-server-id->folders (lsp-session)) (ht)))))
(use-package lsp-ui
:hook (lsp-mode . lsp-ui-mode))
@ -40,31 +32,66 @@
(use-package lsp-ivy)
(defun do-yas-expand ()
(let ((yas/fallback-behavior 'return-nil))
(yas/expand)))
(defun aa/company-tab ()
(interactive)
(if (or (not yas/minor-mode)
(null (do-yas-expand)))
(company-complete-common-or-cycle)))
(defun aa/company-sort (candidates)
(let (case-fold-search
(re "\\`[[:upper:]]*\\'"))
(sort candidates
(lambda (s1 s2)
(and (string-match-p re s2)
(not (string-match-p re s1)))))))
(use-package company
:after lsp-mode
:bind
(:map company-active-map
("RET" . company-complete)
("C-l" . yas-next-field-or-maybe-expand)
("RET" . company-complete))
("<tab>" . aa/company-tab)
("TAB" . aa/company-tab))
:config
(global-company-mode)
(setq company-idle-delay 0.2)
(push 'aa/company-sort company-transformers)
(setq company-idle-delay 0)
(setq company-echo-delay 0)
(setq company-minimum-prefix-length 1)
(setq company-tooltip-limit 15)
(setq company-dabbrev-downcase nil)
(setq-default company-backends
'((company-capf
:with
company-yasnippet
company-files)))
:hook (lsp-mode . company-mode))
(use-package company-statistics
:ensure t
:after company
:init
(company-statistics-mode))
(use-package company-box
:hook (company-mode . company-box-mode)
:config
(setq company-box-icons-alist 'company-box-icons-all-the-icons))
(use-package rainbow-delimiters
:hook (prog-mode . rainbow-delimiters-mode))
(setq
company-box-backends-colors nil
company-box-icons-alist 'company-box-icons-all-the-icons))
(use-package flycheck
:ensure t
:init (global-flycheck-mode))
(with-eval-after-load 'flycheck
(setq flycheck-phpcs-standard "PSR2")
(setq-default flycheck-disabled-checkers '(emacs-lisp-checkdoc)))
;; Set the default column width to 80. The default in emacs is 70 that is too small for me
@ -93,3 +120,21 @@
(use-package browse-at-remote :defer t)
(use-package string-inflection :defer t)
(defun aa/global-tab ()
(interactive)
(if (or (not yas/minor-mode)
(null (do-yas-expand)))
(indent-for-tab-command)))
(define-minor-mode aa-tab-mode
"Runs fmt on file save when this mode is turned on"
:lighter " aa-tab"
:global nil
(global-set-key (kbd "<tab>") 'aa/global-tab)
(global-set-key (kbd "TAB") 'aa/global-tab))
(define-globalized-minor-mode global-aa-tab-mode aa-tab-mode
(lambda () (aa-tab-mode 1)))
(global-aa-tab-mode)