Edited at

emacsで快適なGo言語ライフを送るための設定

More than 1 year has passed since last update.

全ての言語をemacsで書きたい!

分かります、その気持ち。特にコード補完やハイライト、インデントの自動整形などの機能は必須ですよね。

今回はGo言語を快適に書くための設定をしてみました。

【参考】

emacs でgolang編集環境を作る


前提

・Go言語導入済みであること

・emacsにpackage.elが導入済みであること


Go言語packageの入手


必要なパッケージをダウンロード

go get github.com/rogpeppe/godef # 関数定義等の参照パッケージ

go get -u github.com/nsf/gocode # 補完パッケージ
go get github.com/golang/lint/golint # flycheckでシンタックスエラーを検知
go get github.com/kisielk/errcheck # flycheckでシンタックスエラーを検知

go getコマンドでで$GOPATH配下にpackageがダウンロードされます。


emacsへの各種packageの導入

Go言語のシンタックスハイライト用にgo-modeを、コード補完のためにcompany-goをemacsに導入しておきます。

M-x package-list-packages # packageリストを更新しておく

M-x package-install go-mode
M-x package-install company-go


elispの設定

elispは最終的に下記の設定となりました。


init.el

;; Goのパスを通す

(add-to-list 'exec-path (expand-file-name "/usr/local/go/bin/"))
;; go get で入れたツールのパスを通す
(add-to-list 'exec-path (expand-file-name "/Users/user/dev/go/bin/"))

;; flycheck-modeを有効化してシンタックスエラーを検知
(add-hook 'go-mode-hook 'flycheck-mode)
(add-hook 'go-mode-hook (lambda()
(add-hook 'before-save-hook' 'gofmt-before-save)
(local-set-key (kbd "M-.") 'godef-jump)
(set (make-local-variable 'company-backends) '(company-go))
(setq indent-tabs-mode nil) ; タブを利用
(setq c-basic-offset 4) ; tabサイズを4にする
(setq tab-width 4)))

;; company-modeとの連携してコード補完する
(require 'company-go)
(add-hook 'go-mode-hook (lambda()
(company-mode)
(setq company-transformers '(company-sort-by-backend-importance)) ;; ソート順
(setq company-idle-delay 0) ; 遅延なしにすぐ表示
(setq company-minimum-prefix-length 3) ; デフォルトは4
(setq company-selection-wrap-around t) ; 候補の最後の次は先頭に戻る
(setq completion-ignore-case t)
(setq company-dabbrev-downcase nil)
(global-set-key (kbd "C-M-i") 'company-complete)
;; C-n, C-pで補完候補を次/前の候補を選択
(define-key company-active-map (kbd "C-n") 'company-select-next)
(define-key company-active-map (kbd "C-p") 'company-select-previous)
(define-key company-active-map (kbd "C-s") 'company-filter-candidates) ;; C-sで絞り込む
(define-key company-active-map [tab] 'company-complete-selection) ;; TABで候補を設定
(define-key emacs-lisp-mode-map (kbd "C-M-i") 'company-complete) ;; 各種メジャーモードでも C-M-iで company-modeの補完を使う
))