vim 配置与使用

Vim 的使用

vi-vim-cheat-sheet-sch

至于 vim 是什么就无需多做介绍了, 直接进入使用说明好了:

最基本的操作 – 使用 vim 打开一个指定的文件[doge]: vim filepath

其他基本用不着的打开文件操作

1
2
3
4
5
6
# 打开指定文件,并将光标移动到指定行(eg. 5)
$ vim +5 filepath
# 打开指定文件,并高亮显示关键词(eg. keyword)
$ vim +/keyword filepath
# 打开多个文件
$ vim filepath1 filepath2 filepath3

当然如果只是想简单用一下 vim 编辑一丢丢内容,那么只需要知道以下操作即可:

  1. vim filepath 打开目标文件
  2. i
  3. 开始编辑
  4. 编辑完成按 ESC
  5. :wq 或者按两下 Z 键 (Shift + z) 保存退出

如果想学习一下 vim 的使用:

Vim 学习资料:

Vim Mode

首先是介绍 Vim 的四种基本的模式,以及在各个模式下比较常用的一些操作

Normal Mode

  • vim 的默认模式,使用 vim 打开文件之后默认进入的就是这个模式
  • 在这个模式下不能像 Sublime、VSCode 那样直接对文件进行编辑操作,但可以通过快捷键进行编辑(比如删除行、复制行、删除单个字符、移动光标、粘贴等)
  • 另外如果要切换到其他模式,都需要先回到 Normal Mode

Normal Mode 常用操作

后面所有 Ctrl + 的组合键都用vim配置文件中的形式表示,即 <C-...> 【大小写不敏感】

光标移动 作用
h 往左移动
j 往下移动
k 往上移动
l 往右移动
gg 移动到首行
G 移动到尾行
mG 移动到第m行(这里m代指一个数字)
0 到行首
^ 到行首第一个非空白字符
$ 到行末尾
w 移动到下一个单词起始处
b 移动到上一个单词起始处
f< 跳转到目标字符处(这里是<)
<C+f> 向下翻屏
<C+b> 向上翻屏
<C+u> 向下翻半屏
<C+d> 向上翻半屏
分屏操作 作用
<C+w> s 上下分割,打开当前文件
:sp filepath 上下分割,打开新文件(Command Line Mode)
<C+w> v 左右分割,打开当前文件
:vsp filepath 左右分割,打开新文件(Command Line Mode)
<C+w> h 切换到左边的窗口
<C+w> j 切换到下边的窗口
<C+w> k 切换到上边的窗口
<C+w> l 切换到右边的窗口
<C+w> w 切换到下一个窗口
基本操作 作用
y 复制选中的内容
yn 复制包括当前行在内往下n行的内容(这里n代指数字)
yip 复制当前段落内容
yy 复制当前行
p 粘贴到光标后
P 粘贴到光标前
x 删除光标所在的字符
dd 删除当前行
dn 删除包括当前行在内往下n行的内容(这里n代指数字)
dw 删除从光标所在位置开始的一个单词
D 删除从光标所在位置开始到行末尾的内容
u undo
<C+r> redo
. 重复上一次操作
ZZ 保存并退出(大写Z)

不常用的折叠代码块操作

折叠操作 作用
zc 折叠代码块
zo 打开折叠
zr 展开所有折叠
za 打开/关闭折叠
zn 禁用折叠
zN 启用折叠
1
2
:set foldmethod = indent   # 用缩进表示折叠,适用于Python
:set foldmethod = syntax # 根据语法进行折叠
  • 详细的说明可以直接查文档: :help folding

