作为一个Vim深度用户,每接触一种新语言时,我都会为Vim配置好对应的开发环境,正所谓『工欲善其事,必先利其器』。
安装Go
参考官方安装指导,这里就不多说了。
配置Go
Go的配置主要就是GOPATH
与PATH
两个变量。GOPATH
的默认值为$HOME/go
,也就是Go会将软件安装到$HOME/go
目录中,同时也是在$HOME/go
中寻找软件依赖。
我个人喜欢将一些重要的东西隐藏起来,因此我们将$HOME/go
变更为$HOME/.go
|
|
在.zshrc
中增加如下内容
|
|
安装依赖
go install golang.org/x/tools/gopls@latest
go install github.com/jstemmer/gotags@latest
go install golang.org/x/tools/cmd/goimports@latest
go install github.com/fatih/motion@latest
安装vim-go
Vim插件管理有很多种,参考官方安装指导进行安装即可。
但我个人偏向于传统的直接安装方法,将vim-go
项目中插件文件直接拷贝到.vim
目录中。
|
|
配置vim-go
官方的文档很多,但也很杂,而且都是英文的,阅读起来还是有点费力的。这里我们先对vim-go
做个简单的配置,将vim-go
的代码高亮与自动补全功能开启。
自动补全
这相信这个是大家最关心的内容。
|
|
这个我居然是在gopls
项目中找到的,有点不可思议。
这里值得一说的是,自动补全依赖于你的TAB
键,而这个可能由不同的插件管理着,如果你有问题,可以直接定义按键或设置插件到vim-go
的自动补全函数go#complete#Complete()
,但好在vim-go
是将这个函数注册到omnifunc
,可以直接使用快捷键<C-X><C-N>
。
比如我就是自己写的TAB
插件,兼容omnifunc
,因此vim-go
直接装上就能用。官方文档就提到YouCompleteMe
与vim-go
在TAB
键上有冲突。
代码高亮
|
|
为什么vim-go
的代码高亮默认是关闭的,不是很理解!
高级功能
代码格式化/缩进 :GoFmt
vim-go
使用gofmt
或goimports
进行代码格式化/缩进,当你保存文件时,这个过程就自动完成了。这个功能是自动开启的,如果你不喜欢这个功能可将其关闭。
|
|
gofmt
OR goimports
|
|
编译、运行、调试
:GoRun
=>go run
=> 运行整个包:GoRun %
=>go run <current file>
:GoBuild
=>go build
(有点差别) => 编译当前包- 不会生成目标文件
- 如果有错误会打开
quickfix
窗口
:GoInstall
:GoTest
为了更好的配合vim-go
,我们可以开启vim
的文件自动保存功能:
|
|
在编译时,我们的代码可能会存在错误,vim-go
会自动打开一个quickfix
或location lists
错误窗口,这里大家可以根据自己的偏好选择:
|
|
按键绑定
|
|
但实际nmap <buffer>
可能会更好一些。因为我们vim里面打开的可能还有其他类型的文件
|
|
我们常用的以g
开头的快捷键gg
(跳转到文件开头),这里定义vim-go
快捷键时,不要与之冲突就好。
TODO: gb
- 编译当前文件,gB
- 编译当前包,这样可能会更好。后面有合适代码再尝试一下
Go对于普通文件和测试文件的处理命令是不一样的,所以这里需要区分一下:
|
|
代码跳转
我相信这个是高级功能中大家最在意的。vim-go
不仅支持本地跳转,而且支持跳转到外部代码,比如标准库和GOPATH
中的第三方库。
:GoDef
- 跳转到当前类型的定义 - 快捷键<C-]>
:GoDefPop
- 返回跳转前的位置 - 快捷键<C-t>
或<C-o>
:GoDefStack
- 显示当前的跳转列表:GoDefStackClear
- 清除当前的跳转列表
其他
vim-go
是个很强大的插件,还有其他一些高级功能待探索。
代码片段补全 / snippets
UltiSnips
vs neosnippet
:
UltiSnips
使用python
,需要vim有python
支持neosnippet
使用vim脚本,原生支持
试用了一下UltiSnips
,发现其抢注TAB
快捷键,虽然可以修改,但总感觉不是滋味,放弃了。
安装neosnippet
|
|
对比UltiSnips
,neosnippet
就安分多了:
接下来我们就配置快捷键。
|
|
官方是用<C-k>
按键,但我们的<C-k>
是用来在窗口间跳转,所以改成了<C-o>
。
注意:插入模式下绑定快捷键并不是一件容易的事。插入模式下,快捷键受终端软件和桌面版Vim的影响,两者都可能截取键盘按键。所以需要在当前环境下测试,并且很可能在其他环境下无法使用。比如在我的环境中<C-i>
就无法正常工作。
当然我们也可以借助类似SuperTab
的插件来实现TAB
键补全,进一步的配置可参考官方
安装模板
You must install neosnippet-snippets or disable runtime snippets.
如果看到如上错误,说明neosnippets
缺少模块。
代码片段补全依赖于模板,可以从neosnippet-snippets或vim-snippets下载自己需要的模板安装。前者是neosnippet
格式,后者是snipMate
格式(需要格外配置)。
|
|
开启snipMate
格式兼容
|
|
vim-go
已经自带一个snipMate
格式模板,如果喜欢这个模块,将其链接到snippets
文件夹:
|
|