所有的Linux发行版系统上都会默认内置vi编辑器,而不一定带有其他文本编辑器,非常通用;其次,很多软件的编辑接口都会默认调用vi;再者就是对很多热爱编程的大佬来说,可大大提高编程效率,很多黑客也是使用这个编辑器来减少自己摸鼠标时间的。
VI命令的工作模式
更详细的文档请参考:c.biancheng.net/view/519.ht… 或 www.runoob.com/linux/linux… 简化图:
vi编辑器有三种工作模式:命令模式、插入模式、末行模式。
- 命令模式: 此时从键盘上输入的任何字符都被当做编辑命令来解释,同时该模式是进入 vi 编辑器后的默认模式。任何时候,不管用户处于何种模式,按下Esc键即可进入命令模式。
- 插入模式(亦称编辑模式): 在命令模式下输入插入命令i、附加命令a、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。在该模式下,用户输入的任何字符都被 vi 当做文件内容保存起来,并将其显示在屏幕上。
- 末行模式(亦称ex 转义模式): 在命令模式下,用户按 : 键即可进入末行模式下,此时 vi 会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个:作为末行模式的说明符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容写到文件中等)。 vi 编辑器的 3 种模式的转换如下图所示:
VI命令的基本操作
一下文本内容的“#”为注释内容,说明功能
进入文件
vi test.py # 打开名为test.py的文件,若不存在则创建并打开该文件
复制代码
如果只输入 vi,而不带文件名,也可以进入 vi。这时编辑的文件是没有文件名的,所以在退出 vi 时,需要在退出命令后输入文件名,这样才能保证该文件被保存在磁盘中。
修改文件
插入文本(i和I)
i:将文本插入到光标所在位置前 I:I 命令将文本插入当前行的行首
追加文本(a和A)
a:将新文本追加到光标当前所在位置之后 A:命令将新文本追加到所在行的行尾
空行插入命令(o和O)
o:命令将在光标所在行的下面插入一个空行,并将光标置于该行的行首 O:命令在光标所在行的上面插入一个空行,并将光标置于该行的行首。
移动光标
字符移动
移动命令 | 意义 |
---|---|
h | 左移一个光标 |
j | 下移一个光标 |
k | 上移一个光标 |
l | 右移一个光标 |
按字移动
- w 和 W 命令将光标右移至下一个字的字首。 区别: -w 所指的字是指英文单词、标点符号和非字母字符; -W 所指的字是指两个空格之间的任何内容;
- 如果光标起始位置处于字内,则 e 和 E 命令将把光标移到本字字尾; 如果光标起始位置处于字尾,则 e 和 E 命令将把光标移动到下一个字的字尾。 区别: -e 所指的字是指英文单词、标点符号和非字母字符; -E 所指的字是指两个空格之间的任何内容;
- 如果光标处于所在字内,则 b 和 B 命令将把光标移至本字字首;如果光标处于所在字字首,则 b 和 B 命令将把光标移到上一个字的字首。 区别: -b 命令所指的字是指英文单词、标点符号和非字母字符; -B 命令所指的字是指两个空格之间的任何内容。
按行移动
- H:将光标移至当前屏幕的第 1 行,而不是整个文件的第 1 行。若在 H 命令之前加 上数字 n,则将光标移至第 n 行的行首
- M:将光标移至屏幕显示文件的中间行的行首。即如果当前屏幕已经充满,则移动到整个屏幕的中间行;否则,移动到显示文本的那些行的中间行。
- L:将光标移至屏幕显示文件的最底行的行首。即如果文件内容需要超过一个屏幕显示时,该命令将光标移至屏幕上最底行的行首;否则该命令将光标移至文件最后一行的行首。
- G:在全文的范围内移动光标,此时的光标移动范围不再受屏幕的限制。例如,在上例中,在命令模式下输入命令 5G 之后光标将移到第 5 行的行首。
按段落移动光标
一个段落被定义为是以一个空白行开始和结束的片段。按段落移动光标的命令有以下两种:
- {:该命令将光标向前移至上一个段落的开头。
- }:该命令将光标向后移至下一个段落的开头。
文本移动
文本行移动
- >:将指定的正文行向右移动。
- >n:n表示光标所在位置后面的文本行数。也可以不写 n,此时默认为 1。 <:命令将指定的正文行向左移动。其使用方式与命令相同,但是方向相反。
- >>:该命令将光标所在行右移 8 个空格。如果在>>命令之前给出一个数字 n,例如 4,则表示光标当前行及其下面的 3 行(共4行)都右移 8 个空格。
- <<:命令将光标所在行左移 8 个空格。其使用与>>命令相同,但是移动方向相反。
文本跨行移动(m命令)
- imj:表示把第 i 行移至第 j 行的下方。下面实例演示了 m 命令的使用。例:6m2,就是将第6行的内容移动到第2行的下方
替换
字符替换
- r: 将当前光标所指的字符替换为提供的字符。可以在该命令之前加上数字 n,表示将从当前字符开始的 n 个字符替换为提供的字符。下面实例演示了 r 命令的使用。
- R:该命令会让 vi 进入 replace 模式。在此模式下,每个输入的字符都会替换当前光标下的字符,直到输入 <Esc> 结束该模式。
字符串替换
- [range]s/s1/s2/ [option]
- [range] 表示检索范围,省略时表示当前行; 1,10表示从第 1 行到 10 行; %表示整个文件,同1, 从当前行到文件尾。
- s 为替换命令。
- s1 要被替换的串,s2 为替换的串。
- option 表示选项: /g表示在全局文件中进行替换; /c表示在每次替换之前需要用户进行确认; 省略时仅对每行第一个匹配串进行替换。 例如:%s/<abc/cde 表示将以 abc 开头的单词替换为以 cde 开头。
辅助操作
字符串检索
- /String:从光标处开始向后寻找字符串 string。
- ?String:从光标处开始向前寻找字符串 string。
文本复制和粘贴
- v 命令:在命令模式下进行文本选择。在需要选择的文本的起始处按下 v 键进入块选择模式,然后移动光标到块尾处。这之间的部分被高亮显示,表示被选中.
- V 命令:在命令模式下按行进行文本选择。在需要选择的文本的第一行按下 V 键,然后移动光标到块的最后一行。这之间的所有行被高亮显示,表示被选中。
- yy :复制光标所在的整行。在 yy 前可加一个数字 n,表示复制当前行及其后 n-1 行的内容。
- Y 或 y$ :两命令功能一样,都是复制从光标所在处开始到行尾的内容。
- yw :复制一个单词。若光标处在某个词的中间,则从光标所在位置开始复制至词尾。同 yy 命令一样,可在 yw 之前加一个数字 n,表示复制 n 个指定的单词。
- y) :复制到下一句幵始的所有字符。
- y} :复制到下一段开始的所有字符。
- y<CR> (<CR> 表示回车):复制包括当前行在内的两行内容。
- p 命令:粘贴命令,粘贴当前缓冲区中的内容
文本删除
删除单个字符
- x 命令:删除光标处的字符。若在 x 之前加上一个数字 n,则删除从光标所在位置开始向右的 n 个字符
- X 命令:删除光标前面的字符。若在 X 之前加上一个数字 n,则删除从光标前面那个字符开始向左的 n 个字符。
删除多个字符
- dd 命令:该命令删除光标所在的整行。在 dd 前可加上一个数字 n,表示删除当前行及其后 n-1 行的内容。
- D 命令或 d$ 命令:两个命令功能一样,都是删除从光标所在处开始到行尾的内容。
- d0 命令:该命令删除从光标前一个字符开始到行首的内容。
- dw 命令:该命令删除一个单词。若光标处在某个词的中间,则从光标所在位置开始删至词尾。同 dd 命令一样,可在 dw 之前加一个数字n,表示删除 n 个指定的单词。
- d( 命令:该命令删除到上一句开始的所有字符。
- d) 命令:该命令删除到下一句开始的所有字符。
- d} 命令:该命令删除到上一段开始的所有字符。
- d{ 命令:该命令删除到下一段开始的所有字符。
- d<CR> 命令:该命令(<CR>表示回车)删除包括当前行在内的两行字符。
操作撤销
- u :该命令撤销上一次所做的操作。多次使用 u 命令会一步一步依次撤销之前做过的操作(在一次切换到文本输入模式中输入的所有文本算一次操作)。
- U :该命令会一次性撤销自上次移动到当前行以来做过的所有操作,再使用一次 U 命令则撤销之前的 U 命令所做的操作,恢复被撤销的内容。
退出文件
- :wq vi将先保存文件,然后退出 vi 返回到 shell。如果当前文件尚未取名,则需要现指定一个文件名。
- :x 在末行模式下,若当前编辑文件曾被修改过,则 vi 会保存该文件。否则 vi 直接退出,不保存该文件。