如果你要和Linux打交道,我觉得Vim/Vi是必须要熟练掌握的一门手艺,不论Vim的其他优点。虽然Vim对于初学者十分的不友好,可是等真正掌握了之后,你会喜欢上vim下的自由和离开鼠标干扰的自在.
Vim的基础知识
vim对应命令键盘图
四种模式
正常模式NORMAL
正常模式下,可以移动光标,删除行列或者字符,查询字符
| 正常模式 | |
| h或者向左箭头⬅️ | 光标向左移动一个字符 |
| j或者向下箭头⬇️ | 光标向下移动一个字符 |
| k或者向上箭头⬆️ | 光标向上移动一个字符 |
| l或者向右箭头➡️ | 光标向右移动一个字符 |
| 可以使用数字键搭配hjkl的组合键来移动光标到想到的位置,比如向上移动20行,可以输入“20k”来完成 | |
| ngg或者nG | 跳转到第n行 |
| gg | 移动到文档的第一个字符 |
| G | 移动到文档的最后一行 |
| $ | 移动到这一行的最后一个字符 |
| 0 | 移动到所在行的第一个字符 |
| n+Enter | 光标向下移动n行 |
| n+空格键 | 光标向右移动n个字符 |
| 复制黏贴删除 | |
| yy | 复制光标所在那一行 |
| nyy | 复制光标所在的向下n行 |
| y0 | 复制光标所在字符到本行行首 |
| y$ | 复制光标所在字符到本行行尾 |
| yG | 复制光标所在行到最后一行 |
| y1G | 复制光标所在行到第一行 |
| p(小写) | 将复制内容在光标下一行进行粘贴 |
| P(大写) | 将复制内容在光标上一行进行粘贴 |
| x(小写) | 删除光标当前所在位置字符 |
| X(大写) | 删除光标当前位置前一个字符 |
| nx | 向后删除n个字符 |
| dd | 删除光标所在行 |
| ndd | 删除光标当前位置向下n行 |
| d0 | 删除光标所在字符到本行行首 |
| d$ | 删除光标所在字符到本行行尾 |
| dG | 删除光标所在行到最后一行 |
| d1G | 删除光标所在行到第一行 |
| u | 撤销前一个操作 |
| [Ctrl]+r | 回退上一个操作之前的状态 |
| . | 重复前一个动作 |
| 搜索和替换 | |
| /+字符串 | 向下搜索字符串 |
| ?+字符串 | 向上搜索字符串 |
| n | 重复上面的搜索动作,刚执行完“/+字符串”的动作后,会向下继续搜索这个字符串 |
| N | 与n相反,向上继续搜索这个字符 |
| :n1,n2s/word1/word2/g | 在n1,n2行之间搜索world1字符串,并替代为world2 |
| :1,$s/word1/word2/g | 从第一行到最后一行之间搜索world1字符串并替代为world2 |
| :1,$s/word1/word2/gc | 从第一行到最后一行之间搜索world1字符串并替代为world2,取代前提示用户确认 |
插入模式INSERT
| 进入插入模式 | |
| i | 从目前光标所在的字符开始输入 |
| I | 从目前光标所在行的第一个非空字符开始输入 |
| a | 从目前光标所在的下一个字符开始输入 |
| A | 从目前光标所在行位置的最后一个字符处开始输入 |
| o | 在目前光标所在位置的下一行开始输入新的一行 |
| O | 在目前光标所在位置的上一行开始输入新的一行 |
| 进入替换模式 | |
| r | 只会取代光标所在的那一个字符一次 |
| R | 会一直取代光标所在字符,直到按下键为止 |
可视模式VISUAL
可视模式可以用来选择文本,并进行批量处理
| 进入可视模式 | |
| v(小写) | 逐个字符进行文本选择 |
| V(大写) | 逐行进行文本选择 |
| [Ctrl]+v | 按照文本块的方式进行文本选择 |
| 可以在选中的区域进行模式切换,例如行文本模式中输入v转为字符模式/输入[Ctrl]+v转为文本块模式 | |
| 对选中对区域进行操作 | |
| d | 删除选中的文本 |
| c | 修改选中的文本 |
| r | 替换选中的文本 |
| I | 在选中的文本前插入 |
| A | 在选中的文本后插入 |
| gu | 选中的区域转为小写 |
| gU | 选中的区域转为大写 |
| g~ | 大小写互换 |
| > | 向右锁进一个字符 |
| < | 向左锁进一个字符 |
命令行模式
命令行模式是在正常模式下对文档进行的整体配置和操作
| 相关指令 | |
| :w | 保存写入文档 |
| :w! | 强制写入 |
| :q | 退出文档 |
| :q! | 退出文档不 |
| :wq | 保存退出文档,:wq!则为强制保存退出文档 |
| zz | 若文档没有更改则不保存并退出,若文档变更了,则存储后退出 |
| I | 在选中的文本前插入 |
| :w [filename] | 另存为一个filename命名的文档 |
| :n1,n2[filename]/td> | 将n1到n2行的内容存储到filename的这个文档 |
| :!+command | 在vi中查看执行commnad命令的结果,例如:!ls /home 可以在vi中查看/home下输入文档信息 |
在命令行模式中,还可以对vim的配置进行操作,例如:set nu,可以显示行号,在每一行前显示该行的行号。而为了方便和管理,我们通常在.vimrc文件中设置vim配置。
配置.vimrc文件
对。vimrc文件进行配置,可以方便我们操作,搭建成适合自己的编辑器。
基础配置
显示行号
1 | set number |
显示标尺
1 | set ruler |
历史纪录
1set history=1000
显示命令行
1 | set showcmd |
显示状态行的内容
1 | set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")} |
启动显示状态行1,总是显示状态行2
1 | set laststatus=2 |
语法高亮显示
1 | syntax on |
2 | set fileencodings=utf-8,gb2312,gbk,cp936,latin-1 |
3 | set fileencoding=utf-8 |
4 | set termencoding=utf-8 |
5 | set fileformat=unix |
6 | set encoding=utf-8 |
去掉有关vi一致性模式,避免以前版本的一些bug和局限,解决backspace不能使用的问题
1 | set nocompatible |
2 | set backspace=indent,eol,start |
3 | set backspace=2 |
启用自动对齐功能,把上一行的对齐格式应用到下一行
1 | set autoindent |
去掉输入错误提示声音
1 | set noeb |
自动保存
1 | set autowrite |
突出显示当前行
1 | set cursorline |
突出显示当前列
1 | set cursorcolumn |
共享剪贴板
1 | set clipboard+=unnamed |
文件被改动时自动载入
1 | set autoread |
顶部底部保持3行距离
1 | set scrolloff=3 |
高级配置
更换为自己习惯的快捷键方式,方便写入,存储,寻找,载入等操作
替换功能键
禁用s键,替换大写S键为保存
1 | map s <nop> |
2 | map S :w<CR> |
替换Q键为退出
1 | map Q :q<CR> |
用R键替换source当前vimrc文件
1 | map R :source $MYVIMRC<CR> |
用空格代替tab
1 | set expandtab |
插件安装
主要用了两个插件管理工具Vundle和vim-plug
Vundle的安装
使用Vundle来管理插件
1 | set nocompatible " be iMproved, required |
2 | filetype off " required |
启用vundle来管理vim插件
1 | set rtp+=~/.vim/bundle/Vundle.vim |
2 | call vundle#begin() |
3 | "安装插件写在这之后 |
4 | Plugin 'VundleVim/Vundle.vim' |
5 | Plugin 'scrooloose/nerdtree' |
6 | Plugin 'yggdroot/indentline' |
7 | "安装插件写在这之前 |
8 | call vundle#end() " required |
9 | filetype plugin on " required |
几个常用的命令
1 | " :PluginList - 查看已经安装的插件 |
2 | " :PluginInstall - 安装插件 |
3 | " :PluginUpdate - 更新插件 |
4 | " :PluginSearch - 搜索插件 |
5 | " :PluginClean - 删除插件,把安装插件对应行删除,然后执行这个命令即可 |
vim-plug的安装
vim-plug来管理安装插件
1 | call plug#begin('~/.vim/plugged') |
2 | |
3 | " 安装插件写在这之后 |
4 | " |
5 | " If you have nodejs and yarn |
6 | |
7 | Plug 'iamcco/markdown-preview.nvim', { 'do': 'cd app & yarn install' } |
8 | |
9 | " 安装插件写在这之前 |
10 | " Initialize plugin system |
11 | call plug#end() |
几个常用命令
1 | :PlugInstall - 安装插件 |
2 | :PlugUpadte - 更新插件 |
3 | :PlugStatus - 查看安装插件情况 |
主题配置
推荐几个好看的主题
dracula

个人比较喜欢的vim主题,确实有🧛♂️的魔力,在 dracula官网按照guide可以用vundle和vim-plug这两个之前介绍的插件进行安装。
darcula

将项目git clone到本地,将其中darcula/colors/darcula.vim拷贝到~/.vim/colors目录中,在.vimrc中设置
1 | colorscheme darcula |
Janah

和上面一样将项目git clone到本地,将其中vim-janah/colors/janah.vim拷贝到~/.vim/colors目录中,然后在.vimrc中添加
1 | autocmd ColorSchmem janah highlight Normal ctermbg=235 |
2 | colorscheme janah |