Vim 的模式
Vim 相比其他编辑器最特别的地方应该是它的模式。进入 Vim 后,在缺省状态下,你键入的字符并不会插入到所编辑的文件中。下面来介绍以下 Vim 的四种模式:
-
正常模式(normal mode,也被称为普通模式):缺省状态下的编辑模式,一般用到的命令都是在这个模式下的。另外,在任何其他模式中,都可以通过
<ESC>
键位返回到正常模式。 -
插入模式(insert mode):这个模式主要用来输入文本使用。在正常模式下按下 i(insert) 或 a(append) 之后,即可进入插入模式。
-
可视模式(visual mode):这个模式主要用来选定文本块。在正常模式下,按下 v 或者 V 之后进行可视化模式,前者是进入按字符方式选定的,后者是进入按行的方式选定的。
-
命令行模式(command-line mode):用于执行一些较复杂的命令。在正常模式下键入冒号(:)即可进入命令行模式,除了使用
<ESC>
键回到正常模式之外,还可以将命令行的内容(包括冒号)都删除之后也可以回到正常模式。命令行模式中输入命令之后,记得再按回车键(Enter)才能执行输入的命令。另外,使用斜杠(/)和问号(?)开始搜索也算是命令行模式。
Vim 还会有个选择模式,但是这个选择模式并不是 Vim 的主要用法,一般提到的话都是提上述几个模式。在这些模式中最重要的是正常模式,我个人相当于把正常模式当成中间过渡的模式。
Vim 的基本使用
bash 下的操作
vim <FILENAME> # 使用 vim 打开个文件
vim -o <FILENAME1> <FILENAME2> # 水平分割(默认)
vim -O <FILENAME1> <FILENAME2> # 垂直分割
vim -On <FILENAME1> <FILENAME2> # n 表示分几个屏,可不填,不填时按照需要打开的文件个数来
正常模式
###### 进入其他模式 ######
i # 光标前面插入并进入插入模式
a # 光标后面插入并进入插入模式
I # 行首插入并进入插入模式
A # 行末插入并进入插入模式
o # 在光标的下一行刚开始插入并进入插入模式
O # 在光标的上一行插入并进入插入模式
: # 进入命令行模式
/ # 进入命令行模式开始搜索,从光标处开始向下搜索。使用 n 是向下查找搜索内容,N 是反方向
? # 进入命令行模式开始搜索,从光标处向上搜索。使用 n 是向上查找搜索内容,N 是反方向
# 在使用 / 或者 ? 搜索之前,使用 set ic(:set ic) 表示忽略大小写;
# set noic(:set noic) 表示不忽略大小写;
# set hls(:set hls) 那么在搜索的时候会高亮,set nohlsearch
# set is(:set is) 那么表示会自动跳转,set noincsearch 表示取消
# 假如就想一次搜索的时候忽略大小,那么使用\c,比如使用 /ignore\c
#(set xxx 表示设置 xxx 选项,上述的选项分别对应的是 ic(ignorecase)、is(incsearch)、hls(hlsearch),你可以输入缩写也可以全输进去,在前面加上 no 就表示关闭这个选项)
v # 进入 visual 模式,按字符来选择
V # 进入 visual 模式,按行来选择
###### 光标移动 ######
hjkl # 左下上右
w(word) # 移到下一个 word 之前,可在前面加数字
2w # 移过两个 word,并在第三个 word 之前
e # 移动到当前 word 的最后,可在前面加数字
3e # 移到第三个词的最后
$ # 移动到当前 line 的最后,可在前面加数字
2$ # 当前行的下一行的行末
0 # 移动到当前 line 的开始
[line number] G # 跳转到文件底部(:$也可以);假如有加 line number 的话,那么跳转到相应行数
gg # 文件顶部
% # 停留在 ([{}]) 处, 那么会跳转到另一个匹配的括号处;不停留的在括号处的话,那么会跳转到离光标最近的那个括号相匹配的括号处
CTRL-O # 跳转到更旧的光标所处(可结合搜索)
CTRL-I # 跳转到更新一点的光标所在处(可结合搜索)
###### 文本操作 ######
# 正常模式下改变文本内容的命令,通常由 opeartor、number 和 motion 组成。
# operator [number] motion
# operator 是要执行的操作命令
# number 是可选的,用于表示重复的 motion 次数;
# motion 是 opeartor 操作的内容
# 常见的 opeartor
d(delete) # 单个 d 无作用(在 normal mode 中),但是在 visual mode 中有用
c(change) # 单个 c 无作用(在 normal mode 中),但是在 visual mode 中有用,删除所选并进入 insert mode
y(yank) # 单个 y 无作用(在 normal mode 中),但是在 visual mode 中有用
# 常见的 motion
w(word) # 移到下一个 word 之前
e # 移动到当前 word 的最后
$ # 移动到当前 line 的最后
0 # 移动到当前 line 的开始
# number 和 motion 组合示例
2w # 移过两个 word,并在第三个 word 之前
3e # 移到第三个词的最后
2$ # 当前行的下一行的行末
# 常用示例
dw # 删除一个单词
de # 删除从光标处到 word 末的内容
d$ # 删除从光标处到行末的内容
d2w # 删除两个单词
dd # 删除一行
2dd # 删除两行
ce # 效果其实就是删除从光标处 word 最后字符的内容并进入 insert mode
cc # 删除整行,并进入 insert mode
yw # 复制一个 word
yy # 复制当前行的数据
2yy # 复制两行数据
#######################################
D # 删除光标到行末的内容
C # 删除光标到行末的内容,并进入 inser mode
Y # 复制光标所在的一整行内容
s # 删除光标所在字符,并进入 insert mode
S # 删除光标所在行,并进入 insert mode
p # 粘贴文本,比如 dd 删除的内容或者 y 复制的内容。dd 的内容如果是一行的话,那么会被粘贴到光标的下一行
P # 内容是一行的话,那么会被粘贴到光标的上一行
x # 删除光标处的文字
X # 删除光标前的文字(backspace)
r # 移到要替换的字母, r 之后后面紧跟要替换的字母,只能替换一个
R # 进入替换模式,用之后输入的内容依次替换掉光标之后的内容,相当于进入了 replace mode, esc 退出,replace mode 类似于 insert mode。
###### 其他操作 ######
u # 撤销前一个的操作
U # 将整行的改变撤销
CTRL-R # 撤销撤销所做的事(U 所做的事情不相当于撤销)
.(小数点) # 重复前一个操作
CTRL-G/g # 显示光标在文件的第几行和文件的信息
命令行模式
:q! # 不做修改的退出
:wq # 保存退出
:w <Filename> # 将当前的文件内容写入到 Filename 中。在 visual mode 下输入 :,并在出现的内容后面输出 w Filename 那么会将选择的内容保存到 Filename 的文件中。
:! <命令> # 执行 Linux 下的命令
:n # 跳转到第 n 行
:$ # 跳转到最后一行
:s/old/new # 替换到第一个 old
:s/old/new/g # 将光标所在行的 old 全都替换为 new,g 表示整行都进行替换
:%s/old/new/g # 整个文件进行替换
:%s/old/new/gc # 整个文件进行替换并提示
:#, #s/old/new/g # 表示行号,那么意思是 # 和 # 之间
:r <FILENAME> # 将一个文件的内容插入到打开的文件所在光标的下面
:r !ls # 把 ls 命令的执行结果插入到打开的文件中
:set number # 设置行号
:set nocp # 设置不兼容模式
:set ic # 搜索时,忽略大小写,需要在搜索之前设置
:set noic # 搜索时,不忽略大小写;
:set hls # 搜索时,匹配的内容会高亮
:set nohlsearch # 取消高亮效果
:set is # 搜索时,会自动跳转到第一个匹配的内容
:set noincsearch # 表示取消跳转效果
# 假如就想一次搜索的时候忽略大小,那么使用\c,比如使用 /ignore\c
#(set xxx 表示设置 xxx 选项,上述的选项分别对应的是 ic(ignorecase)、is(incsearch)、hls(hlsearch),你可以输入缩写也可以全输进去,在前面加上 no 就表示关闭这个选项)
:e # 命令行中直接打开编辑一个文件
:s [FILENAME] # 水平切分窗口,有跟文件名的话,这个文件的内容就在新的窗口
:vs [FILENAME] # 垂直切分窗口,有跟文件名的话,这个文件的内容就在新的窗口
:sp
:split
:vsplit
# Ctrl + w + 方向键 -- 切换到前/下/上/后一个窗格
# Ctrl + w + h/j/k/l -- 同上
# Ctrl + ww -- 依次向后切换到下一个窗格中
# Crtl + w + + 扩大窗口
# Ctrl + w + - 缩小窗口
# :q 是退出光标所在的分屏
:help # 查看帮助
:help w # 查看 w 的帮助
:help c_CTRL-D
:help insert-index
:help user-manual # 查看用户手册
CTRL-D # 会显示全部的提示内容
<Tab> # 自动补齐
可视化模式
hjkl # 选中内容移动
y # 复制选中的内容
d # 删除选中的内容
c # 删除选中的内容,并进入 insert mode
插入模式
<ESC> # 返回正常模式
其他
vim 相比 vi 引入了很多特性,但是他们的大部分都是被禁止的。你可以编辑 vimrc (Unix:.vimrc)来打开某些功能,可使用 $VIMRUNTIME/vimrc_example.vim 中的内容。