Insert Mode

  • 在这个模式下可以直接对文件内容进行编辑
    • 进入方式: 在 Normal Mode 下按 i 进入 Insert Mode
      • 这里的 i 实际上是指在当前光标之前插入文本,其实还有一些常用的进入 Insert Mode 的按键:
        • a 也可进入 Insert Mode,这里则是在光标之后插入文本
        • o (小写字母o)是在当前行下方插入新的一行并进入 Insert Mode
        • O (大写字母O)是在当前行上方插入新的一行并进入 Insert Mode
        • S 是删除掉当前行并进入 Insert Mode
        • C 是删除从当前位置到行尾的字符并进入 Insert Mode
      • 还有很多进入 Insert Mode 的方式,可以使用 :help inserting 查询
    • 退出方式:在 Insert Mode 下按 ESC 即可切换回 Normal Mode
      • 同样退出方式也有多种,ESC 只是其中一个
        • <C-c> 也是可以的
        • <C-[> 也可,效果跟 ESC 一样

Command Line Mode

  • 在这个模式下可以在末行输入命令来对文件进行一系列操作(搜索、高亮、替换、保存、退出等等)
    • 前面提到的使用 :help xxxx 查询就是在这个模式下执行的
    • 进入方式:
      • 在 Normal Mode 下按下 : 键即可进入 Command Line Mode,在末行也可以看到输入的这个 :
    • 退出方式:
      • 命令执行完自动会返回到 Normal Mode
      • 不想执行已经键入的内容也可直接 <C-c> 返回到 Normal Mode
  • 如果想要搜索内容,则可在 Normal Mode 下按 / 键(逆向搜索的话是 ?),然后输入 search pattern 回车即可搜索
    • 光标会定位到搜索结果处,如果有多个,可按 n 键跳转到下一个匹配项,按 N 跳转到上一个匹配项

Command Line Mode 常用操作

基本操作 作用
:w 保存
:wq 保存并退出
:q! 不保存强制退出
:e filepath 打开文件 (在当前窗口打开)
:bn 切换缓冲区下一个文件(打开多个文件时)
:bp 切换缓冲区上一个文件(打开多个文件时)
:tab filepath 在新标签页打开文件
:noh 取消搜索匹配的高亮显示
:! 执行系统命令
:s 替换文本
  • 在 Command Line Mode 下可以执行命令进行一些复杂操作
    • 例如要将当前行中的 abc 替换成 efg
      • :s/abc/efg/g 这里末尾的 g 表示所有匹配项都要替换,如果要忽略大小写则是指定 i
  • 更多的命令查文档学习即可(😅别的也不会了,这些暂时也够用了)

Range

  • 在默认情况下,像 :d:y:s 这样的命令都是作用在当前行上, :w 这样的命令是作用在整个文件上,其实可以通过使用 range 来指定命令的作用域。
  • 详细的说明: :help range
  • 这里就随便举几个常用的例子好了:
    • 例如要删除第3行到第5行的数据: :3,5d
    • 例如要复制第6行到最后一行的数据: :6,$y, 这里 $ 代表末行
    • 例如要从整个文件中将所有的 abc 替换成 efg: :%s/abc/efg/g, 这里 % 代表所有行
    • 例如要在第3行到第6行头部添加注释符 // : :3,6 normal i//

Visual Mode

  • 在这个模式下可以选择需要操作的文本, 在批量注释的时候能用到
    • 进入方法:
      • Character mode: v (小写v)
      • Line mode: V (大写V)
      • Block mode: Ctrl + v

三种模式的对比

直接看图体会吧:

vim-virtualmode
  • 选好要操作的区域之后按 : 进入 Command Line Mode 继续进行命令操作

打造一个适合自己的 vim

image-20230717211652454

vim 是可以整出❀来的,各种插件主题安排上,可以打造出一个用起来很爽的 IDE,如果自己懒得折腾,也可以直接上 vimplus;如果想自己折腾,那这里推荐一些好用的插件:

插件/主题推荐

  • 首先第一步,装 vim 的插件管理器 👉 vim-plug
    • 一个非常轻量化的插件管理器
    • 一句命令把 plug.vim 下载到 .vimautoload 目录即安装完毕
1
2
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

在不重启vim的情况下重载配置文件: :source $MYVIMRC

个人用的插件集合

.vimrc 中的 vim-plug 插件列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
call plug#begin()

" vim 启动屏幕,可显示最近打开的文件
Plug 'mhinz/vim-startify'
" vim 主题
Plug 'NLKNguyen/papercolor-theme'
" Plug 'cocopon/iceberg.vim'
" Plug 'joshdick/onedark.vim'
" vim 图标
Plug 'ryanoasis/vim-devicons'
" vim 底部状态栏增强
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
" vim 目录树
Plug 'preservim/nerdtree'
" vim 撤销树
Plug 'mbbill/undotree'
" vim 展示文件整体结构
Plug 'preservim/tagbar'
" vim git插件
Plug 'tpope/vim-fugitive'
" vim 括号自动补全
Plug 'jiangmiao/auto-pairs'
" vim 快速模糊搜索
Plug 'Yggdroot/LeaderF', { 'do': ':LeaderfInstallCExtension' }
" vim 分割线
Plug 'Yggdroot/indentLine'
" vim 代码自动补全
Plug 'ycm-core/YouCompleteMe'
" vim 代码块
Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'
" vim 代码模板
Plug 'chxuan/prepare-code'
" vim 快速注释
" Plug 'scrooloose/nerdcommenter'
" vim 语法高亮
Plug 'sheerun/vim-polyglot'

call plug#end()

个人使用的 .vimrc 配置

🤔完整的配置文件备份在这里

这里就放一点不带插件配置的基本设置内容好了(内容不再更新, 新的在👆):

.vimrc 基本配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
" 语法高亮
syntax enable
" 启用256色
set t_Co=256
set encoding=utf-8 " 指定使用utf-8
filetype plugin on " 文件类型检测
set number " 开启行号
set cursorline " 高亮显示当前行
set linebreak " 只有遇到指定符号才换行
set laststatus=2 " 显示状态栏
set virtualedit=block,onemore " 允许光标出现在最后一个字符的后面
set backspace=indent,eol,start " 设置backspace可在INSERT模式下删除
" set cmdheight=2 " 设置命令行的高度
set showcmd " 在命令行显示输入的命令
set ttimeoutlen=0 " 设置<ESC>键响应时间
" 在命令模式下启用命令补全
set wildmenu
set wildmode=longest:list,full

set autoindent " 设置自动缩进
set smartindent " 智能选择对齐方式
set expandtab " 将制表符扩展为空格
set tabstop=4 " 设置tab=4空格
set shiftwidth=4 " 设置缩进为4空格
set smarttab " 在行和段开始处使用制表符

set hlsearch " 高亮显示搜索结果
set incsearch " 开启实时搜索功能

set nobackup " 设置不备份
set noswapfile " 禁止生成临时文件
set autowrite " 设置自动保存
set autoread " 自动重新文件更改
set confirm " 在处理未保存或只读文件的时候,弹出确认

" 保留撤销历史
if !isdirectory($HOME."/.vim")
call mkdir($HOME."/.vim", "", 0700)
endif
if !isdirectory($HOME."/.vim/.undo")
call mkdir($HOME."/.vim/.undo", "", 0700)
endif
set undodir=~/.vim/.undo//
set undofile

" 设置记录的历史操作次数
set history=1000
" 当重新打开文件时光标回到上一次所在位置
if has('viminfo')
autocmd BufWinLeave ?* mkview " 在离开缓冲区时保存视图
autocmd BufWinEnter ?* silent loadview " 在进入缓冲区时加载视图
endif

" 自定义映射
" 配置 U 为重做
nnoremap U <C-r>
" 修改连按kj为ESC
inoremap kj <ESC>

关于配置文件的详细解释

  • set nocompatible 有无必要写在 vimrc 中?
    • 当 vim 检测到有 .vimrc 时会默认关闭 vi 兼容,所以根本用不着加这个
    • 可查看官方文档中的解释: :help nocompatible
  • syntax on vs syntax enable
    • syntax enable 不会覆盖先前的 highlight 设置,可以将 :highlight 命令放在它前面; syntax on 则会用默认的高亮颜色覆盖先前的配置
    • 可以查看官方文档中的解释: :help syntax-on
  • 按键映射设置相关,形如 <C-n> 的解释:
    • 查看官方文档: :help key-notation

:help key-notation 中一部分可能较为常用的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
                                        key-notation key-codes keycodes
These names for keys are used in the documentation. They can also be used
with the ":map" command (insert the key name by pressing CTRL-K and then the
key you want the name for).

notation meaning equivalent decimal value(s)
-----------------------------------------------------------------------
...
<CR> carriage return CTRL-M 13 carriage-return
<Return> same as <CR> <Return>
<Enter> same as <CR> <Enter>
<Esc> escape CTRL-[ 27 escape <Esc>
<Space> space 32 space
...
<S-...> shift-key shift <S-
<C-...> control-key control ctrl <C-
<M-...> alt-key or meta-key meta alt <M-
<A-...> same as <M-...> <A-
<D-...> command-key (Macintosh only) <D-
<t_xx> key with "xx" entry in termcap

使用过程中的一些小问题

  • 当复制粘贴一大段代码时缩进混乱

.vimrc 懒人专用配置

1
2
3
4
5
6
7
8
9
10
let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

function! XTermPasteBegin()
set pastetoggle=<Esc>[201~
set paste
return ""
endfunction
  • 遇到稀奇古怪的高亮显示问题(例如 Dockerfile 中指令后 [""] 的引号被隐藏且引号内的内容被高亮显示)
    • 原因: 缺少支持的语法高亮
    • 解决方案: 安装插件解决 -> vim-polyglot