怎么像 vscode 一样对 go 的静态检查

怎么像 vscode 一样调用 staticcheck 静态检查警告 这是我的配置文件

;; 打开配置文件
(defun open-init-file()
  (interactive)
  (find-file "~/.emacs.d/init.el"))

(setq inhibit-startup-message t)                          ; 禁用 启动消息
(setq initial-frame-alist '((width . 140) (height . 50))) ; 设置初始大小
(setq default-frame-alist '((width . 140) (height . 50))) ; 设置默认大小

(setq-default tab-width 4)
(defalias 'yes-or-no-p 'y-or-n-p)

(scroll-bar-mode -1)                 ; 禁用 滚动条模式
(tool-bar-mode -1)                   ; 禁用 工具栏模式
(tooltip-mode -1)                    ; 禁用 工具提示模式
(menu-bar-mode -1)                   ; 禁用 菜单栏模式
(global-display-line-numbers-mode 1) ; 启用 显示行号模式

;; (load-theme 'tango-dark) ; 加载主题

(global-set-key (kbd "<f12>") 'open-init-file) ; 打开配置文件
(global-set-key (kbd "C-c R") 'restart-emacs)  ; 重启emacs

(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(package-initialize) ; 初始化包
(unless package-archive-contents
  (package-refresh-contents)) ; 刷新包

(unless (package-installed-p 'use-package)
  (package-install 'use-package)) ; 安装 use-package

(require 'use-package)
(setq use-package-always-ensure t) ; 确保所有包可用

;; ivy 分为三个包:ivy、swiper和counsel; 通过安装counsel,另外两个将作为依赖项引入。
(use-package counsel
  :init
  (setq ivy-height '10)
  (setq ivy-use-virtual-buffers t)
  (setq ivy-count-format "(%d/%d)")
  :bind
  ("C-s" . swiper-isearch)
  ("M-x" . counsel-M-x)
  ("C-x C-f" . counsel-find-file)
  ("M-y" . counsel-yank-pop)
  ("C-x b" . ivy-switch-buffer)
  :config
  (ivy-mode 1))

;; 在弹出窗口中显示可用的按键绑定
(use-package which-key
  :config (which-key-mode 1))

;; ivy 界面更加友好。
(use-package ivy-rich
  :config (ivy-rich-mode 1))

;; 快速切换窗口
(use-package ace-window
  :bind ("C-x o" . ace-window))

;; 轻松管理和浏览 Emacs 中的项目
(use-package projectile
  :bind-keymap
  ("s-p" . projectile-command-map)
  :config (projectile-mode 1))

;; Emacs 中的 Git 瓷器
(use-package magit)

;; Emacs 的另一个片段扩展
(use-package yasnippet)

;; Go 编程语言的主要模式
(use-package go-mode
  :hook (go-mode . lsp-deferred)
  (go-mode . yas-minor-mode))

;; LSP模式
(use-package lsp-mode
  :commands (lsp lsp-deferred)
  :init
  (setq lsp-keymap-prefix "s-l")
  :bind
  ("C-c f e" . 'flymake-goto-next-error)          ; 转到下一个诊断错误
  ("C-c f d" . 'flymake-show-project-diagnostics) ; 显示当前项目的 Flymake 诊断列表
  :hook
  (lsp-mode . lsp-enable-which-key-integration)
  (before-save . lsp-format-buffer))

;; 模块化文本补全框架
(use-package company
  :after lsp-mode
  :config
  (setq company-idle-delay 0)
  (setq company-minimum-prefix-length 1)
  :hook (prog-mode . company-mode))

(use-package lsp-ui
  :config
  (setq lsp-ui-sideline-show-diagnostics t)  ; 在副线中显示诊断消息
  (setq lsp-ui-sideline-show-hover t)        ; 在边线显示悬停消息
  (setq lsp-ui-sideline-show-code-actions t) ; 在副线中显示代码操作
  (setq lsp-ui-sideline-delay 3)             ; 显示边线之前等待的秒数
  :hook (lsp-mode . lsp-ui-mode))

(use-package lsp-ivy)

(use-package dashboard
  :init
  (dashboard-setup-startup-hook)
  :config
  (setq dashboard-items '((recents . 5) (projects . 5)))
  :bind ("<f5>" . dashboard-open))

;; 跳转到可见文本中的任意位置并快速选择文本
(use-package avy
  :bind
  ("C-;" . 'avy-goto-char)
  ("C-'" . 'avy-goto-char-2)
  ("M-g f" . 'avy-goto-line)
  ("M-g w" . 'avy-goto-word-1)
  ("M-g e" . 'avy-goto-word-0)
  ("C-c C-j" . 'avy-resume))

;; 使用 posframe 来显示 Ivy(ivy 显示在屏幕中间)
(use-package ivy-posframe
  :config
  (setq ivy-posframe-display-functions-alist '((t . ivy-posframe-display-at-window-center)))
  (ivy-posframe-mode 1))

;; 一系列非常有用的扩展
(use-package crux
  :bind
  ("C-j" . crux-top-join-line)                                    ; 连接行
  ("C-k" . crux-kill-whole-line)                                  ; 首先杀死行尾,然后杀死整行
  ("<S-return>" . crux-smart-open-line-above)                     ; 在当前行上方插入一个空行并正确缩进
  ("<C-return>" . crux-smart-open-line)                           ; 插入一个空行并正确缩进
  ("C-c d" . crux-duplicate-current-line-or-region)               ; 复制当前行(或区域)
  ("C-c M-d" . crux-duplicate-and-comment-current-line-or-region) ; 复制并注释当前行(或区域)
  )

这是 emacs 截图

flymake-go-staticcheck 有个这个包

(use-package flymake-go-staticcheck
  :hook
  (go-mode . flymake-go-staticcheck-enable)
  (go-mode . flymake-mode))

必须要刷新 buffer 才能进行检查

有办法做到实时更新吗

只看到 flymake-go-staticcheck-enable flymake-go-staticcheck-disable 两个方法

eglot 就可以, 会对 go 有各种警告和语法提示

;; Flymake-go-staticcheck
(defun eat/flymake-go-staticcheck-enable ()
  "Enable flymake-go-staticcheck for all go buffer.
Call `flymake-go-staticcheck-enable' interactive will only
enable this in current buffer, add to `go-mode-hook' to make
it enable on all go buffer."
  (interactive)
  (flymake-go-staticcheck-enable)
  (add-hook 'go-mode-hook #'flymake-go-staticcheck-enable))