251 lines
11 KiB
Markdown
251 lines
11 KiB
Markdown
#1.4 Go开发工具
|
||
|
||
本节我将介绍几个开发工具,它们都具有自动化提示,自动化fmt功能。因为它们都是跨平台的,所以安装步骤之类的都是通用的。
|
||
|
||
##LiteIDE
|
||
|
||
LiteIDE是一款专门为Go语言开发的集成开发环境(IDE),由visualfc编写。支持项目管理、集成构建、GDB调试、语法高亮、自动补全、大纲显示等功能。下载地址: [http://code.google.com/p/golangide/downloads/list](http://code.google.com/p/golangide/downloads/list),根据自己的系统下载相应的发行版本。Windows和Ubuntu系统可直接打开bin下面的liteide;Mac则需通过LaunchPad打开LiteIDE.app。
|
||
|
||

|
||
|
||
LiteIDE配置需要按照前面几个小节配置了相应的go和`$GOPATH`(LiteIDE中也可以图形化配置LiteIDE专用的GOPATH)。LiteIDE当前的编译环境可以通过编译工具栏上的环境配置来切换,如切换32位和64位,针对自己的系统,可能需要修改相应的LiteEnv环境变量,如64位版本,LiteIDE => 查看 => 选项 => LiteEnv => Win64.env => GOROOT=c:\go-w64 为你的`$GOROOT`,不然会无法使用`build`命令。
|
||
|
||
配置好LiteIDE后,可以打开或拖动任何目录到LiteIDE中作为项目,LiteIDE的编译是针对当前编辑文档所属目录来执行相应的go命令,所以编译时要先打开相应的Go文件。LiteIDE仿IDEA界面,支持项目浏览、文件系统,Package浏览、Golang文档检索、类视图、大纲显示等多个工具窗口的切换。
|
||
|
||
代码补全需要安装gocode,目前LiteIDE的自动化提示只支持本文件中函数的提示,还没有做到整个项目中函数的提示。
|
||
|
||
|
||
##Sublime Text
|
||
|
||
这里将介绍Sublime Text 2(以下简称Sublime)+GoSublime+gocode+MarGo的组合,那么为什么选择这个组合呢?
|
||
|
||
- 自动化提示代码,如下图所示
|
||

|
||
|
||
- 保存的时候自动格式化代码,让您编写的代码更加美观,符合Go的标准。
|
||
- 支持项目管理
|
||

|
||
- 支持语法高亮
|
||
- Sublime Text 2可免费使用,只是保存次数达到一定数量之后就会提示是否购买,点击取消继续用,和正式注册版本没有任何区别。
|
||
|
||
接下来就开始讲如何安装,下载[Sublime](http://www.sublimetext.com/)
|
||
|
||
根据自己相应的系统下载相应的版本,然后打开Sublime,对于不熟悉Sublime的同学可以先看一下这篇文章[Sublime Text 2 入门及技巧](http://lucifr.com/139225/sublime-text-2-tricks-and-tips/)
|
||
|
||
1. 打开之后安装 Package Control:Ctrl+` 打开命令行,执行如下代码:
|
||
|
||
import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation'
|
||
|
||
这个时候重启一下Sublime,可以发现在在菜单栏多了一个如下的栏目,说明Package Control已经安装成功了。
|
||
|
||

|
||
|
||
2. 接下来安装gocode和MarGo。
|
||
打开终端运行如下代码(需要git)
|
||
|
||
go get -u github.com/nsf/gocode
|
||
go get -u github.com/DisposaBoy/MarGo
|
||
|
||
这个时候我们会发现在`$GOPATH/bin`下面多了两个可执行文件,gocode和MarGo,这两个文件会在GoSublime加载时自动启动。
|
||
|
||
3. 安装完之后就可以安装Sublime的插件了。需安装GoSublime、SidebarEnhancements和Go Build,安装插件之后记得重启Sublime生效,Ctrl+Shift+p打开Package Controll 输入`pcip`(即“Package Control: Install Package”的缩写)。
|
||
|
||
这个时候看左下角显示正在读取包数据,完成之后出现如下界面
|
||
|
||

|
||
|
||
这个时候输入GoSublime,按确定就开始安装了。同理应用于SidebarEnhancements和Go Build。
|
||
|
||
4. 验证是否安装成功,你可以打开Sublime,打开main.go,看看语法是不是高亮了,输入`import`是不是自动化提示了,`import "fmt"`之后,输入`fmt.`是不是自动化提示有函数了。
|
||
|
||
如果已经出现这个提示,那说明你已经安装完成了,并且完成了自动提示。
|
||
|
||
如果没有出现这样的提示,一般就是你的`$PATH`没有配置正确。你可以打开终端,输入gocode,是不是能够正确运行,如果不行就说明`$PATH`没有配置正确。
|
||
|
||
|
||
## Vim
|
||
Vim是从vi发展出来的一个文本编辑器, 代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
|
||
|
||

|
||
|
||
1. 配置vim高亮显示
|
||
|
||
cp -r $GOROOT/misc/vim/* ~/.vim/
|
||
|
||
2. 在~/.vimrc文件中增加语法高亮显示
|
||
|
||
filetype plugin indent on
|
||
syntax on
|
||
|
||
3. 安装[Gocode](https://github.com/nsf/gocode/)
|
||
|
||
go get -u github.com/nsf/gocode
|
||
|
||
gocode默认安装到`$GOPATH/bin`下面,需要把`$GOPATH/bin`路径设置到系统`$PATH`里面。
|
||
|
||
4. 配置[Gocode](https://github.com/nsf/gocode/)
|
||
|
||
~ cd $GOPATH/src/github.com/nsf/gocode/vim
|
||
~ ./update.bash
|
||
~ gocode set propose-builtins true
|
||
propose-builtins true
|
||
~ gocode set lib-path "/home/border/gocode/pkg/linux_amd64"
|
||
lib-path "/home/border/gocode/pkg/linux_amd64"
|
||
~ gocode set
|
||
propose-builtins true
|
||
lib-path "/home/border/gocode/pkg/linux_amd64"
|
||
|
||
>gocode set里面的两个参数的含意说明:
|
||
>
|
||
>propose-builtins:是否自动提示Go的内置函数、类型和常量,默认为false,不提示。
|
||
>
|
||
>lib-path:默认情况下,gocode只会搜索**$GOPATH/pkg/$GOOS_$GOARCH **和 **$GOROOT/pkg/$GOOS_$GOARCH**目录下的包,当然这个设置就是可以设置我们额外的lib能访问的路径
|
||
|
||
|
||
|
||
5. 恭喜你,安装完成,你现在可以使用`:e main.go`体验一下开发Go的乐趣。
|
||
|
||
|
||
## Emacs
|
||
Emacs传说中的神器,她不仅仅是一个编辑器,它是一个整合环境,或可称它为集成开发环境,这些功能如让使用者置身于全功能的操作系统中。
|
||
|
||

|
||
|
||
1. 配置Emacs高亮显示
|
||
|
||
cp $GOROOT/misc/emacs/* ~/.emacs.d/
|
||
|
||
2. 安装[Gocode](https://github.com/nsf/gocode/)
|
||
|
||
go get -u github.com/nsf/gocode
|
||
|
||
gocode默认安装到`$GOPATH/bin`里面下面,需要把`$GOPATH/bin`路径设置到系统`$PATH`里面。
|
||
|
||
3. 配置[Gocode](https://github.com/nsf/gocode/)
|
||
|
||
|
||
~ 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 "/home/border/gocode/pkg/linux_amd64" // 换为你自己的路径
|
||
lib-path "/home/border/gocode/pkg/linux_amd64"
|
||
~ gocode set
|
||
propose-builtins true
|
||
lib-path "/home/border/gocode/pkg/linux_amd64"
|
||
|
||
4. 需要安装 [Auto Completion](http://www.emacswiki.org/emacs/AutoComplete)
|
||
|
||
下载AutoComplete并解压
|
||
|
||
~ make install DIR=$HOME/.emacs.d/auto-complete
|
||
|
||
配置~/.emacs文件
|
||
|
||
;;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)
|
||
|
||
详细信息参考: http://www.emacswiki.org/emacs/AutoComplete
|
||
|
||
5. 配置.emacs
|
||
|
||
;; 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"))
|
||
|
||
6. 恭喜你,你现在可以体验在神器中开发Go的乐趣。默认speedbar是关闭的,如果打开需要把 ;; (speedbar 1) 前面的注释去掉,或者也可以通过 *M-x speedbar* 手动开启。
|
||
|
||
## links
|
||
* [目录](<preface.md>)
|
||
* 上一节: [Go 命令](<1.3.md>)
|
||
* 下一节: [总结](<1.5.md>)
|
||
|
||
## LastModified
|
||
* $Id$
|