Vim 3 vimrc

Vim 系列教程目录:git

什么是 vimrc

vimrc 是 Vim 的配置文件, Vim 在启动时会加载 vimrc 文件, 你能想到的几乎全部的配置(包括主题, 快捷键, 插件设置等等), 均可以配置在 vimrc 中, 因此, vimrc 在 Vim 使用过程当中有着相当重要的地位. Vim 是极其依赖 vimrc 配置的, 没有通过配置的 Vim 又丑又难用, 可是你若是懂得怎么配置, 就能够把 Vim 变成你想要的样子.github

这里要明确一个概念: vimrc 中的大多数配置都是 Vim 命令模式下支持的命令, 均可以在命令模式下使用, 可是在命令模式中使用时, 只针对当前打开的 Vim 实例有效, 关闭了 Vim 以后再次打开, 以前在命令模式下的设置就无效了. 而配置到 vimrc 中, 每次 Vim 启动时都会自动读取并执行, 因此能够自动生效.vim

那么 vimrc 文件在哪呢? 打开 Vim, 使用 :version命令, 便可查看 Vim 的版本信息, 其中就包括了 vimrc 文件的位置. 个人电脑是 Windows, 能够看到相似以下输出:bash

VIM - Vi IMproved 8.1 (2018 May 18, compiled May 18 2018 18:36:07)
MS-Windows 32 位图形界面版本 带 OLE 支持
包含补丁: 1
...
     系统 vimrc 文件: "$VIM\vimrc"
     用户 vimrc 文件: "$HOME\_vimrc"
 第二用户 vimrc 文件: "$HOME\vimfiles\vimrc"
 第三用户 vimrc 文件: "$VIM\_vimrc"
      用户 exrc 文件: "$HOME\_exrc"
  第二用户 exrc 文件: "$VIM\_exrc"
    系统 gvimrc 文件: "$VIM\gvimrc"
    用户 gvimrc 文件: "$HOME\_gvimrc"
第二用户 gvimrc 文件: "$HOME\vimfiles\gvimrc"
第三用户 gvimrc 文件: "$VIM\_gvimrc"
       defaults file: "$VIMRUNTIME\defaults.vim"
        系统菜单文件: "$VIMRUNTIME\menu.vim"
复制代码

经过上述信息可知, vimrc 文件的位置其实很是多, 加载顺序是自上而下, 找到第一个则使用第一个, 后续的再也不使用, 若是第一个找不到, 则会依次向下寻找, 直到找到为止.编辑器

这里有一个问题, $VIM$HOME 指的是什么? 这两个变量的值可使用以下命令查看:工具

:echo $VIM
:echo $HOME
复制代码

$VIM 是 Vim 安装目录, $VIM 可写为 $vim, 不区分大小写, $HOME 是用户目录, $HOME 区分大小写.post

Windows 版的 Vim 在安装时, 会自动在安装目录下生成一个 _vimrc 文件, 也就是 $VIM/_vimrc, 即 "第三用户 vimrc 文件", 其余 vimrc 文件都是不存在的, 因此通常来讲修改 $VIM/_vimrc 文件便可.字体

Linux 和 Mac 的查看及寻找方式也是同样的, 一样是使用 :version 命令, 这里再也不赘述.ui

接下来咱们就能够修改 vimrc 文件了. 在这以前请切记: 不要把任何你不理解的配置放到你的vimrc中, 你能够在网上找到成吨的 vimrc 配置文件, 但那都是别人的, 若是你不理解他们的配置, 一切照搬过来, 那结果是很糟糕的.编码

PS. 我后续的演示及配置都是基于 Windows 的. 另外, 在修改 vimrc 以前, 请先本身备份一个, 确保改坏了还能恢复回来.

基本修改

首先第一条要修改的就是: 关闭兼容模式. Vim 默认是以兼容 Vi 的模式运行的(Vi 是远古时期的 Vim), 在这种模式下, 不少 Vim 的高级特性都没法使用, 因此首先就要关闭兼容模式, 请把这条配置放在你 vimrc 文件的第一行:

set nocompatible " 关闭兼容模式 复制代码

vimrc 中, " 号后面的内容为注释.

修改并保存以后要使之生效, 须要重启 Vim. 还有个更简单的方法, 就是在命令模式下输入 下面两个命令中的任意一个:

:source $vim/_vimrc
:source %
复制代码

大部分状况下, 执行完上面的命令后, vimrc 的修改会当即生效, 可是有些特殊配置执行完这两个命令后不能及时生效, 这时就只能重启 Vim 了. 另外, :source 命令可简写为 :so

UI 相关配置

若是你以为默认字体很差看, 可使用以下配置修改字体:

set guifont=Consolas:h14
复制代码

这表示使用 Consolas 字体, 字号为 14.

