在过去的几年里,我一直使用Sublime Text作为我的主要代码编辑器,同时使用GoSublime插件来提供一些类似IDE的额外功能。
但我最近把GoSublime换成了一个更加模块化的插件设置,并且对它的工作方式非常满意。虽然花了一些时间来配置,但它带来了一个编码环境,感觉比以前更清晰,更精简。
我已经选择了。
- 与官方的sublim-build插件的工具集成。
- 用Gofmt插件和goimports自动格式化。
- 用SublimeLinter插件和gometalinter进行代码提示。
- 使用gocode软件包进行自动补全。
- 用GoGuru插件进行代码导航。
- 用Sublime Text的内置工具和PackageResourceViewer插件来管理片段。
在这篇文章中,我将通过设置这些东西的过程。如果你以前没有接触过这些插件,我建议你试一试。
前提条件
为了正常工作,这些Sublime Text插件中的一些需要明确设置$GOPATH
环境变量。如果你也在关注,你也应该确保你的工作空间的bin
目录在你的系统路径上。
因此,我的bash~/.profile
配置包括这几行。
``` ... export GOPATH=/home/alex/Code/go export PATH=$PATH:$GOPATH/bin ```
你还需要安装软件包控制,如果你还没有的话。在最新版本的Sublime Text中,最简单的方法是进入Tools > Install Package Control…
。
工具的整合
官方的sublime-build插件提供了集成,因此你可以在不离开编辑器的情况下执行常见的go
命令(如go run
,go test
和go get
)。
你可以像这样安装它。
- 按
Ctrl+Shift+P
,打开Sublime Text的命令调色板。 - 运行
Package Control: Install Package
命令。 - 输入
Golang Build
,然后点击Enter
来安装该软件包。
安装后,你应该在你的命令调色板中看到一堆新的工具。它们的名字是不言自明的。
Build With: Go
Build With: Go - Clean
Build With: Go - Install
Build With: Go - Run
Build With: Go - Test
Build With: Go - Cross-Compile
Go: Get
Go: Open Terminal
当你运行这些命令时,它们将在Sublime Text的一个面板中打开并执行。作为一个例子,这里有一个来自Build With: Go - Test
命令的输出截图。
自动格式化
对于.go
文件的自动格式化,我一直在使用Gofmt插件。你可以按以下方式安装它。
- 按
Ctrl+Shift+P
,打开Sublime Text的命令调色板。 - 运行
Package Control: Install Package
命令。 - 输入
Gofmt
,然后按Enter
来安装该软件包。
默认情况下,这将在每次保存当前文件时运行go fmt -s -e
。
我已经进一步定制了这个,以使用goimports工具。如果你还不熟悉goimports
,它将运行go fmt
,并修正你的导入行--必要时添加缺失的软件包和删除未引用的软件包。
要设置这个,你需要安装goimports
,并确保它在你的系统路径上可用。
``` $ go get golang.org/x/tools/cmd/goimports $ which goimports ```
安装完毕后,你需要在Sublime Text中改变Gofmt
插件的设置,打开Preferences > Package Settings > Gofmt > Settings - User
并添加以下配置。
``` { "cmds": [ ["goimports"] ], "format_on_save": true } ```
(你可能需要重新启动Sublime Text来使之生效。)
现在每次你保存一个.go
文件时,你会发现它被自动格式化,并且导入的包也被更新。不再有"imported and not used"
的错误!
代码提示
为了给源代码打码,我使用了SublimeLinter插件。这个插件本身并不是一个linter,而是提供了一个运行linters和显示错误信息的框架。你可以像这样安装它。
- 按
Ctrl+Shift+P
,打开命令调色板。 - 运行
Package Control: Install Package
命令。 - 输入
SublimeLinter
,然后按Enter
,安装该软件包。
下一步是安装一个实际的linter。我使用的是gometalinter,它作为一个封装器,围绕着一堆不同的linter,比单独使用go vet
和golint
更能发现潜在的问题和低效率。你可以用命令来安装它。
``` $ go get github.com/alecthomas/gometalinter $ which gometalinter ```
一旦完成,你就需要安装SublimeLinter-contrib-gometalinter插件。它是SublimeLinter和gometalinter之间的桥梁。
- 按
Ctrl+Shift+P
,打开命令调色板。 - 运行
Package Control: Install Package
命令。 - 输入
SublimeLinter-contrib-gometalinter
,然后按Enter
来安装这个软件包。
默认情况下,当你打字时,linter会在后台运行,错误会显示在屏幕底部的Sublime Text状态栏中。但我发现,只在保存文件时进行lint,并在面板上一次性显示所有错误,更适合我。如果你也想这样做,请到Preferences > Package Settings > SublimeLinter > Settings
,并在SublimeLinter Settings - User
文件中添加以下设置。
``` { "show_panel_on_save": "window", "lint_mode": "save", } ```
我应该提到,SublimeLinter-contrib-gometalinter
插件只执行gometalinter
中包含的 "快速 "linters。你可以通过检查源代码看到到底运行了哪些。
自动完成
对于自动完成,我使用了gocode包,它提供了一个代码自动完成的功能。你可以像这样安装它。
``` $ go get github.com/mdempsky/gocode $ which gocode ```
目前还没有通过Sublime Text包控制提供的gocode
插件(我可能很快就会添加一个!)......但在gocode
源码本身的subl3
目录中包括一个插件。
你应该能够用下面的命令把它复制到你的Sublime TextPackages
目录中。
``` $ cp -r $GOPATH/src/github.com/mdempsky/gocode/subl3 ~/.config/sublime-text-3/Packages/gocode ```
如果你打开命令调色板并运行Package Control: List Packages
,你应该在列表中看到一个gocode
条目。
默认情况下,Sublime Text会在按下一个字母时提出自动完成的建议。但在使用Go的时候,我希望每当我按下.
字符时,也能显示潜在的方法名称。你可以通过进入Preferences > Settings
,在Preferences.sublime-settings - User
文件中添加一个新的触发器来实现。
``` { ... "auto_complete_triggers": [ {"selector": "text.html", "characters": "<"}, {"selector": "source.go", "characters": "."} ], } ```
然后你需要重启Sublime Text以使设置生效。一旦你重启了,你的自动完成功能就会很好地工作,看起来像这样。
代码导航
为了帮助浏览代码,我使用了guru工具,你可以用以下命令安装它。
``` $ go get golang.org/x/tools/cmd/guru $ which guru ```
为了将其与Sublime Text集成,你还需要安装GoGuru插件,如下所示。
- 按
Ctrl+Shift+P
,打开命令调色板。 - 运行
Package Control: Install Package
命令。 - 输入
GoGuru
,然后按Enter
,安装该软件包。
要使用GoGuru工具,首先将你的光标放在你感兴趣的代码段上。然后,如果你打开命令调色板并输入GoGuru
前缀,你会看到一个可用的命令列表,包括。
GoGuru: callees
- 显示所选函数调用的可能目标GoGuru: callers
- 显示所选函数的可能调用者GoGuru: callstack
- 显示从callgraph根到所选函数的路径GoGuru: definition
- 显示所选标识符的声明GoGuru: describe
- 描述选定的语法:定义、方法等GoGuru: freevars
- 显示选择的自由变量GoGuru: implements
- 显示所选类型或方法的 "实现 "关系GoGuru: jump to definition
- 在所选标识符的声明处打开文件GoGuru: peers
- 显示对应于所选通道操作的发送/接收GoGuru: pointsto
- 显示所选指针可能指向的变量GoGuru: referrers
- 显示所选标识符表示的事物的所有引用GoGuru: what
- 显示所选语法节点的基本信息GoGuru: whicherrs
- 显示所选错误变量的可能值
你可以在这个GoogleDoc中找到这些命令和它们的行为的详细描述。
我不像其他人那样经常使用GoGuru插件,但当我在一个不熟悉的代码库工作时,它肯定会使浏览代码和建立事物工作原理的心理地图变得更容易。我发现GoGuru: jump to definition
和GoGuru: callers
命令特别有用,而且比在版本库上搜索或运行Ctrl+F
更容易使用。
作为说明,这里有一张在Sum
函数上运行GoGuru: callers
的截图。
剪辑
Sublime Text为创建和使用自定义片段提供了相当好的工作流程。如果你还不熟悉,Jimmy Zhang写了一个很好的深度指南,我推荐你阅读。
我最常使用的片段可能是这个用于创建HTTP处理函数的片段。
``` <snippet> <content><![CDATA[ func ${1:name}(w http.ResponseWriter, r *http.Request) { ${2:} } ]]></content> <tabTrigger>hf</tabTrigger> <scope>source.go</scope> </snippet> ```
有一件事困扰了我一段时间,那就是Sublime Text提供的Go的内置片段。特别是我不喜欢每当我写出"package main"
,main()
代码就会被触发的方式。
如果像我一样,你想编辑这些内置片段,最简单的方法可能是使用PackageResourceViewer插件。你可以按以下方式安装它。
- 按
Ctrl+Shift+P
,打开命令调色板。 - 运行
Package Control: Install Package
命令。 - 输入
PackageResourceViewer
,然后按Enter
,以安装该软件包。
一旦安装完毕,你可以打开命令调色板并运行PackageResourceViewer: Open Resource
,这将列出你系统上的所有软件包。如果你浏览Go > Snippets/
,你应该看到一个所有内置片段的列表,你可以按照你的意愿打开和编辑它们。
*提示:*你也可以使用PackageResourceViewer来编辑你自己的自定义片段,而不必离开SublimeText。例如,如果您的自定义片段保存在您的Packages/User
目录下,您可以通过运行PackageResourceViewer: Open Resource
并导航到User
文件夹来打开它们。