简单实用而不追求时髦的 Vim 配置
前言##
由于 Vim 的广泛流行,在网络上关于 Vim 的自定义配置汗牛充栋。既有高手 Tim Pope 的极简配置 tpope/vim-sensible(这个配置一个插件都没有),也有 spf13/spf13-vim 和 SpaceVim 这样大而全的配置。而对我来说,我喜欢简洁而优雅,一大堆 Plugin 堆砌起来的东西我固然不喜欢,但是一个插件都没有的极简配置那用起来也不太顺手。所以我必须得自己配。
自己配 Vim,必然涉及到 Plugin 的选型的问题。说到选型,那就有很多话要说了。首先是 Vim 自身版本的进步和功能的进步,目前 Vim 已经进入到 Vim 8 的时代,增加了不少新功能,比如异步啊、比如内置 Terminal 啊之类的。而且还有 NeoVim 和它抢饭碗。其次就是 Vim 插件的作者的理念发生了变化,他们逐渐瞧不上纯粹 VimScript 写的插件,毕竟纯 VimScript 写的插件功能比较有限,速度也不够快。目前的 Vim 插件有几个发展趋势:一是要充分利用异步的支持,二是往往使用某些后端提供更强大的功能支持,三是喜欢搞大而全的框架。下面我来逐一举例说明。
例如管理插件的插件,我以前一直都是用 Vundle,我觉得挺好用的。但是这几年又雨后春笋般的冒出了几种新的管理插件的插件,像 junegunn/vim-plug 和 Shougo/dein.vim,看一下它们的说明,无一例外都是说使用了并发技术,加快了插件的下载速度。
再例如 Vim 中的自动补全。其实 Vim 自身就支持补全功能,不过使用起来一点都不自动,需要使用 Ctrl+P 或者 Ctrl+X Ctrl+O 这样的快捷键才会调出补全功能。Vim 自身的补全功能支持 buffers 中的单词,也支持 dictionary 和 tags 中的条目。但是不管怎么说,都只是基于字面意义上的补全,不支持深层次的对编程语言的语义分析。但是可以用后端解决这个问题啊。像 Valloric/YouCompleteMe,在网络上的名声就是典型的难安装难配置,因为它需要使用 Clang 作为后端提供对 C/C++ 语义的支持,使用 Jedi 提供对 Python 的支持,使用 OmniSharp 提供对 C# 的支持,等等……。正是如此,使得我们若是想使用某些插件,还不得不在系统上安装 Clang、Python、Lua 这样的一些程序,比较复杂。
自动补全中还有大名鼎鼎的 Shougo/neocomplete.vim。但是我到 github 上一看,好家伙,居然说在 Vim 8 上建议就不要用了,要用就用 Shougo/deoplete.nvim。这也算是 Vim 版本的升级推动插件的升级吧,虽然怎么看怎么像这些插件倾向于 NeoVim 更多一点。而 deoplete 也只是一个自动补全的框架,它还是需要很多后端对编程语言的语义分析提供支持。看下面这个截图,这些都是 deoplete 所需要的后端:

