1.vi/vim快捷键位图
详细可以参考:https://www.runoob.com/w3cnote/all-vim-cheatsheat.html
2.vi/vim的三种模式
基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。 这三种模式的作用分别是:
命令模式:
用户刚刚启动 vi/vim,便进入了命令模式。
此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会在界面上输入一个字符i,i被当作了一个命令。
以下是常用的几个命令:
- i 切换到输入模式,以输入字符。
- x 删除当前光标所在处的字符。
- : 切换到底线命令模式,以在最底一行输入命令。
若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。
命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。
输入模式:
在命令模式下按下i,a,o等就进入了输入模式。
在输入模式中,可以使用以下按键:
- 字符按键以及Shift组合,输入字符
- ENTER,回车键,换行
- BACK SPACE,退格键,删除光标前一个字符
- DEL,删除键,删除光标后一个字符
- 方向键,在文本中移动光标
- HOME/END,移动光标到行首/行尾
- Page Up/Page Down,上/下翻页
- Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
- ESC,退出输入模式,切换到命令模式
底线命令模式:
在命令模式下按下:(英文冒号)就进入了底线命令模式。
底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。
在底线命令模式中,基本的命令有(已经省略了冒号):
按ESC键可随时退出底线命令模式。
3.vi/vim打开和新建文件
(1)打开文件:vi filename
(2)打开文件并到指定行:vi filename +[n],其中n为指定行数,如果不输入n,会到文件末尾行。
4.vi/vim的异常处理
如果vi/vim退出异常,在磁盘上可能会保存交换文件,此时输入vi filename会有E325提示。
此时,可用ls -la命令查看到一个“.filename.swp”文件
可以输入:recover恢复文件
再用rm .filename.swp命令删除这个文件,再次使用vi filename就不会报错了。如果不需要恢复直接执行rm .filename.swp命令删除这个文件即可。
5.vi/vim命令合集
(1)命令模式切换到编辑模式:
①.插入模式
输入i,I,o,O,a,A等任何一个字母都可以进入vi插入模式。
- i 在当前位置生前插入
- I 在当前行首插入
- a 在当前位置后插入
- A 在当前行尾插入
- o 在当前行之后插入一行
- O 在当前行之前插入一行
②.取代模式
输入r和R会进入取代模式。
- r 只会取代光标所在的那一个字符一次
- R 会一直取代光标所在的文字,直到按下 ESC 为止
(2)命令模式切换到指令模式:
①.写入
- :w 将编辑的数据写入文件中
- :w! 若文件属性为只读时,强制写入该文件。(能不能写入与用户对文件的权限有关)
②.离开
- :q 离开vi
- :q! 在vi模式下修改过文件但在离开vi时又不想保存可用
- :wq 或 :x 保存写入或修改的数据后离开vi
- :wq! 强制保存写入或修改的数据后离开
- ZZ 注意ZZ前面不需要输入“:”,若文件没有改动,则不保存离开,若档案已经被改动过,则保存后离开
③.另存为
- :w [filename] 将文件的数据保存为 filename 这个文件
- :n1,n2 w [filename] 将 n1 行到 n2 行的数据另存为成 filename 这个文件
④.读入其他文件的数据
- :r [filename] 在编辑的数据中,读入另一个文件的数据。亦即将 filename 这个档案内容加到游标所在行后面
⑤.暂时离开vi模式
- :! command 暂时离开 vi 到指令行模式下执行 command 的显示结果
(3)命令模式
①.移动光标
上下左右移动 行内移动 行数移动 屏幕移动 程序的段落移动 程序的段落切换
- [n]h 或 键盘左箭头([n]←)光标向左移动n个字符
- [n]j 或 键盘下箭头([n]↓)光标向下移动n行
- [n]k 或 键盘上箭头([n]↑)光标向上移动n行
- [n]l 或 键盘右箭头([n]→)光标向右移动n个字符
- [n]w 向后移动n个单词
- [n]b 向前移动n个单词
- [n]+空格符向右移动n个字符
- 0或者Home键 到行首
- ^ 到行首第一个不是空白字符的位置
- $ 到行尾
- n$ 到下面n行行尾
- gg 到文件开头
- G 到文件行尾
- [n]gg 或 [n]G 或 :n 到第n行
- [n]+enter键 向下移动n行
- + 到非空格符的下一行
- - 到非空格符的上一行
- Control键+f 屏幕向下移动一页
- Control键+b 屏幕向上移动一页
- Control键+d 屏幕向下移动半页
- Control键+u 屏幕向上移动半页
- Control键+e 向下移动一行
- Control键+y 向上移动一行
- H 到屏幕顶部第一个字符
- M 到屏幕中间第一个字符
- L 到屏幕底部第一个字符
- { 上一段
- } 下一段
- % 括号匹配及切换
②.搜索
- /str str表示查找的内容,查找到指定内容之后可以使用n:查找下一个,N:查找上一个
- ?str 向光标之上寻找一个字符串名称为str的字符串
- * 向后查找当前光标所在单词
- # 向前查找当前光标所在单词
③.替换
- r 替换当前字符
- R 一直替换当前行光标后字符
- :%s/旧文本/新文本/g 全局替换
- :s/旧文本、新文本/g 可视区域替换,需要先选择要替换的范围
- :%s/旧文本/新文本/gc 确认替换,在替换时会有提示
- :%s/word1/word2/g word1替换成word2,全局替换,替换所有匹配
- :n1,n2s/word1/word2/g n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2
- :1,$s/word1/word2/g 或 :%s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2
- s/word1/word2/ 用word2替换word1,替换当前行的第一个匹配
- %s/old/new/ 用word2替换word1,替换所有行的第一个匹配
- :1,$s/word1/word2/gc 或 :%s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 ,且在取代前显示提示字符给用户确认 (confirm) 是否需要取代。y为确认替换,n为不替换,a为替换所有,q为退出替换
④.删除
- x 或 dl 删除光标所在字符,或者在一行当中选中的文字
- nx 删除当前光标向后n个字符
- X 或 dh 为向前删除一个字符
- dd 删除光标所在一整行
- dj 删除上一行
- dk 删除下一行
- dw 从光标位置删除到单词末尾
- d} 从光标位置删除到段落结尾
- nd 删除当前行开始的n行
- ndd 删除光标所在向下n行
- d1G 删除光标所在到第一行的所有数据
- dG 删除光标所在到最后一行的所有数据
- d$ 或 D 删除光标所在处到该行的最后一个字符
- d0 删除光标所在处到该行第一个字符
- kdgg 删除当前行之前的所有行(不包括当前行)
- jdG 删除当前行之后的所有行(不包括当前行)
- :n1,n2d 删除n1到n2行
- :n1,$d 删除n1行及以后所有行
- J 删除两行之间的空格
⑤.复制
- yy 复制游标所在那一行的所有数据
- nyy n为数字,复制光标所在的向下 n 行
- y1G 复制游标所在行到第一行的所有数据
- yG 复制游标所在行到最后一行的所有数据
- y0 复制光标所在的那个字符到该行行首的所有数据
- y$ 复制光标所在的那个字符到该行行尾的所有数据
⑥.粘贴
- p 将已复制的数据贴在光标下一行
- P 将已复制的数据贴在游标上一行!
⑦.标记与定位
- m[flag] 添加标记,flag可以是a-z或者A-Z之间的任意一个字母
- ‘[flag] 直接定位到flag所在位置
⑧.剪切
- 在vi中,删除操作其实就相当于剪切操作
- 正常模式下按v(逐字)或V(逐行)进入可视模式,然后用h、j、k、l等命令移动即可选择某些行或字符,再按d即可剪切
- ndd 剪切当前行之后的n行。利用p命令可以对剪切的内容进行粘贴
- :n1,n2d 将n1到n2行剪切。利用p命令可将剪切后的内容进行粘贴。
- :n1,n2 m n3 将第n1到n2行移动到第n3行之后。
⑨.撤销和重做
- u 撤销上次命令
- U 撤销对整行的操作
- Control键+r 重做,即恢复撤销的命令
⑩.重复执行和缩进
- . 重复执行前一个操作
- >> 向右增加缩进
- << 向左增加缩进
(4)可视模式
可视模式可以和移动光标命令连用,如ggVG可以选中所有内容。
- v 可视模式,从光标位置开始按照正常模式选择文本
- V 可视行模式,选中光标经过的所有行
- Control键+v 可视块模式,垂直方向选中文本