分类: LINUX
2015-05-24 23:46:18
原文链接:
好久没写博客了。主要是觉得好多东西不值得写(加上人懒)。今天整理自己的,感觉收拾收拾还能写篇博客。这篇博客打算介绍一下我针对的vim配置。包括一些插件,工具等。个人感觉,把vim配置好,比用任何IDE都方便。如果你使用vim来编写的代码,那么只使用官方提供的那个vim插件就实在太痛苦了。很多功能都可以通过额外的程序和对应的vim插件来完成。注意:本文中提到的工具往往都有对应的emacs版本。所以emacs党不要担心,你们的编辑器也同样强大。
我之前就写过一篇来专门介绍。如果你还没开始使用这个强大的插件管理工具,那么你一定要尝试一下。安装步骤:
在.vimrc文件的开头添加以下代码:
有一个一直被人讨论的特点:如果一个包被import进来而没有使用,编译器将把这作为一个语法错误对待。这个特性本身可以加快编译速度,同时也可以让代码更清晰,避免引入没有用的包。但是这个特性也常常被人认为会影响开发进程。一个典型的例子就是:假设我在开发过程中,需要临时打印出一些变量的值。这时候,我需要import "fmt"来引入fmt这个包,然后在代码相应的位置添加fmt.Printf()之类的函数调用,来打印出变量的值。之后,我可能暂时不需要打印这个变量了,于是我去掉了fmt.Printf()这行。如果这是整个文件中,唯一一处使用fmt包的地方,那么就要跳到文件开头,去移除import "fmt"这行代码。这样做,就导致开发人员必须从文件中间(调用fmt.Printf()的地方),跳到文件开头,然后再跳回来,继续开发。这种上下跳转,即便用vim的register记下位置,也总是要增加好几次键盘敲击。而且这种临时打印变量值的动作往往会比较频繁,里外里就影响了开发效率。Go的这条语法要求,甚至成为了某些人放弃学习Go的原因。
对于Go的这个特性,我个人的意见是:特性本身可以让代码更清晰;而之所以有上述的麻烦,是因为没有使用好正确的工具。
Go语言的作者之一于是开发了这个软件。它的任务很简单:查看代码,如果调用了某些包的函数而没有在开头import这个包,那么就在开头加入这行import;反之,如果import了某些包但是没有调用这个包里的函数,就删除那行import。
在对一个Go文件进行编辑后,在命令模式下输入:Fmt,goimports会在后台被自动调用,对当前编辑的文件排版,并在文件中插入/删除相应的import语句。
在调用一个函数,或者使用一个结构体的时候,可能想去跳转到函数定义的地方,看看它的代码是什么。这个功能在阅读别人代码的时候非常有用。安装和相应插件,就可以实现这个功能
打开一个Go代码文件,把光标移到一个函数上,在命令模式下输入gd。vim会显示这个函数的定义。详细配置参见。
啥也不说了。几乎所有的Gopher都应该知道吧。之所以把这么重要的功能放在这么靠后,纯粹是因为它太有名,我都不想说了。
写一个hello world,在输入fmt.之后按
你必须要先import,然后才能在相应的包里搜索。把和一起用就看出尴尬了:你输入完fmt.,本来想要补全,但是如果你没有import fmt,你就没法补全。这时候你想起了,但是在输入完整的函数名之前,你又没法用自动添加import语句。所以,你要么输入fmt.Printf(),然后让添加import语句,接着用自动补全;要么你就老老实实跑到文件开头自己添加import语句然后自动补全。反正你得先自己手动干一样。
很多IDE都可以在代码旁边显示当前文件包含哪些函数定义,结构体定义等等。配合就可以实现这个功能
添加以下内容到.vimrc:
Bundle 'majutsushi/tagbar'
nmap <F8> :TagbarToggle<CR>
let g:tagbar_type_go = {
\ 'ctagstype' : 'go', \ 'kinds' : [ \ 'p:package', \ 'i:imports:1', \ 'c:constants', \ 'v:variables', \ 't:types', \ 'n:interfaces', \ 'w:fields', \ 'e:embedded', \ 'm:methods', \ 'r:constructor', \ 'f:functions' \ ], \ 'sro' : '.', \ 'kind2scope' : { \ 't' : 'ctype', \ 'n' : 'ntype' \ }, \ 'scope2kind' : { \ 'ctype' : 't', \ 'ntype' : 'n' \ }, \ 'ctagsbin' : 'gotags', \ 'ctagsargs' : '-sort -silent' \ }
重新开启vim,命令模式下执行:BunduleInstall。
编写代码的时候,在命令模式下按