再来一个例子,关于 Vim 中文件管理的,老牌的 NerdTree 不用说了吧,我用的挺舒服的。但现在流行的趋势是 vimfiler。然后我在 github 上一看,马上发现两个难题。一是 vimfiler 需要 unite.vim 支持,二是这个插件也不更新了,在 Vim 8 或者 NeoVim 的时代,请使用 Shougo/defx.nvim ,而且在 Defx 的文档中,赤裸裸地写明了,需要 Python 3.6.1+ 的支持。哦对了,必须提一下,Defx 我试用了,根本没配成功。
通过前面的介绍,发现这个 Shougo 还真是有点高产。前面提到的 unite.vim 也是他写的,而且又升级了。在 Vim 8 或 NeoVim 中建议使用 Shougo/denite.nvim。这里的 unite 和 denite 就是我前面说的大而全的框架,框架之下,需要别的更多的插件作为 source 来提供更多的功能,而这个框架,负责把控 Vim 的界面。
还有一个网红插件 Yggdroot/LeaderF,主要是为了取代经典的 ctrlp,而且其功能比 ctrlp 强大不少。这个倒是没有要求 Vim 8,不过还是要求 Python。值得一用。
鉴于以上提到的错综复杂的关系,以及我自身的强迫症,我决定还是回归经典。Vim 7 就能用多好,纯 VimScript 多好,不想整那后端这后端的。所以我还是使用 Vundle 管理插件,并选择了 5 到 6 个最常用的插件,其中一个还是 scheme,算不得真正的插件。唯一的升级,可能算是把 taglist 升级为 tagbar 了吧。另外,我还是选择了 ctrlp,没有选择 LeaderF。我觉得功能够用了。至于 tpope/vim-surround 、nerdcommenter 之类的,那就不要了吧,不要它们也多敲不了几下键盘,还可以省下学习成本。
必须得说明一下:怎么为 Vim 配插件还得看自己的需求。我主要是看文档和看代码,偶尔改改配置文件,有时还要在非 GUI 环境下改配置文件。就算写代码也只用 Vim 写非常简单的。所以我这个经典配置完全够用了,而且开箱即用,超级方便。至于需求比较复杂的,建议玩玩我前面提到的 SpaceVim 。
准备工作##
为了使用 Vim 自带的 tag 功能和按 tag 跳转功能,至少要安装 ctags。如果要阅读 Linux 的 Kernel 源代码,还得安装这个包,并解压缩。然后在 /usr/include 和 /usr/src/linux-source-4.15.0目录中执行 ctags 命令生成 tags 文件。命令如下:
sudo apt install exuberant-ctags linux-source
cd /usr/src/
sudo tar jxvf linux-source-4.15.0.tar.bz2
cd linux-source-4.15.0
sudo ctags -R --c++-kinds=+p --fields=+ias --extra=+q
cd /usr/include
sudo ctags -R --c++-kinds=+p --fields=+ias --extra=+q
ctags 可不仅仅只支持 C/C++ 语言哦。使用如下命令,可以看到 ctags 支持很多语言的:
ctags --list-languages
我的 Vim 配置##
配置文件是 ~/.vimrc。我的思路是使用 Vundle 管理插件,而且只选择了少量几个最常用的插件。加上空行,代码也只有 75 行,非常简洁。其内容如下:
set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'majutsushi/tagbar'
Plugin 'kien/ctrlp.vim'
Plugin 'scrooloose/nerdtree'
Plugin 'vim-scripts/AutoComplPop'
Plugin 'vim-scripts/OmniCppComplete'
Plugin 'altercation/vim-colors-solarized'
call vundle#end()
filetype plugin indent on
set history=1000
set ruler
set number
set showcmd
set showmode
set laststatus=2
set cmdheight=2
set scrolloff=3
set fillchars=stl:\ ,stlnc:\ ,vert:\
set noerrorbells
set novisualbell
set t_vb=
syntax on
colorscheme desert
set background=dark
set cursorline
hi CursorLine term=NONE cterm=NONE ctermbg=0 guibg=Gray40
set backspace=2
set whichwrap+=<,>,h,l
set expandtab
set smarttab
set shiftwidth=4
set tabstop=4
set autoindent
set cindent
set nobackup
set noswapfile
set autoread
set autowrite
set autochdir
set fileencodings=utf-8
set fileformats=unix,dos,mac
set showmatch
set matchtime=2
set hlsearch
set incsearch
set ignorecase
set smartcase
set magic
set lazyredraw
set nowrapscan
set iskeyword+=_,$,@,%,#,-,.
if has("gui_running")
colorscheme solarized
set guifont=monospace\ 12
endif
set tags+=/usr/include/tags
map <F2> :NERDTreeToggle<CR>
map <F3> :TagbarToggle<CR>
map <F4> :CtrlPMixed<CR>
map <F12> :!ctags -R --c++-kinds=+p --fields=+ias --extra=+q -I<CR>
使用 Vundle 管理插件##
我选择的插件管理器是 Vundle。首先在主目录下建立 .vim/bundle 目录,然后进入该目录,使用 git 下载 Vundle。
mkdir ~/.vim
mkdir ~/.vim/bundle
cd ~/.vim/bundle
git clone https://github.com/VundleVim/Vundle.vim.git
配置方法见上面的第 3 到 14 行。然后启动 Vim,在其中输入 :PluginInstall 安装插件。
运行效果##
在使用过程中,按 F2 键调出 NerdTree,按 F3 键调出 Tagbar,按 F4 键调出 CtrlP。如果查看某个项目的代码,只需要进入该项目的目录后,按 F12 键,则自动生成该项目的 tags 文件。控制台下运行,是这个效果:

用 GVim 运行,是这个效果:

