Vim的几种模式
普通模式, 插入模式, 替换模式, 可视选择模式, 命令模式.
普通模式 --> 插入模式
i/I: 在光标前面/行首插入
a/A: 在光标后面/行尾插入
o/O: 在下/上一行行首插入
s 删除光标所在字符并开始插入(具体用法看x)
c 开始删除, 之后进入插入模式(具体用法看d)
对于GVim, 插入模式和在windows下一样, 各种快捷键都能用. 另外, 在普通模式下, ctrl+s依然是保存
普通模式 --> 替换模式
r: 替换光标所在的字符
数字r: 将光标所在向后n个字符都替换掉
R: 从光标所在字符开始替换, 按esc回到普通模式
普通模式 --> 命令模式
按冒号键.
普通模式 --> 命令模式
按 v 键.
插入模式, 命令模式 可视选择模式 --> 普通模式
按esc
普通模式
进入gvim后的默认模式, 在这种模式下, 无法输入, 只能移动光标, 或对文本进行操作.
移动
h j k l: 左下上右移动
数字 h j k l: 左下上右移动n下
w/e: 移动到下一个单词开头/结尾
b/B(ge): 移动到上一个单词开头/结尾
f/t a: 在当前行, 移动到下一个出现a的位置/前
F/T a: 在当前行, 移动到上一个出现a的位置/前
数字f/t a: 在当前行向后移动到第n次出现a的位置/前
数字F/T a: 在当前行向前移动到第n次出现a的位置/前
0/$: 定位到行首/行尾
^/g_: 定位到非空格的行首/行尾
%: 在两个匹配的符号((, ", {)等等中切换(光标需先移动到其中一个符号, 如果不在, 则会向后找到最近的一个)
数字%: 按照百分比定位文档 的位置
G: 定位到最后一行行首
行号G: 定位到对应行号行首
gg: 移动到第一行行首
H: 定位到当前屏幕的最上边
M: 定位到当前屏幕的中间
L: 定位到当前屏幕的最下边
ctrl+u/d: 向上/下滚动半屏
ctrl+f/b: 向上/下滚动整屏
zz: 把当前行置为屏幕正中间
J: 将下一行移动到这一行末尾(合并当前行和下一行)
关于数字键: 数字+命令表示执行多次操作, 数字一般放在命令之前.
>>/<<: 当前行增大/减小缩进
==: 当前行自动进行缩进
``: 反单引号, 在两个跳转点之间切换, 如果你原先处在33行, 跳到了55行, 使用这个命令可以回到33行, 多次使用就是来回切换,
注: j, k导致的跳转不可, 并且需要是不在同一行内的位置间的切换
ctrl+o/i: 跳转到上一次/下一个光标停留位置(不在同一行内, 且不是hjkl导致的光标移动)
查找/搜索
在普通模式下输入 / , 即可对文本进行查找.
/xxx: 在全文中查找xxx, 并高亮显示, 字符.*[]^%/?~$ 有特殊意义, 需要用转义
?xxx: 和/效果一样, 只是查找方向反向
N/n: 在高亮的选中处之间前后切换, 前面可以加数字, 表示第n次出现的位置
vim会记录已经查找过的内容, 再次查找时, 可通过上下键来切换
#/*: 移动到上一个/下一个与光标所在单词相同的单词
/<xxx>: 匹配完整的单词, 如果某单词中只是包含xxx, 不会被匹配上
模式搜索(正则表达式搜索):
^ 表示一行的开头, $ 表示一行的结尾, ^the就表示位于行首的the
. 表示任意字符, 如果想查找的就是. , 则需要转义
一个有用的命令: nohlsearch, 此命令可以取消当前的高亮, 简写 nohl
复制, 剪切, 删除, 粘贴
在vim中, 剪切和删除的效果是一样的, y复制, x剪切, p粘贴.
注: 几乎所有的移动, 复制, 粘贴命令前面都可以加数字, 表示重复的次数, 也几乎都可以加上移动键, 表示向某个方向复制/剪切 .
(下列命令中其实是没有中间的空格的, 这里只是为了方便阅读)
y: 开始复制
yy/Y: 复制当前行
行号yy: 从当前行开始, 复制多行
y 0/$: 从光标处复制到本行开头/末尾
y w/e: 复制一个单词, 或从光标处复制到本单词末尾
yt a: 从光标出开始复制, 直到遇见a, a不复制
yG: 从当前行开始复制直到最后一行
yyg: 从当前行开始复制直到第一行
x: 剪切/删除光标所在的字符, 依然停留在普通模式
X: 删除当前光标左边的字符
数字 x: 剪切/删除从光标开始往后的n个字符, 依然停留在普通模式
d: 开始剪切/删除(用法和y类似, 不多说了)
dd: 剪切整行
D: 剪切至行尾的内容(这点和y不一样)
p: 粘贴复制/剪切的内容到光标后面, 如果是整行的, 则粘贴到当前行的上面
P: 粘贴复制/剪切的内容到光标前面, 如果是整行的, 则粘贴到当前行的下面
数字p/P: 粘贴多次
ddp: 其实就是删除当前行再粘贴了, 但是你会发现, 当前行和下一行换位置了
xp: 其实就是删除当前光标所在字符再粘贴, 但是你会发现, 两个字符交换位置了
其他常用命令/快捷键
这里说的命令和命令模式中的命令不太一样, 其实就是一些按键, 只是在普通模式中, 它们有不同的用处.
.: 普通模式中按 . 可以重复上次的命令, 除了u命令, 这个只能重复最近的一次命令, 比如先搜索出全文中的xxx, 然后cwyyy, 表示修改成yyy, 然后回到普通模式,
n.n.n.一直按, 之后的xxx都会变成yyy, cwyyy这个命令就会一直重复
u: 撤销上次操作, U: 行撤销, 可以撤销所有在最近行上的编辑操作.
ctrl+r: 恢复上次操作(GVim中, ctrl+y也可以, 但它是windows中的快捷键)
ctrl+i: 有时候vim中的有些文字会花掉, 此快捷键可以刷新视图
gU/gu: 将选中的内容转化为大/小写
ctrl+p: 自动补全之前编辑过的单词, 词组
ZZ: 退出当前编辑的文件.
行号1, 行号2>>: 从行号1到行号2向右移动一个tab
行号1, 行号2>>: 从行号1到行号2向左移动一个tab
可视选择模式
在普通模式中按 v 键可进入可视化选择模式, 按 esc/v 退出, 同时选择的内容会被复制.
普通模式中按 V 键进入整行可视化选择, 再按 esc/V 退出, 同时选择的内容会被复制.
在可视化选择模式中, 移动键, 数字键, 剪切, 复制都是可以使用的.
ctrl+q: 块可视化选择, 其实应该是ctrl+v, 但是对于windows里的GVim, 这个是粘贴, 所以不能用.
gg, 然后ctrl+q(ctrl+v), 然后按G, 就可以选择文本的第一列
o: 在(块)可视化选择状态下, 使光标移动到选择区域的另一头
O: 在块可视化选择状态下, 使光标移动到这一行的另一头
命令模式
在普通模式下按 : 键进入命令模式, 光标会在编辑器底部显示, 输入命令回车即可.
常用命令
w: 保存不退出
wq/x: 保存退出
q/q!: 不保存退出/强制不保存退出, 在任何命令后加 ! 表示强制执行此命令.
e!: 放弃所有修改, 载入文件的初始状态, 慎用!
pwd: 显示当前目录
!shell指令: 执行shell(dos)指令
r!shell指令: 将shell(dos)指令的执行结果写到当前行的下面
行号1, 行号2d: 删除从行号1到行号2的内容, y也同样适用.
行号: 定位到对应行号.
在命令模式里按上下箭头可以切换之前输入的命令
编辑多个文件
e/edit 文件路径: 在当前标签页中打开文件, 路径中使用/或都可以,
可使用tab键自动补全文件名.也可以一次打开多个文件, 文件路径中间以空格隔开
previous/next: 切换到上一个/下一个打开的文件
wprevious/wnext: 保存当前文件, 然后切换到上一个/下一个打开的文件
bp/bn: 在当前标签页中切换上一个/下一个文件
vim -R filename, 以只读方式打开文件
分割窗口
split: 在当前窗口上方分割一个窗口, 新窗口中依然是当前文件
new: 分割出新的空窗口
split filepath: 在新窗口打开文件
new filename: 在新窗口中编辑文件
split, new命令都可以在前面加上数字, 表示新窗口的高度(行数)
ctrl+w w: 在两/多个窗口键切换
ctrl+w +/ctrl+w -: 当前窗口扩大/缩小一行, 前面可以加数字, 表示扩大/缩小多行
数字 ctrl+w _: 将窗口变为指定高度
q/cloase: 退出当前窗口
wall/wa: 全部保存, qall/qa, 全部关闭
only: 关闭其它所有窗口, 只保留当前窗口
ctrl-w h 到左边的窗口
ctrl-w j 到下面的窗口
ctrl-w k 到上面的窗口
ctrl-w l 到右边的窗口
ctrl-w t 到顶部窗口
ctrl-w b 到底部窗口
ctrl-w h, j, k, l, 左右上下移动窗口
标签页
一般来说tabe, tabedit, tabnew的作用是一样的, 下面都用tabe, 除非有特殊情况
tabe: 打开新的标签页
tabe d:/xxx: 在新标签页中打开文件
tab: 后面跟可以打开新窗口的命令(如 help), 这样可以在新标签页打开新窗口, 如 tab help
替换
替换的基本表达式 [range]s/from/to/[flags], 表示将range范围的from替换成to, flags匹配范围
s/aaa/bbb/: 表示把当前行的第一个aaa替换成bbb, 不指定flag就只替换第一个
%s/aaa/bbb/g: 把全文中的所有aaa替换成bbb, g的意思是指全部匹配的
行号1, 行号2s/aaa/bbb/g: 把行号1和行号2之间的aaa替换成bbb
行号1, 行号2s/^/aaa/g: 把行号1和行号2之间的行前面都加上aaa(即, 可以使用正则)
另外, .代表当前行, $ 表示最后一行
行号1, 行号2s/^////g: 从行号1和行号2之间的行都加上//注释(这是因为/有特殊用途, 需要转义)
行号1, 行号2s////g: 从行号1和行号2之间的行都去掉//注释
另一种转义的方法是, 使用+代替/, /正常使用, 如 4, 8s+aa/bb+aa or bb+