另外, 对于一个成熟的 vimer 来讲, 界面上那些菜单, 工具栏什么的都是没啥用的, 能够关掉.

" 关闭工具栏 set guioptions-=T " 关闭菜单
set guioptions-=m
" 关闭左侧滚动条 set guioptions-=L " 关闭右侧滚动条
set guioptions-=r
" 启动时最大化 autocmd GUIEnter * simalt ~x 复制代码

注意: vimrc 中, 赋值配置的 = 右边最好不要有空格, 有些值加了空格没法识别.

编码相关配置

Vim 的编码系统比较混沌, 几乎说不清楚, 总之你按照下面的配置方式就没问题了:

" 设置vim内部编码 set encoding=utf-8 " 设置编辑文件时的编码
set fileencoding=utf-8
" 设置 Vim 能识别的编码 set fileencodings=ucs-bom,utf-8,cp936,gb18030,gb2312,big5,cuc-jp,cuc-kr,latin " 设置终端模式(非 GUI 模式)下的编码
set termencoding=utf-8
" 防止特殊符号没法显示 set ambiwidth=double " 解决 console 输出乱码
language messages zh_CN.utf-8
复制代码

文件相关配置

默认状况下, Vim 在运行期间会生成临时文件和备份文件, 以及修改历史文件(undo文件), 这些文件用处不大, 都是能够关掉的.

" 文件被外部改动后, 自动加载 set autoread " 不生成备份文件
set nobackup
" 不生成临时文件 set noswapfile " 不生成 undo 文件
set noundofile
复制代码

还有个很重要的设置: 打开文件类型检测. 这个设置几乎是必须打开的.

" 自动检测文件类型, 并根据文件类型显示代码高亮, 设置缩进格式, 加载对应插件 filetype plugin indent on " 至关于下面三行
" filetype on " 根据文件后缀以及文件内容检测文件类型
" filetype indent on " 根据文件类型设置相应的缩进格式
" filetype plugin on " 根据文件类型加载相应的插件
复制代码

编辑器相关配置

下面的配置是大都是和编辑相关的:

" 显示行号 set number " 显示语法高亮
syntax enable
syntax on
" 显示 tab(>---), 空格(^), 换行(¬) set list set listchars=tab:>-,trail:^ ",eol:¬
" 突出显示当前行 set cursorline " 开启自动缩进
set autoindent
" 智能缩进 set smartindent " 编辑时按一个 Tab 键至关于输入4个空格
set tabstop=4
" 格式化时缩进尺寸为4个空格 set shiftwidth=4 " 让 Vim 把连续的空格视为一个 Tab, 删除时能够一次删掉一个 Tab 的空格数量
set softtabstop=4
" 把制表符转换为多个空格, 具体空格数量参考 tabstop 和 shiftwidth set expandtab " 在行和段的开始出使用 Tab
set smarttab
" 合并两行中文时, 不在中间加空格 set formatoptions+=B " 合并行时不添加多余空格
set nojoinspaces
" 高亮显示匹配的括号 set showmatch " 高亮显示搜索到的关键字
set hlsearch
" 即时搜索 set incsearch " 智能大小写敏感, 只要有一个字母大写, 就大小写敏感, 不然不敏感
set ignorecase smartcase
复制代码

通过这一系列配置, 你会发现你的 Vim 变好看了一些, 也更好用了一些.

按键映射

Vim 中有大量的快捷键(按键映射), 除此以外, 你还能够配置本身的按键映射.

使用 :map 相关的命令能够定义本身的快捷键. map 命令的本质是将一个按键序列转化为另外一个按键序列. 这里咱们根据一个例子, 来理解 Vim 的按键映射. 在命令模式下执行下面的命令能够将 F3 映射为一个功能: 在文件最底部输入文件名.

:map <F3> GoFile Name: <Esc>"%p 复制代码

在命令模式下输入上述命令, 回车, 而后在普通模式下按 F3, 你会发现文件底部输入了当前文件名, 很神奇吧.

接下来解释一下上面的命令干了什么: 首先使用 map 命令进行按键映射, 要映射的键是 <F3>, 而后空格后面的内容就都是新的按键序列了, G 移动到最后一行, o 开始一个新行并进入插入模式, 而后插入文本 'File Name: ', 而后<Esc>键进入普通模式, 而后使用 "% 访问文件名寄存器, 最后 p 粘贴出寄存器内容.

能够看到, 按键映射本质上就是一系列输入, 包括各类模式的切换, 都在输入序列中了.

map 命令能够在普通模式, 可视模式下工做, 有时候须要在特定的模式下使用某些按键映射, Vim 也提供了相应的命令, 以下表:

