From a1ff0513aa48d7e68c308e402189dc01b29b77c8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 30 Mar 2025 16:56:05 -0400 Subject: [PATCH] feat(go): add 'go generate ...' keybinds Close: #8281 Co-authored-by: chloelee767 --- modules/lang/go/autoload.el | 39 +++++++++++++++++++++++++++++++++++++ modules/lang/go/config.el | 4 ++++ 2 files changed, 43 insertions(+) diff --git a/modules/lang/go/autoload.el b/modules/lang/go/autoload.el index 6247aea59..8c03038ec 100644 --- a/modules/lang/go/autoload.el +++ b/modules/lang/go/autoload.el @@ -86,6 +86,45 @@ (error "Must be in a _test.go file"))) +;;; go generate ... + +(defun +go--generate (dir args) + (unless (file-directory-p dir) + (user-error "Directory does not exist: %s" dir)) + (+go--spawn + (format "cd %s && go generate %s" + (shell-quote-argument dir) + args))) + +;;;###autoload +(defun +go/generate-file () + "Run \\='go generate' for the current file." + (interactive) + (+go--assert-buffer-visiting) + (+go--generate default-directory + (file-name-nondirectory buffer-file-name))) + +;;;###autoload +(defun +go/generate-dir () + "Run \\='go generate' for the current directory, recursively." + (interactive) + (+go--generate default-directory "./...")) + +;;;###autoload +(defun +go/generate-all (&optional arg) + "Run \\='go generate' for the entire project. + +Will prompt for the project if you're not in one or if the prefix ARG is +non-nil." + (interactive "P") + (if-let* + ((proot + (let ((projectile-require-project-root 'prompt)) + (projectile-ensure-project (unless arg (doom-project-root)))))) + (+go--generate (file-truename proot) "./...") + (user-error "Not in a valid project"))) + + ;;;###autoload (defun +go/play-buffer-or-region (&optional beg end) "Evaluate active selection or buffer in the Go playground." diff --git a/modules/lang/go/config.el b/modules/lang/go/config.el index 56cf2a9be..36dec91c2 100644 --- a/modules/lang/go/config.el +++ b/modules/lang/go/config.el @@ -30,6 +30,10 @@ :desc "go run ." "r" (cmd! (compile "go run .")) :desc "go build" "b" (cmd! (compile "go build")) :desc "go clean" "c" (cmd! (compile "go clean"))) + (:prefix ("g" . "generate") + "f" #'+go/generate-file + "d" #'+go/generate-dir + "a" #'+go/generate-all) (:prefix ("t" . "test") "t" #'+go/test-rerun "a" #'+go/test-all