Gopls: Использование Emacs
Установка gopls
Для использования gopls с Emacs, необходимо сначала
установить исполняемый файл gopls и убедиться, что каталог,
содержащий полученный исполняемый файл (либо $(go env GOBIN), либо $(go env GOPATH)/bin), находится в вашем PATH.
Выбор клиента LSP для Emacs
Для использования gopls с Emacs, необходимо выбрать и установить пакет клиента LSP для Emacs. Два популярных пакета клиента — это LSP Mode и Eglot.
LSP Mode использует подход с «всем в комплекте», с множеством интеграций, включённых «из коробки», а также дополнительным поведением, предоставляемым самим lsp-mode.
Eglot использует минималистичный подход, сосредотачиваясь на плавной интеграции с другими уже существующими пакетами. Он предоставляет несколько собственных команд eglot-, но по умолчанию не добавляет дополнительных сочетаний клавиш.
После того как вы выберете, какой клиент вы хотите использовать, установите его согласно инструкциям пакета: см. Eglot 1-2-3 или Установка LSP Mode.
Общая конфигурация
Как Eglot, так и LSP Mode могут интегрироваться с популярными пакетами из экосистемы Emacs:
- Встроенный пакет
xrefпредоставляет перекрёстные ссылки. - Встроенный пакет Flymake предоставляет встроенный слой диагностики в реальном времени.
- Режим Company отображает кандидаты автозавершения кода (с более богатым интерфейсом, чем у встроенного
completion-at-point).
Eglot предоставляет документацию с использованием встроенного режима ElDoc, тогда как LSP Mode по умолчанию предоставляет документацию с помощью собственного режима lsp-ui.
По умолчанию Eglot определяет корень проекта с использованием пакета [project]. В режиме LSP это поведение может быть настроено с помощью параметра lsp-auto-guess-root.
Настройка режима LSP
Загрузка режима LSP в .emacs
<code class="language-elisp">(require 'lsp-mode) (add-hook 'go-mode-hook #'lsp-deferred) ;; Настройка хуков перед сохранением для форматирования буфера и добавления/удаления импортов. ;; Убедитесь, что другие хуки gofmt/goimports не включены. (defun lsp-go-install-save-hooks () (add-hook 'before-save-hook #'lsp-format-buffer t t) (add-hook 'before-save-hook #'lsp-organize-imports t t)) (add-hook 'go-mode-hook #'lsp-go-install-save-hooks) </code>
Настройка gopls через режим LSP
См. настройки для получения информации о доступных параметрах gopls.
Стабильные параметры gopls имеют соответствующие переменные конфигурации в lsp-mode.
Например, (setq lsp-gopls-use-placeholders nil) отключит заполнители
в сниппетах завершения. См. lsp-go для списка доступных переменных.
Экспериментальные параметры могут быть настроены через lsp-register-custom-settings:
<code class="language-lisp">(lsp-register-custom-settings
'(("gopls.completeUnimported" t t)
("gopls.staticcheck" t t)))
</code>
Обратите внимание, что после изменения настроек необходимо перезапустить gopls, например, командой M-x lsp-restart-workspace.
Настройка Eglot
Настройка project для Go модулей в .emacs
Eglot использует встроенный пакет project для определения рабочей области LSP для вновь открытого буфера. Пакет project не имеет встроенной поддержки GOPATH или Go модулей. К счастью, можно задать пользовательский хук, который будет указывать на ближайший родительский файл go.mod (то есть корень Go модуля) как корень проекта.
<code class="language-elisp">(require 'project) (defun project-find-go-module (dir) (when-let ((root (locate-dominating-file dir "go.mod"))) (cons 'go-module root))) (cl-defmethod project-root ((project (head go-module))) (cdr project)) (add-hook 'project-find-functions #'project-find-go-module) </code>
Загрузка Eglot в .emacs
<code class="language-elisp">;; Необязательно: загрузите другие пакеты перед eglot для включения интеграций. (require 'company) (require 'yasnippet) (require 'go-mode) (require 'eglot) (add-hook 'go-mode-hook 'eglot-ensure) ;; Необязательно: установите eglot-format-buffer как хук перед сохранением. ;; Глубина -10 размещает его перед уведомлением willSave от eglot, ;; таким образом, уведомление будет отображать фактическое содержимое, которое будет сохранено. (defun eglot-format-buffer-before-save () (add-hook 'before-save-hook #'eglot-format-buffer -10 t)) (add-hook 'go-mode-hook #'eglot-format-buffer-before-save) </code>
Используйте M-x eglot-upgrade-eglot для обновления до последней версии Eglot.
Настройка gopls через Eglot
См. настройки для получения информации о доступных настройках gopls.
Настройки сервера LSP управляются переменной eglot-workspace-configuration, которую можно установить либо глобально в файле .emacs, либо в файле .dir-locals.el в корневой директории проекта.
.emacs:
<code class="language-elisp">(setq-default eglot-workspace-configuration '((:gopls . ((staticcheck . t) (matcher . "CaseSensitive"))))) </code>
.dir-locals.el:
<code class="language-elisp">((nil (eglot-workspace-configuration . ((gopls . ((staticcheck . t) (matcher . "CaseSensitive"))))))) </code>
Организация импортов с помощью Eglot
gopls предоставляет функциональность организации импортов goimports в виде действия кода LSP, которое можно вызвать по необходимости, выполнив M-x eglot-code-actions (или выбрав клавишу, привязанную к функции eglot-code-actions), и выбрав Organize Imports в подсказке.
Для автоматической организации импортов перед сохранением добавьте хук:
<code class="language-elisp">(add-hook 'before-save-hook (lambda () (call-interactively 'eglot-code-action-organize-imports)) nil t) </code>
Устранение неполадок
Частые ошибки:
- Когда Emacs запрашивает вашу директорию проекта, если вы используете модули, вы должны выбрать корневую директорию модуля (то есть директорию с файлом «go.mod»). Если вы используете GOPATH, выберите ваш $GOPATH в качестве директории.
- Emacs должен иметь правильно установленную среду (PATH, GOPATH и т.д.). Можно выполнить
M-x getenv <RET> PATH <RET>, чтобы увидеть, установлен ли PATH в Emacs. Если нет, можно попробовать запустить Emacs из терминала, используя этот пакет, или перенести конфигурацию оболочки из.bashrcв.profileи выполнить выход и повторный вход в систему. - Убедитесь, что установлен только один клиент LSP. (Например, если вы используете
lsp-mode, убедитесь, что вы не включаете такжеeglot.) - Ищите ошибки в буфере
*lsp-log*или выполнитеM-x eglot-events-buffer. - Обратитесь за помощью в канал
#emacsна Gophers slack.
Исходные файлы этой документации можно найти в golang.org/x/tools/gopls/doc.