全ての言語を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の補完を使う
))