#1.4 GO开发工具

本节我将介绍几个开发工具，它们都具有自动化提示，自动化fmt功能,因为它们都是跨平台的,所以安装步骤之类的都是通用的。

##liteide

  liteide这个工具是由我们国内牛人VFC写的，使用起来相当的方便，他支持代码自动提示、项目、项目编译等，[下载地址](http://code.google.com/p/golangide/downloads/list)

  根据自己的系统下载相应的版本，这些都是已经编译好的文件，window和ubuntu系统直接打开bin下面的liteide，mac通过launchpad打开liteide
  
  ![](images/1.4.liteide.png?raw=true)
  
  大家可以看到左边是文件项目列表，左下角有相应的文件类导航，顶部有相应的调试工具和编译工具，主要的这个工具支持自动化提示同时支持本文件中函数的提示，目前还没有做到整个项目中函数的提示。配置也是很方便的，只要你已经安装前面几个小节配置了相应的go和gopath，那么打开软件之后，就可以直接新建项目开始用了。
  
  如果你使用的是32位版本,那么按照以上步骤配置就可以了，而如果你使用的是64位版本,则需要修改 查看=》选项=》LiteEnv=>Win64.env=>GOROOT=c:\go-w64 为你的GO ROOT 不然无法使用build命令
  

##Sublime text

  这里将介绍sublime text2+gosublime+gocode的组合，那么为什么选择这个组合呢？
  
  - 自动化提示代码,如下图所示
    ![](images/1.4.sublime1.png?raw=true)
    
  - 保存的时候自动格式化代码，让您编写的代码更加美观，符合golang的标准
  - 支持项目管理
    ![](images/1.4.sublime2.png?raw=true)
  - 支持语法高亮
  - sublime text2免费，只是保存次数达到一定数量之后就会提示是否购买，点击取消继续用，和正式注册版本没有任何区别 
  
  接下来就开始讲如何安装，下载[sublimetext](http://www.sublimetext.com/) 
  
  根据自己相应的系统下载相应的版本，然后打开sublimetext,对于不熟悉sublimetext的同学可以先看一下这篇文章  [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'

   这个时候你重启一下sublimetext，可以发现在在菜单栏多了一个如下的栏目,说明package control已经安装成功了

  ![](images/1.4.sublime3.png?raw=true)

 2.接下来安装gocode https://github.com/nsf/gocode
        打开终端运行如下代码
 
        go get -u github.com/nsf/gocode
        go get -u github.com/DisposaBoy/MarGo
    
  这个时候我们会发现在gopath/bin下面多了两个可执行文件，gocode和margo，这两个文件会在gosublime起来的时候自动启动
  
  3.安装完之后就可以安装sublimetext的插件了，安装gosublime、sidebar(增强边栏)，安装插件之后记得重启sublimetext生效,ctrl+shift+p打开package controll 输入pcip
  
  这个时候看左下角显示正在读取包数据，完成之后出现如下界面
  
  ![](images/1.4.sublime4.png?raw=true)

  这个时候输入gosublime，按确定就开始安装了，同理应用于sidebar 
  
  4.验证是否安装成功，你可以打开sublimetext，打开main.go，看看语法是不是高亮了,输入import是不是自动化提示了，import "fmt"之后，输入fmt.是不是自动化提示有函数了 
  
  如果已经出现这个提示，那说明你已经安装完成了，并且完成了自动提示
  
  如果没有出现这样的提示，一般就是你的path没有配置正确，你可以打开终端，输入gocode，是不是能够正确运行，如果不行就说明path没有配置正确


## Vim
Vim是从vi发展出来的一个文本编辑器, 代码补完、编译及错误跳转等方便编程的功能特别丰富，在程序员中被广泛使用。

  ![](images/1.4.vim.png?raw=true)

 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"

 5. 恭喜你，安装完成，你现在可以使用 **C-x C-o** 体验一下开发Go的乐趣.
    

## Emacs
Emacs传说中的神器，她不仅仅是一个编辑器，它是一个整合环境，或可称它为集成开发环境，这些功能如让使用者置身于全功能的操作系统中

  ![](images/1.4.emacs.png?raw=true)

 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 Shell命令](<1.3.md>)
   * 下一节: [总结](<1.5.md>)

## LastModified 
   * $Id$
