vim是linux系统下常用的代码编辑器,默认情况下不支持go的代码高亮和语法检查,不过可以通过安装vim插件来支持go的开发,golang官方也向我们推荐了一些vim的go插件如下所列:(具体哪些插件请查看https://github.com/golang/go/wiki/IDEsAndTextEditorPlugins),接下来介绍插件的安装。
1、升级vim到较新的版本
安装依赖
sudo apt-get install libncurses5-dev libgnome2-dev libgnomeui-dev \
libgtk2.0-dev libatk1.0-dev libbonoboui2-dev \
libcairo2-dev libx11-dev libxpm-dev libxt-dev python-dev \
python3-dev ruby-dev liblua5.1 lua5.1-dev libperl-dev git
需要注意的是在Ubuntu16.04中Lua应该为liblua5.1-dev,而在其它版本中应为lua5.1-dev。
删除已有vim相关包
如果是多人使用的机器,最好还是不要轻易apt删除vim,其他人可能受到影响。如果是只有自己一个用户,可以随性:
dpkg -l | grep vim
sudo apt remove vim vim-common vim-runtime vim-tiny
下载最新vim并编译安装
如果只远程xshell使用,没有gui,则编译时添加--disable-gui以及--without-x选项。有的文章中这里同时配置了python2和python3,此时只有python2生效,如果想让vim8支持python3,则只需要配置python3即可,不要配置python2。
下载最新vim并编译安装
git clone https://github.com/vim/vim.git
./configure --with-features=huge \
--enable-multibyte \
--enable-rubyinterp=yes \
--enable-pythoninterp=yes \
--with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu \
--enable-python3interp=yes \
--with-python3-config-dir=/usr/lib/python3.5/config-3.5m-x86_64-linux-gnu \
--enable-perlinterp=yes \
--enable-luainterp=yes \
--with-lua-prefix=/usr/local \
--enable-gui=gtk2 \
--enable-cscope \
--prefix=/usr/local
make VIMRUNTIMEDIR=/usr/share/vim/vim81
sudo make install
安装完成后,在新启动的终端打开vim(当前终端有可能残留旧版本环境变量,从而打开失败)。
2、安装vim的插件管理工具
vim插件管理工具可以让插件安装变得简单快捷,vim的插件管理工具也有很多,这里选用 vim-pathogen(https://github.com/tpope/vim-pathogen),安装很简单。
先创建两个目录:
mkdir -p ~/.vim/autoload ~/.vim/bundle
下载 vim-pathogen 到 ~/.vim/autoload 目录下:
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
编辑 ~/.vimrc ,加入如下几行内容:
execute pathogen#infect()
syntax on
filetype plugin indent on
重启vim 即可安装成功,之后如果想要安装其他插件,只需把插件放到 ~/.vim/bundle 目录下, 重启vim ,vim-pathogen就会帮你自动安装好插件。
3、安装markdown支持语法高亮
cd ~/.vim/bundle/
git clone https://github.com/plasticboy/vim-markdown.git
然后重启vim即可。vim打开.go文件可以高亮显示了。
4、安装vim-go
vim-go 是一款go代码高亮和语法检查的插件
如上所示安装方法,clone vim-go 到 ~/.vim/bundle 目录下即可
cd ~/.vim/bundle/
git clone https://github.com/fatih/vim-go.git
进入vim,执行vim-go提供的 :GoInstallBinaries 命令可以一键安装其他有助于开发的go工具/命令,但我在运行该命令时,vim-go意外出错了:
原因是国内的网络环境导致网络不通,可以从其他机器复制过来,放在$GOPATH/bin目录下。
5、测试golang的代码高亮和语法检查
当你保存代码时,如果检测到有语法错误,会在底部给出提示。
6、解决退格键bug和设置一个tab=4个空格
新版vim可能会出现退格键(backspace)无效的问题,解决办法在 ~/.vimrc 加入以下两行:
set nocompatible
set backspace=indent,eol,start
如果要设置按一个tab键等于四个空格,可以在 ~/.vimrc 加入以下两行:
set ts=4
set expandtab
7、安装gocode插件
gocode是一款go的代码提示插件。
首先在$GOPATH/bin目录下安装gocode,再安装 vim-gocode (https://github.com/Blackrush/vim-gocode)
cd ~/.vim/bundle
git clone https://github.com/Blackrush/vim-gocode.git
设置 gocode的快捷键,比如设置为 F6 ,可以在 ~/.vimrc 加入以下行:
imap "go代码提示
编辑代码时按F6,效果如下
8、安装tagbar
tagbar(https://github.com/majutsushi/tagbar),一款用于显示代码结构的插件
安装ctags:
git clone https://github.com/universal-ctags/ctags.git
cd ctags/
./autogen.sh
./configure
make
make install
cd ~/.vim/bundle/
git clone https://github.com/majutsushi/tagbar.git
设置展开/关闭大纲视图快捷键:
在 ~/.vimrc 加入如下一行:
map :TagbarToggle
F8键可以打开/关闭 右侧边栏代码大纲
安装好Tagbar插件后,用vim打开go文件,输入“:Tagbar”或者按"F8"就可以打开Tagbar。可以使用"CTRL+W+方向键"实现窗口切换,可以使用“Ctrl + ]”跳至函数定义处,然后再使用“Ctrl + t”返回。下面是Tagbar的常用的快捷键和命令:
命令 | 描述 |
---|---|
F1 | 关闭/显示帮助信息; |
q | 关闭Tagbar窗口; |
x | 放大/缩小Tagbar窗口; |
s | 项目排序切换; |
+, |
展开折叠; |
-, |
收起折叠; |
o, za | 折叠收起\展开切换; |
*, |
展开所有折叠; |
=, zM | 收起所有折叠; |
回车 | 转到标签定义处,并且光标跳转到标签定义处; |
p | 转到标签定义处,但光标停留在Tagbar的窗口; |
P | 在预览窗口显示标签; |
跳到下一个上级标签; | |
跳到上一个上级标签; | |
显示标签定义; |
9、安装NERDTree插件
NERDTree插件能以树型结构在侧边栏展示当前工作目录下所有文件夹和源文件,并支持快速打开指定的源文件。安装好后可以使用":help NERDTree"命令获得使用帮助,也可以去官网查看相关文档:https://github.com/scrooloose/nerdtree。
因为我们之前安装了插件管理工具pathogen,只要到bundle目录下载目录树插件NERDTree,就可以自动安装。
cd ~/.vim/bundle/
git clone https://github.com/scrooloose/nerdtree.git ~/.vim/bundle/nerdtree
启动vim,输入:NERDTree查看效果
编辑~/.vimrc,增加目录树默认开启和开关快捷键
autocmd VimEnter * NERDTree "默认开启目录树
map :silent! NERDTreeToggle "开关目录树快捷键
安装好Tagbar插件后,用vim打开go文件,输入“:NERDTree”或者按"F7键"就可以启动NERDTree。下面是NERDTree的常用的快捷键和命令:
命令 | 描述 | |
---|---|---|
? | 显示帮助信息; | |
打 开 目 录 树 |
F7 | 打开或关闭NERDTree,此键可以根据自己需求定义。 |
:NERDTreeToggle | 同F7 | |
:NERDTree | 打开NERDTree | |
:NERDTreeClose | 关闭NERDTree | |
q | 关闭这个NERDTree窗口; | |
A | 调整NERDTree窗口大小(最大化、最小化) | |
书 签 |
:Bookmark |
将目录树保存为指定名字的书签; |
:NERDTreeFromBookmark |
打开指定书签名的目录树; | |
:ClearBookmarks |
删除指定书签; | |
:ClearAllBookmarks | 删除所有书签; | |
过 滤 |
I | 大写"i",显示或者隐藏"."号开头的文件和目录; |
f | 切换是否使用文件筛选; | |
F | 切换是否显示文件; | |
B | 切换是否显示书签表; | |
根 目 录 |
:NERDTreeCWD | 将CWD设为目录树根目录; |
CD | 将CWD目录作为目录树的根目录; | |
C | 将当前目录作为目录树的根目录; | |
u | 将当前根目录的上级目录作为根目录; | |
U | 同u; | |
cd | 将选定的目录作为CWD目录; | |
刷 新 |
R | 刷新当前根目录 |
r | 刷新当前目录 | |
目 录 |
o | 打开\关闭文件或目录,打开文件时光标会跳到编辑区域; |
O | 递归打开当前目录下的所有目录 | |
x | 关闭父目录; | |
X | 关闭所有子目录; | |
定 位 |
:NERDTreeFind | 在目录树中定位到当前打开的文件; |
P | 跳转到根目录 | |
p | 跳转到上层目录 | |
K | 到同级第一个节点 | |
J | 到同级最后一个节点 | |
k | 跳转到上一个节点; | |
j | 跳转到下一个节点; | |
跳转到同级上一个节点; | ||
跳转到同级下一个节点; | ||
文 件 |
m | 显示文件系统管理菜单 (添加、删除、移动、复制、现在属性等操作) |
o | 打开\关闭文件或目录,打开文件时光标会跳到编辑区域; | |
go | 打开目录树光标所在文件,但光标依然保留在目录树中; | |
i | 在水平分割割的窗口中打开选定文件; | |
gi | 同i,但光标依然保留在目录树中; | |
s | 在垂直分割割的窗口中打开选定文件; | |
gs | 同s,但光标依然保留在目录树中; | |
t | 在新标签页中打开文件,并使新的标签到focus状态; | |
T | 在新标签页中打开文件,保留原标签的focus状态; |
10、函数追踪/代码跳转
直接到bundle目录下载vim-godef插件
git clone https://github.com/dgryski/vim-godef
编辑~/.vimrc,我把快捷键改成开发php时习惯用的ctrl+],并且增加追踪代码打开方式
"go函数追踪
autocmd FileType go nnoremap gd :call GodefUnderCursor()
autocmd FileType go nnoremap :call GodefUnderCursor()
let g:godef_split=3 "左右打开新窗口的时候
let g:godef_same_file_in_same_window=1 "函数在同一个文件中时不需要打开新窗口
当光标在某函数上时,启用快捷键可以自动跳转到函数定义的位置,还可以很方便查看内置函数的源码
11、代码自动补全
vim-gocode虽然能够实现代码提示,但是无法实现代码自动补全,每次提示必须主动按键。要实现代码自动补全功能需要安装YouCompleteMe。
步骤如下:
git clone https://github.com/ycm-core/YouCompleteMe.git
cd YouCompleteMe
git submodule update --init --recursive
./install.py --clang-completer --go-completer
如果命令执行失败,有可能是网络原因,需要设置bash代理:
export http_proxy=127.0.0.1:8123
export https_proxy=127.0.0.1:8123
取消设置:
unset http_proxy
unset https_proxy