前言

前面已经了解了最最基本的Vim操作方式,简单的使用Vim已经没问题了,但是初始的Vim过于简陋,需要简单的配置一下

打开Vim时会自动加载配置文件,配置文件路径是固定的:

  • Vim的配置文件路径:~/.config/vim/vimrc
  • Neovim的配置文件路径:~/.config/nvim/init.vim

设置选项

行号设置

首先,作为一个编辑器至少需要显示行号。除了绝对行号之外,(Neo)Vim还支持显示相对行号,两种方式同时启动会开启混合模式。

混合模式下当前光标所在行显示绝对行号,其他行显示相对行号,相对行号非常契合Vim的操作方式。
比如,要删除一段文本通过相对行号能够直接看出要向下删除 n 行,然后直接 dnj 就能完成删除操作

" 显示行号
set number

" 显示相对行号
set relativenumber

" 设置行号显示的宽度
set numberwidth=4

文本缩进

(Neo)Vim默认一个 <tab> 相当于8个空格,通常一个 <tab> 对应两个或四个空格比较合适

" 设置一个 `<tab>` 宽度为4个空格
set tabstop=4
set softtabstop=4

" 设置手动使用 `>>` 或 `<<` 时缩进4个空格
set shiftwidth=4

" 设置文本缩进长度为 shiftwidth 的倍数
set shiftround

" 设置自动缩进
" (Neo)Vim 默认有三种自动缩进模式 cindent, autoindent, smartindent
set smartindent

文本高亮

代码高亮是非常重要的,同时光标的位置也应该能够直观的凸显出来

" 设置开启代码高亮,Neovim默认开启
set syntax

" 高亮光标所在行
set cursorline

" 高亮光标所在列
set cursorcolumn

使用 /? 查找单词时,通常也会希望将匹配到的结果高亮显示

" 高亮匹配的文本
set hlsearch

" 搜索时忽略大小写
set ignorecase

" 搜索包含大写字母时,严格匹配
set smartcase

其他设置

还有一些不知道要怎么分类,但是个人感觉很有用的功能

" 文本超出屏幕,不换行显示
set nowrap

" 屏幕上下保留行,让眼睛能够看着屏幕中间
set scrolloff=10

" 命令模式使用 `<tab>` 补全时,显示选项卡
set showcmd

" 右下角显示搜索索引
set shortmess-=S

" 允许光标自动换行
set whichwrap+=<,>,h,l

" 使用系统剪辑版
set clipboard+=unnamedplus

" 允许光标移动到行尾
set virtualedit=block,onemore

键盘映射

(Neo)Vim 通过使用 nmapimap 以及 vmap 命令分别在 Normal、Insert 和 Visual 模式生效。

*map 命令虽然方便,但是会导致递归操作,使用 *noremap 可以避免映射内容递归运行

Leader

(Neo)Vim 可以通过配置 mapleader 变量来配置前缀键,使用 <leader> 引用,使用前缀键能够避免快捷键与 Normal 模式下的操作方式冲突

let mapleader = ","

Esc

使用 (Neo)Vim 编辑文件时存在一个问题,每一次切换模式都需要左手离开现在的位置去按 <esc>
比较推荐使用两个不容易同时出现的字母代替 <esc> 操作,例如:jj, qq等等

inoremap qq <esc>

分屏

(Neo)Vim 可以在 Command 模式下使用 :split:vsplit 命令水平或垂直分屏,配合 :e filepath 打开其他文件

可以在 Normal 模式下建立一个映射,快速的完成分屏操作

nnoremap <leader>si :split<cr>
nnoremap <leader>su :vsplit<cr> 

完成分屏之后,还需要让光标能够在多个文件之间进行切换

(Neo)Vim 自带的命令是使用 <c-w> + h, j, k, l 进行切换,每次都需要多按一次 <c-w>

可以设置映射使用 <c-h> 代替 <c-w>h,操作方便的同时也契合 h 光标向左移动的特性

nnoremap <c-h> <c-w>h
nnoremap <c-j> <c-w>j
nnoremap <c-k> <c-w>k
nnoremap <c-l> <c-w>l

大小

(Neo)Vim 分屏一般会平分屏幕的高度或高度,可以使用命令手动的修改屏幕大小

既然 hjkl 可以移动光标了,那么小键盘上下左右键失去了原先的意义,就很适合用来修改分屏的大小

nnoremap <up> :res +5<cr>
nnoremap <down> :res -5<cr>
nnoremap <left> :vertical resize-5<cr>
nnoremap <right> :vertical resize+5<cr>

标签

(Neo)Vim 还支持打开多个标签,通过键盘映射快速的插件、切换以及关闭标签

nnoremap <leader>tt :tabnew<cr>
nnoremap <leader>tn :tabNext<cr>
nnoremap <leader>tp :tabprevious<cr>
nnoremap <leader>tc :tabclose<cr>

杂项

augroup init
  autocmd!

  " 代码折叠
  autocmd FileType vim setlocal foldmethod=marker

  " 打开文件时,恢复上一次关闭文件时光标所在行
  autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | execute "normal! g'\"" | endif

augroup END