前言
学到现在大概用了半年多的Linux了,总算不止是个只会nano
的小小白玩家了,还是个会用vim
的小白玩家!最近开始正式装上了双系统并打算长期学习并使用Linux,此前零零碎碎地也是折腾了好几次vim
,也算是了解得很全面了,因此这次打算好好来写一下介绍。
What’s vim?
我们引用一下维基百科上的介绍:
Vim是从vi发展出来的一个文本编辑器。其代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和Emacs并列成为类Unix系统用户最喜欢的编辑器。
划重点,祖籍是文本编辑器,玩骚了被广泛拿来码程序。vi和vim的关系就像是Windows下的notepad和notepad++一样,前者只是个普通的字编辑器,而后者则提供了很大的自由度,用户可以自行配置成使用于各类程序设计语言的IDE。
我们也可以访问一下vim的官网,官网介绍:Vim是一个高度可配置的文本编辑器,可以创建和更改任何类型的文本,效率非常高。可以看到vim自身的定位:程序开发工具而不是文字处理工具。
而vim之所以强大,其实就是依靠广泛的插件系统。依靠这些强大的插件,用户可以自己选择IDE的配置,是否加入某些功能,是否支持某种语法。通过vim的学习和使用,也可以学习到类似Windows下的IDE软件(例如Devc++等)的具体实现,而不再是拿来就用。
gcc、llvm和clang
今天我们主要将vim配置成C/C++的IDE,所以必然要谈到这两个编译器。一直以来用的编译器都是GCC,最近了解到了Clang/Clang++,便花了一个周末的时间从头到尾仔细研究了一遍,总算把网上那一堆专业术语看懂了个大概。
什么是编译器
首先需要知道什么是编译器?
编译器的日常工作: 源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 汇编程序 (assembler) → 目标代码 (object code) → 链接器 (Linker) → 可执行文件 (executables)。也就是把你看得懂的翻译成机器看得懂的0101。传统编译器事实上分前端、优化器和后端,这也是理解接下来内容的关键。
- 前端主要负责解析输入的源代码,由词法分析器和语法分析器完成。也就是说,前端接受你的源代码并根据约定好的语法解释“读”懂你的数据变量和函数语法,同时也会检查程序的语法错误。
- 优化器负责分析、优化中间代码,而后端主要进行的工作是生成机器代码。有时也将这两者统称后端。这一步的优化做得好,占用内存自然就少,但代价就是需要更长的编译时间。
用这种模式设计的编译器有很大的方便,当你需要给编辑器添加其他语言支持的时候,你只要换掉前端;当你需要移植到其他架构的机器上时,你只要换掉后端。
什么是gcc、llvm和clang
首先我们分个类,gcc和clang是编译器,llvm是构架编译器的框架系统。
然后我们来站个队,现在llvm和clang是一队,挑战业界大佬gcc。
llvm是什么东东####
那么先来说明llvm是哪一类东西,llvm本身就不是一个编译器,如果你拿llvm跟上面两者对比是要遭笑话的。llvm的优势在于,它是在GCC的架构问题日益突出的情况下,针对GCC缺点提出的一个新的编译器框架,也是一套用于开发编译器、解释器等程序语言相关工具的库,主要聚焦于编译器后端功能。
对比gcc和clang####
首先gcc算是业界年长的老大了,而clang 是后起之秀,配合 llvm,以优秀的前端闻名于世,现在已经是Mac的默认编译器,微软等大公司都在往上靠,前景一片光明。
#我们先安装一下这两个编译器
$ sudo apt-get install llvm
$ sudo apt-get install clang
#Gcc一般是ubuntu默认安装
$ sudo apt-get install gcc
然后简单写个语法错误的代码,我们来对比一下前端:
很显然,clang的提示非常友好,不止找出了错误的地方,还给出了修改建议。
其实,clang是基于llvm的一个新事物,它肯定在原有产品GCC的不足之处下足了功夫。另外,在后端层面上,目前clang在Mac平台表现优秀,而其他平台仍待考察,而GCC在Linux平台也还行。这是因为llvm本身就是Apple投资,为的就是开发Mac平台上GCC的替换品clang。——因为GCC没有及时回应Apple的需求。反正就是神仙打架,我等旁观吃瓜就行。
Vim的一些配置
好吧,扯了那么多,来点实用的。首先用sudo apt-get install vim
安装一下vim。打开的界面是这样的:
因为vim支持自己配置很多插件,所以我们可以自行在vim的官网上选择。我个人还是喜欢轻便,所以主要推荐以下几个插件。
Pathogen
主要用于管理你的插件,将插件相关文件统一管理,方便添加和移除。
$ sudo apt install curl
$ mkdir -p ~/.vim/autoload ~/.vim/bundle && curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
$ sudo vim /ect/vim/vimrc
#在打开的文档中加入以下内容
"自定义内容
execute pathogen#infect()
其实有一定的编程基础的可以轻松看出,这个vimrc文件也是一个程序,也有一些固定的语法,只要仿造其它语句就可以自己写了。
Auto Pairs
自动删除或插入成对的括号、引号,这个功能对我这种以来IDE久了的肯定是需要的。
#先安装一下git这个工具
$ sudo apt-get install git
$ git clone git://github.com/jiangmiao/auto-pairs.git ~/.vim/bundle/auto-pairs
NERDTree
用于查看文件系统,快捷方便。
$ git clone https://github.com/scrooloose/nerdtree.git ~/.vim/bundle/nerdtree
#同理在vimrc文件中加入以下内容。设置快捷键
map <C-n> :NERDTree<CR>
上图就是刚才拿来对比clang的程序
Taglist
列出文件的函数等,一般IDE常见功能。
$ sudo apt-get install ctag
#在官网下载taglist插件 https://www.vim.org/scripts/script.php?script_id=273
$ mv ~/下载/taglist_46.zip ~/.vim/bundle
$ unzip taglist_46.zip
$ rm taglist_46.zip
#同样,可以设置快捷键
map <C-t> :TlistToggle<CR>
SuperTab
Tab补全功能不言而喻了吧。
$ git clone https://github.com/ervandew/supertab.git ~/.vim/bundle/supertab
像这些小插件vim有很多,用得好真的很方便,这个看个人喜好了,我就觉得以上几个够用了,比较轻便。
F5运行
F5一键运行这个功能就不需要插件了,我们只要在vimrc中加入几行代码
" C/C++/shell/python一键运行
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
if &filetype == 'c'
exec '!clang % -o %<'
exec '!time ./%<'
elseif &filetype == 'cpp'
exec '!clang++ % -o %<'
exec '!time ./%<'
elseif &filetype == 'sh'
:!time bash %
elseif &filetype == 'py'
exec '!python %'
endif
endfunc
模板生成
如果想要在新建文件的时候默认填充代码头文件以及备注,则可以在.vim中新建一个文件夹template并预先写入几个模板文件c.tlp、cpp.tlp、py.tlp
。
autocmd BufNewFile *.c 0r /home/lst/.vim/template/c.tlp
autocmd BufNewFile *.cpp 0r /home/lst/.vim/template/cpp.tlp
autocmd BufNewFile *.py 0r /home/lst/.vim/template/py.tlp
总结
多上官网看技术文档,很重要!