递归 非递归 模式
:map :noremap 普通模式, 可视模式
:nmap :nnoremap 普通模式
:xmap :xnoremap 可视模式
:cmap :cnoremap 命令模式
:imap :inoremap 插入模式

这里解释一下递归的问题: 假设你将 按键 a 映射成了 按键 b, 又把按键 b 映射成了 命令x, 当使用递归命令映射的状况下, 你按 a 键, 最终会执行 命令x, 若是使用非递归命令映射, 则你按 a 键, 会执行 b 键的功能, 只有按 b 键, 才会执行 命令x.

结论: 若是确实应该使用递归, 则使用递归映射, 不然通常使用非递归映射

另外, F1-F12键, Esc键, 回车键等各类功能键都有对应的字母序列, 可经过下面的命令查看:

help key-notation
复制代码

注意: 功能键的字母序列不区分大小写, 即 和 是 等效的.

另外, 使用上述命令配置的按键映射只对当前 Vim 实例有效, 重启 Vim 以后就无效了. 那咋办? 很简单, 把配置写在 vimrc 中就能够了, 下面是个人一些按键配置:

" 将 kk 配置成 esc, Esc 键太远了, 从插入模式到普通模式, 连续按两次 k 便可 inoremap kk <esc> " ctrl-h  光标左移一格
inoremap <c-h> <left>
" ctrl-j 垂直下移一行 inoremap <c-j> <down> " ctrl-k  垂直上移一行
inoremap <c-k> <up>
" ctrl-l 光标右移一格 inoremap <c-l> <right> " 按 U 执行 redo
noremap U <c-r>
" shift 回车, 在下一行输入 inoremap <s-cr> <end><cr> " 在可视模式下使用p粘贴时不替换寄存器内容, 这里是利用了黑洞寄存器
vnoremap p "_dP " 对于很长的行, vim会自动折行, 此时 j 或者 k 就会一下跳不少行,
" 使用 gk,gj 能够避免跳过多行, 可是不方便, 因此作了以下映射. nnoremap k gk nnoremap j gj vnoremap k gk vnoremap j gj 复制代码

看到这里你可能会有疑问: 在插入模式下, 我把 Ctrl-h/j/k/l 映射成左下上右, 不以为麻烦吗? 并不, 由于我使用另外一款软件: KeyTweak, 把 Ctrl 键的位置换到了 Alt 键上, 这样我就能很方便地使用 Ctrl 键了.

<leader>

<leader> 键是 Vim 中一个比较特殊的按键, 被称为前置键, 默认是 \, 这个键的做用是: 先按下前置键, 松开后再按别的按键, 就能够造成一套快捷键.

因为 \ 键比较难按到, 通常都会将前置键改成容易按到的键, 我将其改成 ;了, 须要在 vimrc 中添加以下配置:

let mapleader=";"
复制代码

而后就能够很愉快的使用前置键映射各类快捷键了:

" 将 <leader> 键配置为 ';' let mapleader=";" " 按 <leader>w 保存文件
nnoremap <leader>w :w<cr>
" 按 <leader>2 执行上一次的宏 nnoremap <leader>2 @@ " 可视模式下按 <leader>y 将内容写入系统寄存器
vnoremap <leader>y "+y " 按 <leader>p 将系统寄存器中的内容粘贴出来
nnoremap <leader>p "+p " 按 <leader>no 取消搜索高亮, 没错, <leader> 键后面能够跟键序列
nnoremap <leader>no :nohlsearch<cr>
" 按 <leader>k 向上移动半屏 nnoremap <leader>k <c-u> " 按 <leader>j 向下移动半屏
nnoremap <leader>j <c-d>
复制代码

能够看到, 前置键的映射方式和其余键的映射方式是同样的.

须要注意的是, <leader> 键的按键映射能够将多个按键映射成另外一个序列或指令, 例如:

" 将 <leader>no 映射成命令 :nohosearch<cr> nmap <leader>no :nohlsearch<cr> 复制代码

这样也会带来一个问题: 若是既有 <leader>n, 又有 <leader>no, 那么当你输入 <leader>n 的时候, Vim 就得等下一个按键 o 的输入(相似于 kk 映射成 Esc), 这会浪费一些时间, 甚至影响你本来的意图, 因此多个键映射尽可能不要出现"同序的相同字符", 改成 <leader>nn, <leader>no 就不会有问题了.

个人 vimrc

不少 vimer 会把本身的 vimrc 挂到网上, 供别人参考. 这里也贴一下个人 vimrc 地址吧:
github.com/GraysonGao/…

我其实配置的东西比较少, 大都是些基本配置, 并且添加了详细的注释, 很容易看懂.

小结

如今, 你几乎已是个高阶玩家了, 如今的你再去看 Vim 的文档以及各类 Vim 的文章, 就很容易看懂了.

相关文章
相关标签/搜索