你是否在编辑文件时以为键盘坏了,为什么不能删除呢,为什么不能敲代码呢,等你初识vi,会觉得这个东西为什么设计得这么难用,这篇教程带你熟练得用上这款经典的工具
 Vi 是在 Unix 系统上广泛使用的编辑器,Vim 是 Vi 的改进版本,由 Bram Moolenaar 在 1991 年发布,Vim兼容vi命令,现在很多系统将vi符号链接到Vim,所以使用vi命令其实还是用的Vim
安装Vim
#centos
sudo yum update
sudo yum install vim#debian/ubuntu
sudo apt update
sudo apt install vim
直接输入vi a.txt可以打开文件,文件不存在则创建新文件,按下i进入插入模式,输入4*4的a矩阵,按下esc即可退出到命令模式
修改vim配置文件
#查看vim信息
vi --version

#编辑vim配置
vi $HOME/.vimrc#语法高亮
syntax on
#tab占4个空格
set ts=4
#将tab转换为空格
set expandtab
#显示行号
set number
#实时计算其他行与当前行的距离
set relativenumber

命令模式(Command Mode)
当我们进入文件时处于命令模式,新建一个文件复制一篇英语作文,按下i,windterm再按Shist+Insert粘贴,练习一下就会了
命令模式才能移动光标,也就是刚进入文件的模式或者插入模式按下esc
vi/vim区分大小写,它设计的目的是让你用键盘解决问题,不需要用到鼠标
| 命令 | 移动光标 | 
|---|---|
| K | 上 | 
| J | 下 | 
| H | 左 | 
| L | 右 | 
| 2k | 向上移动2行(未配置 set relativenum) | 
| 4j | 向下移动4行(未配置 set relativenum) | 
| 4Enter | 向下移动4行 | 
| 2k | 移动到对应往上2行的行号,不用自己算多少行,实时显示其他行到当前行的距离(配置 set relativenum) | 
| 4j | 移动到对应往下4行行号,不用自己算多少行,实时显示其他行到当前行的距离(配置 set relativenum) | 
| n2空格 | number,跳到当前光标后指定2的位置,按下 n,再输入数字,再按空格,,例如跳到当前光标后6位:n6空格 | 
| 0或Home | 数字0,移动到行首 | 
| $或End | 移动到行尾 | 
| w | 向后跳到每个单词开头,括号也算一个单词 | 
| e | end,向后跳到每个单词末尾,括号也算一个单词 | 
| b | back,回到上一个位置,括号也算一个单词 | 
| - | 移动到非空格上一行 | 
| + | 移动到非空格下一行 | 
| gg | 移动到最顶部 | 
| G或Shift+g | 将光标移动到整个文档的最后 | 
| 4G或4 Shift+g | 将光标移动到整个文档的第4行 | 
| H或Ctrl+h | 光标移动到屏幕的最上方那一行的第一个字符 | 
| M或Ctrl+m | 光标移动到屏幕的最上方那一行的第一个字符 | 
| L或Ctrl+l | 光标移动到屏幕的最上方那一行的第一个字符 | 
| Ctrl+f或Page Down | 屏幕向下移动一页 | 
| Ctrl+b或Page Up | 屏幕向上移动一页 | 
| Ctrl+d | 屏幕向下移动半页 | 
| Ctrl+u | 屏幕向上移动半页 | 
| 命令 | 修改 | 
|---|---|
| y0 | yank,复制当前行光标位置到行首的内容 | 
| y$ | yank,复制当前行光标位置到行尾的内容 | 
| y1G | yank,复制当前行到第一行的内容 | 
| yG | yank,复制当前行到最后一行的内容 | 
| yy | yank,复制当前行 | 
| 10yy | yank,复制当前行往下的10行内容 | 
| yw | 复制一个单词 | 
| p | 粘贴到光标下一行 | 
| P或Shift+p | 粘贴到光标上一行 | 
| 4p | 粘贴4次 | 
| J | 将当前行与下一行合成同一行,删除回车 | 
| r* | 替换当前光标所选的字符,例如将当前光标所指替换为s: rs | 
| R或Shift+r | REPLACE,替换模式,按下 R后,再输入字符替换当前光标所选的字符并将光标向后移动 | 
| dd | delete,删除当前行 | 
| dw | 删除一个单词但不进入插入模式 | 
| cw | 删除一个单词并进入插入模式 | 
| x | 删除当前光标所指的字符 | 
| ci+{或ci+}或ci+[或ci+]或ci+(或ci+) | change in,清除当前光标所在括号内的内容并切换到插入模式 | 
| . | 英语句号,重复上一次修改操作,例如删除、替换、插入 | 
| u | undo,撤销上一步操作 | 
| Ctrl+r | 重做上一步撤销动作,回退撤销 | 
| Ctrl+v | visual block,视觉模式,选择单个字符,通过hjkl移动光标来选择字符,按 d删除选中内容并回到命令模式 | 
| Shift+v | visual block,视觉模式,选择整行,通过hjkl移动光标来选择字符,按 d删除选中内容并回到命令模式 | 
插入模式(Insert Mode)
在命令模式按以下命令键进入插入模式(插前附后),有的远程连接工具会在左下角显示INSERT,也就是刚进入文件的模式到可以输入的模式

| 命令 | 输入字符时插入的位置 | 
|---|---|
| i | 光标左边, esc退出 | 
| a | append,光标后, esc退出 | 
| I或Shift+i | 行首, esc退出 | 
| A或Shift+a | 行尾, esc退出 | 
| entre | 换行 | 
| Insert | 切换插入/替换模式 | 
| o | open a new line,新建下一行 | 
| O或Shift | open a new line,新建上一行 | 
| BackSpace | 删除光标前一个字符 | 
| Delete | 删除光标后一个字符 | 
| esc | 退出插入模式到命令模式 | 
命令行模式(Command-Line Mode)
再按下esc退出插入模式到命令模式,在命令模式输入:或/进入命令行模式

| 命令 | 解释 | 
|---|---|
| :set nu | 设置行号(未配置 set relativenum) | 
| :set nonu | 取消行号(未配置 set relativenum) | 
| :q | 仅退出,文件没有编辑即可仅退出,quit | 
| :q! | 不保存退出 | 
| :w | write,保存但不退出 | 
| n | 移动到下一个匹配项 | 
| :r 文件名 | 将另一文件内容添加到当前光标后面 | 
| :w 文件名 | 另存为 | 
| ZZ或Shift+z Shift+z | write&quit,保存退出 | 
| /* | 向前搜索匹配并移动光标到对应位置,例如查找当前光标位置前的hello: /hello | 
| ?* | 向后搜索匹配并移动光标到对应位置,例如查找当前光标位置后的hello: ?hello | 
| n | 移动到下一个匹配项 | 
| N或Shift+n | 移动到上一个匹配项 | 
| :%s/old/new/g | 全局替换,例如全局替换hello为hello world: :%s/hello/hello world/g | 
| :%s/old/new/g | 全局替换,替换前提示每个是否确认替换(),例如全局替换hello为hello world: :%s/hello/hello world/gc | 
| esc或Enter或ctrl+c | 退出命令行模式 | 
- y:将当前匹配项替换为新的内容并继续执行下一个匹配项的替换
- n:跳过当前匹配项,不进行替换,并继续执行下一个匹配项的替换
- a:替换所有剩余的匹配项,不再提示每个匹配项
- q:立即退出替换操作,不进行任何替换
- l:将当前匹配项替换为新的内容并退出替换操作,不进行下一个匹配项的替换
- ^E:向上滚动一行,显示上面的内容
- ^Y:向下滚动一行,显示下面的内容