blog-public/content/post/go-v-emacs.org
Denis Zheleztsov a5dd73f274 Initial public
Some content was deleted before this project
has been moved to public
2021-10-18 19:45:57 +03:00

3.1 KiB
Raw Permalink Blame History

+ date = "2017-10-31T22:19:50+03:00" draft = false title = "Go в GNU Emacs" tags = ["emacs"] comments = true +

На самом деле это выжимка вот этой статьи. Ну, а еще некоторые вещи в ней устарели, по-этому немного обновленная версия.

tl;dr

Поставим нужные пакеты в Емакс

(use-package exec-path-from-shell)
(use-package rainbow-delimiters)
(use-package go-snippets)
(use-package go-guru)
(use-package go-autocomplete)

Настроим go-mode

(use-package go-mode
        ;; Godef jump key binding
        :bind (("M-." . godef-jump)
               ("M-*" . pop-tag-mark))
        :init
        (setenv "GOPATH" (concat (getenv "HOME") "/.local"))
        :config
        (defun set-exec-path-from-shell-PATH ()
            (let ((path-from-shell (replace-regexp-in-string
                                    "[ \t\n]*$"
                                    ""
                                    (shell-command-to-string "/bin/bash -c '. ~/.bashrc && echo $PATH'"))))
                (setenv "PATH" path-from-shell)
                ;; (setq eshell-path-env path-from-shell) ; for eshell users
                (setq exec-path (split-string path-from-shell path-separator))))

        (when window-system (set-exec-path-from-shell-PATH))

        (defun my-go-mode-hook ()
            "My Golang hook."
            (setq gofmt-command "goimports")

            ;; Call Gofmt before saving
            (add-hook 'before-save-hook 'gofmt-before-save)

            ;; Set compile command
            (if (not (string-match "go" compile-command))
                    (set (make-local-variable 'compile-command)
                         "go build -v && go test -v && go vet"))

            ;; Enable rainbow
            (rainbow-delimiters-mode-enable)
            (auto-complete-for-go)
            (yas-initialize))

        ;; Go autocomplete
        (defun auto-complete-for-go ()
            "Enable golang autocomple."
            (auto-complete-mode 1))

        (add-hook 'go-mode-hook 'auto-complete-for-go)
        (add-hook 'completion-at-point-functions 'go-complete-at-point)
        (add-hook 'go-mode-hook 'my-go-mode-hook)
        (add-hook 'go-mode-hook #'rainbow-delimiters-mode))

Тут в :bind можно прописать свои сочетания клавиш.

Да, всегда используйте use-package. Это сэкономит кучу времени в будущем.

Теперь добавим GOPATH в ~/.bashrc

echo 'export GOPATH=${HOME}/.local' >> ~/.bashrc
. ~/.bashrc

Выкачиваем зависимости Go

go get -t -v golang.org/x/tools/cmd/goimports
go get -t -v golang.org/x/tools/cmd/guru
go get -t -v github.com/rogpeppe/godef

Готово. Код конфига доступен по ссылке.