Gitlab Duo Code Assistant completions via Gitlab LSP
(use-package gitlab-lsp
:quelpa (gitlab-lsp :fetcher github
:repo "kassick/gitlab-lsp.el"
:branch "main"
:files ("*.el"))
:config
;; speed up completions
(setq gitlab-lsp-show-completions-with-other-clients nil)
(add-hook 'gitlab-lsp-complete-before-complete-hook
(lambda ()
;; scroll to top so preview can show the snippet
(recenter-top-bottom 4)
;; Show something, since we can not spin ...
(message "Asking for suggestions ...")))
(define-key global-map
(kbd "C-*") '("Complete with Gitlab Duo" . gitlab-lsp-complete))
)
;; In dotspacemacs/layers:
(setq-default
;; ...
dotspacemacs-additional-packages
'(
;; ...
(gitlab-lsp :location (recipe
:fetcher github
:repo "kassick/gitlab-lsp.el"
:files ("*.el")))
;; ...
)
;; ...
)
;; In dotspacemacs/user-config:
(require 'gitlab-lsp)
;; speed up completions
(setq gitlab-lsp-show-completions-with-other-clients nil)
;; Scroll the buffer so we have more space for company preview frontend
(add-hook 'gitlab-lsp-complete-before-complete-hook
(lambda ()
;; scroll to top so preview can show the snippet
(recenter-top-bottom 4)
;; Show something, since we can not spin ...
(message "Asking for suggestions ...")))
(define-key global-map
(kbd "C-*") '("Complete with Gitlab Duo" . gitlab-lsp-complete))
The Gitlab LSP server provides the Inline Completions method -- you can use this server with the UI provided here -- just make sure the server is running.
Run lsp-install-server <RET> gitlab-lsp
to have lsp-mode
download and install the server for you.
You can also manually install the server anywhere in your $PATH
or adjust gitlab-lsp-executable
to have lsp-mode
use the external command.
You must generate either a Personal Access Token or an OAuth Token to access your gitlab instance. The token must have the api
scope.
-
Option 1: Secrets (GNOME Keyring or KDE Wallet): Simply open a file (of one of the supported modes) and you will be prompted for the Gitlab instance URL and token.
You can also
M-x gitlab-lsp-setup
at any time to create or update the token and URL. -
Option 2: Emacs Custom Variables: You can
M-x customize-group <RET> gitlab-lsp
and adjust the values ofgitlab-lsp-server-url
andgitlab-lsp-token
. -
Option 3: You may set the environment variables
GITLAB_LSP_BASE_URL
andGITLAB_LSP_TOKEN
and the client will pick them up.
By default, gitlab-lsp
will try to find the values in the environment variables, then custom variables, and finally secrets.
If you have your URL and token stored via secrets and then either (setenv "GITLAB_LSP_BASE_URL" "https://localhost:8080")
or (setq gitlab-lsp-server-url "https://localhost:8080")
, then the client will use the URL from the environment and the token from secrets.
Type your prompt and then either trigger company-mode completion (or wait on the timer). company-capf
will call lsp-mode
to provide completions, and then the configured gitlab instance will be contacted.
You can also bind gitlab-lsp-complete
and use it to ask for Gitlab LSP completions only.
If you do not want every completion request going to gitlab-lsp, you can set gitlab-lsp-show-completions-with-other-clients
to nil and use only gitlab-lsp-complete
.
- Completion is slow -- yeah, the LSP server may take a while to complete. You may have to customize
lsp-response-timeout
. - Now my other completions from (insert other LSP server here) take forever to show -- Yeah, the tooltip may be delayed until gitlab-lsp has returned results. You can
(setopt gitlab-lsp-show-completions-with-other-clients nil)
and bindgitlab-lsp-complete
. This way, your standard, semantic completions work as expected, and you can still ask for code suggestions. - How can I manually trigger only gitlab-lsp -- use
gitlab-lsp-complete
- I only get no completions found -- make sure your lsp server has started correctly -- check the
*gitlab-lsp::stderr*
buffer and make sure that you see aToken is valid
message. - The single candidate appears as a very long line / The completion list obscures the code snippet to be inserted-- That's because
company-mode
is using the same UI for candidates and standard completions. This is a frontend issue, to be solved elsewhere.