参考链接

  1. 语法高亮

    1
    cp $GOROOT/misc/emacs/* ~/.emacs.d/
  2. 安装gocode

    1
    go get -u github.com/nsf/gocode
  3. 配置gocode

1
2
3
4
5
6
7
8
9
$ cd $GOPATH/src/github.com/nsf/gocode/emacs
$ cp go-autocomplete.el ~/.emacs.d/
$ gocode set propose-builtins true
propose-builtins true
$ gocode set lib-path "/Volumes/home/chenza/gopath/pkg/darwin_amd64" # 换为你自己的路径
lib-path "/Volumes/home/chenza/gopath/pkg/darwin_amd64"
$ gocode set
propose-builtins true
lib-path "/Volumes/home/chenza/gopath/pkg/darwin_amd64"
  1. 配置autocompletion

安装:

1
make install DIR=$HOME/.emacs.d/auto-complete
  1. 配置.emacs
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    ;;auto-complete
    (require 'auto-complete-config)
    (add-to-list 'ac-dictionary-directories "~/.emacs.d/auto-complete/ac-dict")
    (ac-config-default)
    (local-set-key (kbd "M-/") 'semantic-complete-analyze-inline)
    (local-set-key "." 'semantic-complete-self-insert)
    (local-set-key ">" 'semantic-complete-self-insert)

    ;; golang mode
    (require 'go-mode-load)
    (require 'go-autocomplete)
    ;; speedbar
    ;; (speedbar 1)
    (speedbar-add-supported-extension ".go")
    (add-hook
    'go-mode-hook
    '(lambda ()
    ;; gocode
    (auto-complete-mode 1)
    (setq ac-sources '(ac-source-go))
    ;; Imenu & Speedbar
    (setq imenu-generic-expression
    '(("type" "^type *\\([^ \t\n\r\f]*\\)" 1)
    ("func" "^func *\\(.*\\) {" 1)))
    (imenu-add-to-menubar "Index")
    ;; Outline mode
    (make-local-variable 'outline-regexp)
    (setq outline-regexp "//\\.\\|//[^\r\n\f][^\r\n\f]\\|pack\\|func\\|impo\\|cons\\|var.\\|type\\|\t\t*....")
    (outline-minor-mode 1)
    (local-set-key "\M-a" 'outline-previous-visible-heading)
    (local-set-key "\M-e" 'outline-next-visible-heading)
    ;; Menu bar
    (require 'easymenu)
    (defconst go-hooked-menu
    '("Go tools"
    ["Go run buffer" go t]
    ["Go reformat buffer" go-fmt-buffer t]
    ["Go check buffer" go-fix-buffer t]))
    (easy-menu-define
    go-added-menu
    (current-local-map)
    "Go tools"
    go-hooked-menu)

    ;; Other
    (setq show-trailing-whitespace t)
    ))

    ;; helper function
    (defun go ()
    "run current buffer"
    (interactive)
    (compile (concat "go run " (buffer-file-name))))


    ;; helper function
    (defun go-fmt-buffer ()
    "run gofmt on current buffer"
    (interactive)
    (if buffer-read-only
    (progn
    (ding)
    (message "Buffer is read only"))

    (let ((p (line-number-at-pos))
    (filename (buffer-file-name))
    (old-max-mini-window-height max-mini-window-height))

    (show-all)
    (if (get-buffer "*Go Reformat Errors*")
    (progn
    (delete-windows-on "*Go Reformat Errors*")
    (kill-buffer "*Go Reformat Errors*")))

    (setq max-mini-window-height 1)
    (if (= 0 (shell-command-on-region (point-min) (point-max) "gofmt" "*Go Reformat Output*" nil "*Go Reformat Errors*" t))
    (progn
    (erase-buffer)
    (insert-buffer-substring "*Go Reformat Output*")
    (goto-char (point-min))
    (forward-line (1- p)))

    (with-current-buffer "*Go Reformat Errors*"
    (progn
    (goto-char (point-min))
    (while (re-search-forward "<standard input>" nil t)
    (replace-match filename))

    (goto-char (point-min))
    (compilation-mode)))
    )

    (setq max-mini-window-height old-max-mini-window-height)
    (delete-windows-on "*Go Reformat Output*")
    (kill-buffer "*Go Reformat Output*")))
    )

    ;; helper function
    (defun go-fix-buffer ()
    "run gofix on current buffer"
    (interactive)
    (show-all)
    (shell-command-on-region (point-min) (point-max) "go tool fix -diff"))

知识共享授权条款
本著作Chen, Zai-Chun制作,以知识共享 姓名标示-相同方式分享 4.0 国际 授权条款释出

留言

Sep 26 2012