107 lines
3.4 KiB
EmacsLisp
107 lines
3.4 KiB
EmacsLisp
;;=================================================================
|
|
;; Go Language Support
|
|
;;=================================================================
|
|
|
|
(use-package go-ts-mode
|
|
:ensure nil
|
|
:mode "\\.go\\'"
|
|
:hook
|
|
((go-ts-mode . lsp-deferred)
|
|
(go-ts-mode . fscotto/go-format-on-save))
|
|
:config
|
|
;; Go project commands
|
|
;; Modules
|
|
(define-key go-ts-mode-map (kbd "C-c m t") #'fscotto/go-mod-tidy)
|
|
(define-key go-ts-mode-map (kbd "C-c m d") #'fscotto/go-mod-download)
|
|
;; Test
|
|
(define-key go-ts-mode-map (kbd "C-c t p") #'fscotto/go-test-package)
|
|
(define-key go-ts-mode-map (kbd "C-c t a") #'fscotto/go-test-module)
|
|
(define-key go-ts-mode-map (kbd "C-c t t") #'fscotto/go-test-current-test)
|
|
;; Debug tests
|
|
(define-key go-ts-mode-map (kbd "C-c d t") #'dap-debug)
|
|
(define-key go-ts-mode-map (kbd "C-c d T")
|
|
(lambda ()
|
|
(interactive)
|
|
(dap-debug
|
|
(dap--debug-configuration
|
|
"Go :: Debug test at point")))))
|
|
|
|
(use-package go-mod-ts-mode
|
|
:ensure nil
|
|
:mode
|
|
(("/go\\.mod\\'" . go-mod-ts-mode)
|
|
("/go\\.sum\\'" . go-mod-ts-mode))
|
|
:hook
|
|
((go-mod-ts-mode . lsp-deferred)
|
|
;; restart gopls only when go.mod/go.sum are saved (buffer-local)
|
|
(go-mod-ts-mode . (lambda ()
|
|
(add-hook 'after-save-hook
|
|
(lambda ()
|
|
(when (lsp-workspaces)
|
|
(lsp-restart-workspace)))
|
|
nil t)))))
|
|
|
|
(with-eval-after-load 'project
|
|
(add-to-list 'project-vc-extra-root-markers "go.mod"))
|
|
|
|
(with-eval-after-load 'lsp-mode
|
|
;; gopls settings (single source of truth)
|
|
(lsp-register-custom-settings
|
|
'(("gopls.staticcheck" t)
|
|
("gopls.gofumpt" t)
|
|
;; ("gopls.experimentalWorkspaceModule" t)
|
|
("gopls.expandWorkspaceToModule" t)
|
|
("gopls.directoryFilters" ["-vendor"])
|
|
("gopls.analyses.unusedparams" t)
|
|
("gopls.analyses.shadow" t)
|
|
("gopls.analyses.nilness" t)
|
|
("gopls.analyses.useany" t)
|
|
("gopls.env" ((GO111MODULE . "on"))))))
|
|
|
|
(with-eval-after-load 'flycheck
|
|
;; Usa golangci-lint in Go
|
|
(add-hook 'go-ts-mode-hook
|
|
(lambda ()
|
|
(setq-local flycheck-checker 'golangci-lint)
|
|
(setq-local flycheck-check-syntax-automatically '(save mode-enabled))
|
|
(flycheck-mode 1))))
|
|
|
|
(use-package dap-dlv-go
|
|
:after (dap-mode go-ts-mode))
|
|
|
|
(with-eval-after-load 'dap-dlv-go
|
|
;; Debug all tests in module
|
|
(dap-register-debug-template
|
|
"Go :: Debug all tests"
|
|
(list :type "go"
|
|
:request "launch"
|
|
:name "Go :: Debug all tests"
|
|
:mode "test"
|
|
:program "${workspaceFolder}"
|
|
:cwd "${workspaceFolder}"))
|
|
|
|
;; Debug tests in current package
|
|
(dap-register-debug-template
|
|
"Go :: Debug package tests"
|
|
(list :type "go"
|
|
:request "launch"
|
|
:name "Go :: Debug package tests"
|
|
:mode "test"
|
|
:program "${fileDirname}"
|
|
:cwd "${fileDirname}"))
|
|
|
|
;; Debug test at point
|
|
(dap-register-debug-template
|
|
"Go :: Debug test at point"
|
|
(list :type "go"
|
|
:request "launch"
|
|
:name "Go :: Debug test at point"
|
|
:mode "test"
|
|
:program "${fileDirname}"
|
|
:cwd "${fileDirname}"
|
|
:args (list "-test.run" "${input:testName}"))))
|
|
|
|
(add-hook 'dap-terminated-hook
|
|
(lambda (_)
|
|
(delete-other-windows)))
|