1. vi 的三种工作模式
命令模式
打开文件首先进入命令模式, 是使用 vi 的入口;
通过命令对文件进行常规的编辑操作, 例如: 定位, 翻页, 复制, 粘贴, 删除等;
末行模式
执行保存, 退出等操作, 是 vi 的出口;
:wq: 表示 write&quit;
编辑模式
正常的编辑文字
2. vi 操作文件
vi 文件名: 打开或新建文件;
vi 文件名 + 行数
: 打开文件并且定位行, 如果不指定行号, 会直接定位到文件末尾;
2.1 重复次数
在命令模式下, 先输入一个数字, 再跟上一个命令, 可以让该命令重复执行指定次数;
2.2 移动和选择
方向移动
h: 左移
j: 下移
k: 上移
l: 右移
{: 按段移动, 上移; 以空行来区分段落;
}: 按段移动, 下移;
w: 向后移动一个单词 (word);
b: 向前移动一个单词
0: 行首
^: 行首, 第一个不是空白字符的位置;
$: 行尾
行数移动
gg: 文件顶部, 15gg 表示跳转到第 15 行;
G: 文件末尾, 15G 表示跳转到第 15 行;
: 数字: 跳转到数字对应行数;
屏幕移动
ctrl + d: 向下翻半屏;
ctrl + u: 向上翻半屏;
ctrl + f: 向下翻一屏;(forward)
ctrl + b: 向上翻一屏;(back)
H: 屏幕顶部;(Head)
M: 屏幕中间;(Middle)
L: 屏幕底部;(Low)
括号切换
在程序世界中, () [] {} 使用频率很高, 而且都是成对出现的;
%: 括号匹配及切换;
标记
在开发时, 某一块代码可能需要稍后处理, 例如编辑, 查看;
此时, 先使用 m 添加一个标记, 这样可以在需要时, 快速地跳转回来或者执行其他编辑操作;
标记名称可以是 a~z 或者 A~Z 之间的任意一个字母;
添加了标记的行如果被删除, 标记同时被删除;
如果在其他行添加了相同名称的标记, 之前添加的标记也会被替换掉;
mx: 添加标记 x, x 是 a~z 或者 A~Z 之间的任意一个字母;(mark)
x: 直接定位到标记 x 所在的位置
2.3 编辑操作
选中文本 (可视模式)
学习复制命令前, 应该先学会怎么样选中要复制的代码;
v: 按字符移动选中文本;
V: 按行移动选中文本, 可以配合 d, y,>>,<< 实现对文本块的删除, 复制, 左移, 右移;
ctrl + v: 垂直方向选中文本;
撤销和恢复撤销
u: 撤销上次命令;(undo)
ctrl + r: 恢复撤销的命令;(redo)
删除文本 (类似于剪切操作)
x: 删除光标后一个字符, 相当于 Del;(cut)
X: 删除光标前一个字符, 相当于 Backspace;
d(移动命令): 删除移动命令对应的内容; 例如
d0: 删除光标前本行所有内容, 不包含光标所在字符;
dw: 删除光标开始位置的字符, 包含光标所在字符;
dd: 删除光标所在行;
8dd: 表示从当前光标所在的行开始剪切 8 行;
D: 删除光标后本行所有内容, 包含光标所在字符;
复制和粘贴
复制命令会将选中的文字保存在缓冲区;
删除命令会将删除的文字删除的文字保存在缓冲区;
y(移动命令): 复制; (copy)
yy: 复制一行, 可以 8yy 复制 8 行;
p: 粘贴 (paste)
缩排和重复执行
>>: 向右增加缩进;(一次在选中代码前增加 4 个空格)
<<: 向左减少缩进;
. : 重复上次命令;
2.4 替换
r: 替换当前字符串 (命令模式)
R: 替换当前行光标后的字符 (替换模式)
R 命令可以进入替换模式, 替换完成后, ESC 可以回到命令模式;
替换命令的作用就是不用进入编辑模式, 对文件进行轻量级的修改;
2.5 查找
/str: 查找 str;
查找到指定内容之后, 使用 Next 查找下一个出现的位置:
n: 查找下一个;
N: 查找上一个;
如果不想看到高亮显示, 可以随便查找一个文件中不存在的内容即可;
单词快速匹配
*: 向后查找当前光标所在单词;
#: 向前查找当前光标所在单词;
2.6 查找并替换
在 vi 中查找和替换命令, 需要在末行模式下执行;
格式: :%s///g;
全局替换:
:%s/abc/123/g: 将所有的 abc 替换成 123;
可视区域替换
先选中要替换文字的范围;
:<,>s / 旧文本 / 新文本 / g
确认替换
如果把末尾 g 改成 gc, 在替换的时候, 会有提示!
:%s / 旧文本 / 新文本 / gc
提示语:
y: 替换 (yes)
n: 不替换 (no)
a: 替换所有 (all)
q: 退出替换 (quit)
l: 替换最后一个 (last), 并把光标移动到行首;
^E: 向下滚屏;
^Y: 向上滚屏;
2.7 插入命令
进入编辑模式的命令:
i: 在当前字符前插入文本;(insert)
I: 在行首插入文本;(insert)
a: 在当前字符后添加文本;(append)
A: 在行末添加文本;
o: 在当前行后面插入一空行;
O: 在当前行前面插入一空行;
# 示例: 利用可视块模式给多行代码增加注释
1. 在命令模式下, 移动到要添加注释的第一行代码, 按 "^" 来到行首;
2. 按 ctrl + v 进入可视块模式;
3. 使用 j 向下连续选中要添加的代码行;
4. 输入 I 进入编辑模式, 并在行首插入, 注意, 一定使用大写 I;
5. 输入 # 也就是注释符号;
6. 按下 ESC 返回到命令模式, 返回之后, vi 会在之前选中的每一行代码前插入 #;
2.8 分屏命令
属于 vi 的高级命令, 可以同时编辑和查看多个文件;
末行命令主要是针对文件进行的操作:
保存, 退出, 保存 & 退出, 搜索 & 替换, 另存, 新建, 浏览文件;
:e .: 会打开内置的文件浏览器, 浏览当前目录下的文件;
:n 文件名: 新建文件;(new)
:w 文件名: 另存为, 但是仍然编辑当前文件, 并不会切换文件;(write)
在实际开发中, 可以使用 w 命令阶段性的备份代码;
分屏命令
使用分屏命令, 可以同时编辑和查看多个文件;
:sp [文件名]: 横向增加分屏;(split)
:vsp [文件名]: 纵向增加分屏;(vertical split)
切换分屏窗口
分屏窗口都是基于 ctrl + W 这个快捷键的,(w = window)
ctrl + w + w: 切换到下一个窗口;
ctrl + w + r: 互换窗口;(reverse)
ctrl + w + c: 关闭当前窗口, 但是不能关闭最后一个窗口;(close)
ctrl + w + q: 退出当前窗口, 如果是最后一个窗口, 则关闭 vi;(quit)
ctrl + w + o: 关闭其他窗口;(other)
参考资料:
VI 操作
来源: http://www.bubuko.com/infodetail-2521902.html