zoukankan      html  css  js  c++  java
  • go-vim配置

    一、环境准备:

      系统环境说明:

    1 [root@docker golang]# cat /etc/redhat-release 
    2 CentOS Linux release 7.2.1511 (Core) 
    3 [root@docker golang]# uname -a
    4 Linux docker 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
    5 [root@docker golang]# 

      准备一个go文件,用于观察配置插件过程中的变化:

    1 //hellogolang.go
    2 package main
    3 import "fmt"
    4 func main() {
    5         fmt.Println("Hello Golang!")
    6 }

    二、插件配置之路:

      1、Vundle.vim

    1 #mkdir ~/.vim/bundle
    2 #git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim  

        配置vimrc:创建~/.vimrc文件(如果你没有这个文件的话),在文件顶部添加有关Vundle.vim的配置:

     1 set nocompatible              " be iMproved, required
     2 filetype off                  " required
     3 
     4 " set the runtime path to include Vundle and initialize
     5 set rtp+=~/.vim/bundle/Vundle.vim
     6 call vundle#begin()
     7 
     8 " let Vundle manage Vundle, required
     9 Plugin 'gmarik/Vundle.vim'
    10 
    11 " All of your Plugins must be added before the following line
    12 call vundle#end()            " required
    13 filetype plugin indent on    " required

      此时Vim仅安装了Vundle.vim这一个插件。编辑hellogolang.go时与编辑普通文本文件无异,一切都还是Vim的默认属性

      2、vim-go

        Vim-go是当前使用最为广泛的用于搭建Golang开发环境的vim插件,这里我同样使用vim-go作为核心和基础进行环境搭建的。vim-go利 用开源Vim插件管理器安装,gmarik/Vundle.vim是目前被推荐次数更多的Vim插件管理器,超过了pathogen。这里我们 就用vundle来作为

      Vim的插件管理工具。

         编辑~/.vimrc,在vundle#beginvundle#end间增加一行:

         Plugin 'fatih/vim-go'

         在Vim内执行:PluginInstall

           Vundle.vim会在左侧打开一个Vundle Installer Preview子窗口,窗口下方会提示:“Processing 'fatih/vim-go'”,待安装完毕后,提示信息变 成“Done!”。

         这时,我们可以看到.vim/bundle下多了一个vim-go文件夹:

         $ ls .vim/bundle/
          vim-go/  Vundle.vim/

      此时,再次编辑hellogolang.go,语法高亮有了, 保存时自动format(利用$GOBIN/gofmt)也有了,但其他高级功能,比如自动import缺失的 package、自动补齐仍然没有,我们还要继续安装一些东东。

      3、安装go.tools Binaries 

      vim-go安装说明中提到所有必要的binary需要先安装好,比如gocode、godef、goimports等。

      通过:GoInstallBinaries,这些vim-go依赖的二进制工具将会自动被下载,并被安装到$GOBIN下或$GOPATH/bin下。(这个工具需要依赖git或hg,需要提前安装到你的OS中。)

      :GoInstallBinaries的执行是交互式的,你需要回车确认:

      vim-go: gocode not found. Installing github.com/nsf/gocode to folder /home/tonybai/go/bin
      vim-go: goimports not found. Installing code.google.com/p/go.tools/cmd/goimports to folder /home/tonybai/go/bin/
      vim-go: godef not found. Installing code.google.com/p/rog-go/exp/cmd/godef to folder /home/tonybai/go/bin/
      vim-go: oracle not found. Installing code.google.com/p/go.tools/cmd/oracle to folder /home/tonybai/go/bin/
      vim-go: gorename not found. Installing code.google.com/p/go.tools/cmd/gorename to folder /home/tonybai/go/bin/
      vim-go: golint not found. Installing github.com/golang/lint/golint to folder /home/tonybai/go/bin/

      vim-go: errcheck not found. Installing github.com/kisielk/errcheck to folder /home/tonybai/go/bin/

      不过这些代码多在code.google.com上托管,因此由于众所周知的原因,vim-go的自动安装很可能以失败告终,这样就需要你根据上 面日志中提到的各个工具的源码地址逐一去下载并本地安装。无法搭梯子的,可以通过http://gopm.io 下载相关包。

      安装后,$GOBIN下的新增Binaries如下:
      -rwxr-xr-x  1 tonybai tonybai  5735552 11??  7 11:03 errcheck*
      -rwxr-xr-x  1 tonybai tonybai  9951008 11??  7 10:33 gocode*
      -rwxr-xr-x  1 tonybai tonybai  5742800 11??  7 11:07 godef*
      -rwxr-xr-x  1 tonybai tonybai  4994120 11??  7 11:00 goimports*
      -rwxr-xr-x  1 tonybai tonybai  5750152 11??  7 11:03 golint*
      -rwxr-xr-x  1 tonybai tonybai  6381832 11??  7 11:01 gorename*
      -rwxr-xr-x  1 tonybai tonybai  2954392 11??  7 10:38 gotags*
      -rwxr-xr-x  1 tonybai tonybai  9222856 11??  7 11:01 oracle*

      安装好这些Binaries后,我们来看看哪些特性被支持了。

      再次编辑hellogolang.go

            - 新起一行输入fmt.,然后ctrl+x, ctrl+o,Vim 会弹出补齐提示下拉框,不过并非实时跟随的那种补齐,这个补齐是由gocode提供的。
        – 输入一行代码:time.Sleep(time.Second),执行:GoImports,Vim会自动导入time包。
        – 将光标移到Sleep函数上,执行:GoDef或命令模式下敲入gd,Vim会打开$GOROOT/src/time/sleep.go中 的Sleep函数的定义。执行:b 1返回到hellogolang.go。
        – 执行:GoLint,运行golint在当前Go源文件上。
        – 执行:GoDoc,打开当前光标对应符号的Go文档。
        – 执行:GoVet,在当前目录下运行go vet在当前Go源文件上。
        – 执行:GoRun,编译运行当前main package。
        – 执行:GoBuild,编译当前包,这取决于你的源文件,GoBuild不产生结果文件。
        – 执行:GoInstall,安装当前包。
        – 执行:GoTest,测试你当前路径下地_test.go文件。
        – 执行:GoCoverage,创建一个测试覆盖结果文件,并打开浏览器展示当前包的情况。
        – 执行:GoErrCheck,检查当前包种可能的未捕获的errors。
        – 执行:GoFiles,显示当前包对应的源文件列表。
        – 执行:GoDeps,显示当前包的依赖包列表。
        – 执行:GoImplements,显示当前类型实现的interface列表。
        – 执行:GoRename [to],将当前光标下的符号替换为[to]。

    三、其他插件

      到目前为止,我们还有若干特性没能实现,重点是:

        – 实时跟随的代码补齐
        – Code Snippet support

      1、安装YCM(Your Complete Me)

        在~/.vimrc中添加一行:

          Plugin 'Valloric/YouCompleteMe'

        保存退出后,再打开~/.vimrc并执行:PluginInstall

        安装完后,下面的提示栏提示:

        ycm_client_support.[so|pyd|dll] and ycm_core.[so|pyd|dll] not detected; you need to compile YCM before using it. Read the docs!

        YCM是用了C++编写的模块对性能进行优化了,于是需要手工编译YCM的support库。步骤如下:

        sudo yum install build-essential cmake python-dev
        cd ~/.vim/bundle/YouCompleteMe
        ./install.sh

      构建(编译C++很慢,需要耐心的等一会)ok后,再打开hellogolang.go,逐字的实时补全功能就具备了!Cool!

      2、安装 UltiSnips

      Vim-go默认是用ultisnips引擎插件,但这个插件需要单独安装。同样,我们利用vundle来安装它,在~/.vimrc中添加一行:

      Plugin 'SirVer/ultisnips'

      保存,退出vim

      打开vim,执行:PluginInstall

      编辑hellogolang.go,按照go.snip中的说明,我们输入func后敲击tab键,我们发现期待的:

      func name(params) type {
           
      }

      并没有出现。反倒是YCM的下拉提示显示在那里让你选择。似乎是ultisnips和YCM的键组合冲突了。ultisnips官方说明也的确如 此。ultisnips默认是用Tab展开snippet的,而YCM中的Tab用来选择补齐项,我们可以通过设置来避免这些。

      我们在.vimrc中添加如下setting:

     1 " YCM settings
     2 let g:ycm_key_list_select_completion = ['', '']
     3 let g:ycm_key_list_previous_completion = ['']
     4 let g:ycm_key_invoke_completion = '<C-Space>'
     5 
     6 
     7 " UltiSnips setting
     8 let g:UltiSnipsExpandTrigger="<tab>"
     9 let g:UltiSnipsJumpForwardTrigger="<c-b>"
    10 let g:UltiSnipsJumpBackwardTrigger="<c-z>"

      这样让YCM通过回车和向下的箭头来做list item正向选择,通过向上箭头做反向选择。通过ctrl+space来原地触发补齐提示。

      而ultisnips则是用tab做snippet展开,ctrl+b正向切换占位符,ctrl+z反向切换占位符。

      3、安装molokai theme

        Molokai theme是TextMate的theme的vim port,看着截图挺不错的,于是也安装了一下。

          mkdir ~/.vim/colors
          下载或copy https://github.com/fatih/molokai/blob/master/colors/molokai.vim到~/.vim/colors目录下
          在.vimrc添加一行:colorscheme molokai

      四、.vimrc

      前面讲到了vim-go有许多命令,在:xx模式下执行多显不便,于是你可以定义一些Mappings,比如:

      " set mapleader
      let mapleader = ","

      " vim-go custom mappings
      au FileType go nmap <Leader>s <Plug>(go-implements)
      au FileType go nmap <Leader>i <Plug>(go-info)
      au FileType go nmap <Leader>gd <Plug>(go-doc)
      au FileType go nmap <Leader>gv <Plug>(go-doc-vertical)
      au FileType go nmap <leader>r <Plug>(go-run)
      au FileType go nmap <leader>b <Plug>(go-build)
      au FileType go nmap <leader>t <Plug>(go-test)
      au FileType go nmap <leader>c <Plug>(go-coverage)
      au FileType go nmap <Leader>ds <Plug>(go-def-split)
      au FileType go nmap <Leader>dv <Plug>(go-def-vertical)
      au FileType go nmap <Leader>dt <Plug>(go-def-tab)
      au FileType go nmap <Leader>e <Plug>(go-rename)  

      这样我们在命令模式下,输入<,>+<r>就是运行 当前main包,以此类推。

      另外下面这个配置使得我们在save file时既可以格式化代码,又可以自动插入包导入语句(或删除不用的包导入语句)。

      " vim-go settings
      let g:go_fmt_command = "goimports"

      到这里,我们的Vim Golang开发环境就基本搭建好了。snippet+实时补齐让你Coding如飞!

     五、.vimrc文件

     1 下面是截至目前为止全量.vimrc文件的内容:
     2 
     3 set nocompatible              " be iMproved, required
     4 filetype off                  " required
     5 colorscheme molokai
     6 
     7 " set the runtime path to include Vundle and initialize
     8 set rtp+=~/.vim/bundle/Vundle.vim
     9 call vundle#begin()
    10 
    11 " let Vundle manage Vundle, required
    12 Plugin 'gmarik/Vundle.vim'
    13 Plugin 'fatih/vim-go'
    14 Plugin 'Valloric/YouCompleteMe'
    15 
    16 Plugin 'SirVer/ultisnips'
    17 
    18 " All of your Plugins must be added before the following line
    19 call vundle#end()            " required
    20 filetype plugin indent on    " required
    21 
    22 " set mapleader
    23 let mapleader = ","
    24 
    25 " vim-go custom mappings
    26 au FileType go nmap <Leader>s <Plug>(go-implements)
    27 au FileType go nmap <Leader>i <Plug>(go-info)
    28 au FileType go nmap <Leader>gd <Plug>(go-doc)
    29 au FileType go nmap <Leader>gv <Plug>(go-doc-vertical)
    30 au FileType go nmap <leader>r <Plug>(go-run)
    31 au FileType go nmap <leader>b <Plug>(go-build)
    32 au FileType go nmap <leader>t <Plug>(go-test)
    33 au FileType go nmap <leader>c <Plug>(go-coverage)
    34 au FileType go nmap <Leader>ds <Plug>(go-def-split)
    35 au FileType go nmap <Leader>dv <Plug>(go-def-vertical)
    36 au FileType go nmap <Leader>dt <Plug>(go-def-tab)
    37 au FileType go nmap <Leader>e <Plug>(go-rename)
    38 
    39 " vim-go settings
    40 let g:go_fmt_command = "goimports"
    41 
    42 " YCM settings
    43 let g:ycm_key_list_select_completion = ['', '']
    44 let g:ycm_key_list_previous_completion = ['', '']
    45 let g:ycm_key_invoke_completion = '<C-Space>'
    46 
    47 " UltiSnips settings
    48 let g:UltiSnipsExpandTrigger="<tab>"
    49 let g:UltiSnipsJumpForwardTrigger="<c-b>"
    50 let g:UltiSnipsJumpBackwardTrigger="<c-z>"
  • 相关阅读:
    软件/环境的注册码
    js图片延迟加载如何实现
    http状态码
    关于深拷贝(含数组对象)
    javascript继承方式详解
    使用寄生构造函数 创建类
    前端知识点大全【转载】
    统一addEventListener与attachEvent中this指向问题
    sublime text全程指南【转载】
    函数防抖与节流[转载]
  • 原文地址:https://www.cnblogs.com/chris-cp/p/5846640.html
Copyright © 2011-2022 走看看