简单实用而不追求时髦的 Vim 配置的更多相关文章
- 简单快捷好用的vim配置和终端配置推荐
vim 配置实用spf13-vim,安装方便简单快捷,极力推荐. 另外oh-my-zsh 终端配置很好,与之搭配使用效果更佳. 安装都很简单,一个脚本搞定, 都是在gitHub上开源的,自行搜索,这里 ...
- .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序
.NET 跨平台RPC框架DotNettyRPC DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...
- Vim实用技巧系列 - 利用百度云和git实现vim配置多机共享
Vim是一个强大的文本编辑器.良好的配置更能便利对Vim的使用.有时候,我们会在几台不同的电脑上使用Vim. 例如,我们可能在自己的电脑和公司的电脑上都安装了Vim. 有时候,我们需要实现,如果我们配 ...
- 快速学习C语言三: 开发环境, VIM配置, TCP基础,Linux开发基础,Socket开发基础
上次学了一些C开发相关的工具,这次再配置一下VIM,让开发过程更爽一些. 另外再学一些linux下网络开发的基础,好多人学C也是为了做网络开发. 开发环境 首先得有个Linux环境,有时候家里机器是W ...
- VIM配置相关记录
把一直使用中的vim配置做个GIT入库管理,也把之前积累在机器上的文档,做个汇总. https://github.com/wujuguang/kyvim 1. 安装完整版vim vi和vim的区别?在 ...
- Vim配置及说明——IDE编程环境
Vim配置及说明——IDE编程环境 Vim配置及说明——IDE编程环境 1.基本及字体 2.插件管理 3.主题风格 4.窗口设置 5.目录树导航 6.标签导航 7.taglist 8.多文档编辑 9. ...
- zw版_Halcon图像交换、数据格式、以及超级简单实用的DIY全内存计算.TXT
zw版_Halcon图像交换.数据格式.以及超级简单实用的DIY全内存计算.TXT Halcon由于效率和其他原因,内部图像采用了很多自有格式,提高运行速度,但在数据交换方面非常麻烦. 特别是基于co ...
- Vim配置IDE开发环境
我的vim IDE界面: 1.安装Vim和Vim基本插件首先安装好Vim和Vim的基本插件.这些使用apt-get安装即可:lingd@ubuntu:~/arm$sudo apt-get instal ...
- C#反射实现 C# 反射 判断类的延伸类型 使用代码生成工具Database2Sharp快速生成工作流模块控制器和视图代码 C# ADO.NET的SqlDataReader对象,判断是否包含指定字段 页面中添加锚点的几种方式 .net 简单实用Log4net(多个日志配置文件) C# 常用小点
C#反射实现 一.反射概念: 1.概念: 反射,通俗的讲就是我们在只知道一个对象的内部而不了解内部结构的情况下,通过反射这个技术可以使我们明确这个对象的内部实现. 在.NET中,反射是重要的机制, ...
随机推荐
- PDF怎么旋转页面,只需几步轻松搞定!
有时候我们下载一个PDF文件里面有页面是旋转的情况,用手机看的时候可以把手机旋转过来看,那么用电脑的时候总不可能也转过来看吧,笔记本是可以的台式的是不行的,这个时候我们就需要把PDF文件中旋转的页面转 ...
- 防XSS攻击解决方法
1.web.xml文件中新增filter配置 <!-- URL请求参数字符过滤或合法性校验 --> <filter> <filter-name>XssFilter& ...
- linux统配符
linux通配符注意:linux的通配符和三剑客的表达式是不一样的,因为,代表的意义是有较大区别的.通配符一般用户命令行bash环境,而linux正则表达式用于grep,sed,awk场景. * ...
- Jenkins job之间依赖关系配置(联动构建)
使用场景: 想要在某APP打新包之后,立即执行自动化测试的job来验证该新包.比如Job A 执行完执行Job B ,如下图所示,如何建立依赖呢? 主要有两种方法: 1.配置上游依赖: 2.配置下游依 ...
- Linux基础-命令
命令格式:command [-options] [paramter] command: 命令名,相应功能英文单词或缩写 options: 选项,对命进行控制,也可省略 paramter:传送给命令的 ...
- 编译php-5.3.28
1. 下载php-5.3.28 2. 编译/安装 ./configure --prefix=/usr/local/php --enable-fpm --enable-maintainer-zts -- ...
- vim的简单使用以及一些常用的命令
对于第一次用vi,有几点注意要提醒一下:1.用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字.切换方法:在「命令行模式 ...
- PHP实现域名授权的两种方法-转
01. 在线校验域名授权的方法: 客户端代码: PHP <?php //获取不带端口号的域名前缀 $servername = trim($_SERVER['SERVER_NAME'] ...
- Spark SQL UDF示例
UDF即用户自定函数,注册之后,在sql语句中使用. 基于scala-sdk-2.10.7,Spark2.0.0. package UDF_UDAF import java.util import o ...
- Spring 源码学习系列
前言 Spring框架之于 JavaEE 程序员来说,犹如锄头之于农民.Java 程序员每天都要使用Spring框架,Spring框架也确实是个可手的工具. 最初使用Spring的时候,我们需要配置m ...