1、末行模式下s替换
-
s/vivian/sky/ 替换当前行第一个 vivian 为 sky
-
s/vivian/sky/g 替换当前行所有 vivian 为 sky
-
n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
-
n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
n 为数字,若 n 为 .,表示从当前行开始到最后一行也可以先用Ctrl+V选中需要操作的行
- #:s/old/new/g:将当前行所有的old替换成new,
s是substitute,g是global:1,10s/old/new/g:将第1到第10行所有的old替换成new,如果不加最后的参数g,只会替换每行第一个需要替换的字符
2、多行拼接成一行
- #shift+j(末行模式下)
3、录制一个宏
1.one
2.two
3.three
4.four
修改为
1)One
2)Two
3)Three
4)Four
命令操作:
- #qa
- #0f.
- #r)
- #w~
- #j
- #q
4、执行一个宏
- #3@a,数字自己设置
5、查看寄存器a中的内容
- #:reg a
6、修改一个记录的宏
- #qA,vim也会记录操作,但是会追加到寄存器a原有的内容之后
- #:put a 将宏粘贴到文档中,编辑好以后执行"add或者:d a
- #:reg a
7、用精准的文本对象选择
光标在url的r上
var tpl = [
'<a href="{url}">{title}</a>'
]
- #vi} 选取url
- #va" 选取"{url}"
- #vi> 选取
- #vit 选取{title}
- #vat 选取{title}
- #va] 选取
操作文本块,单词,句子,段落
- #iw 当前一个单词
- #aw 当前一个单词和一个空格
- #is 当前句子(空行)
- #ip 当前段落
a和i的区别在于是否选取边界,a包含边界,t表示xml标签
8、删除一个单词
- #daw,删除一个单词外加一个空格。
- #diw,删除一个单词不加空格。
- #ciw,删除一个单词并进入插入模式。
- #caw,删除一个单词,外加一个空格并进入插入模式。
9、设置位置标记,以便快速跳转
- $ ma(a=a~z),标记一个位置用a代替
- $ 'a跳转到标记位置
-
自动标记
- #’’ 跳转到文件中上次跳转之前的位置
- #’. 上次修改的地方
- #’^ 上次插入的地方
- #’[ 上次修改或插入的起始位置
- #’] 上次修改或插入的结束位置
- #’< 上次高亮选取的起始位置
- #’> 上次高亮选取的结束位置
10、’:t’和’:m’命令复制和移动行
-
#:9copy. 将第九行复制到当前行
-
#:9t. 将第九行复制到当前行
-
#:m2 将选中的文本移动到第二行
-
#:m$ 将选中的文本移动到末行
-
#Vj选中 :m$ 将选中的文本移动到末行(不能超过文本的最大行)
11、大小写转换
- #guu当前行转换为小写
- #gUU当前行转换为大写
- #g~~当前行大小写转换
12、插入模式下删除操作
- #Crtl+h 删除前一个字符
- #Crtl+w 删除前一个单词
- #Crtl+u 删除至行首
13、插入模式返回普通模式
- #Esc
- #Ctrl+[
- #Ctrl+o(从插入模式临时切换到普通模式,输入任何一次命令后切回插入模式)
14、不离开插入模式,粘贴寄存器中的文本
- #Ctrl+r其中register是想要插入的寄存器的名字
- #reg 查看寄存器的内容
15、对字符进行查找
- #f, ;正向查找下一个(本行)
- #F, ;反向查找下一个(本行)
- #t, ;正向查找下一个(本行),查找字符的前一个字符上
- #T, ;反向查找下一个(本行),查找字符的后一个字符上
- #dt; 删除t查找的字符到;号之间的内容
16、表达式寄存器的使用
a、当成计算器
- #Ctrl+r = 6*35+Enter (插入模式下)
17、用字符编码插入非常用字符
- #Ctrl+v 065 插入A,vim接受的字符编码共3位数字,超过3位使用4位十六进制编码来输入
- #Ctrl+v u00bf ,插入“¿”
- 使用ga查看任意字符的编码
18、global命令
- #:g/test/d 删除所有带test的行
- #:g!/test/d 保留所有带test的行,等同于$ :v/test/d
- #:g/test1/,/test2/d 删除test1到test2之间的行
19、实际行与屏幕行
有时候一行内容比较多的,编辑器会自动换行分成多行显示,而j,k移动只会识别实际行,让移动显得不顺手gj和gk可以实现屏幕行的移动
- #j :向下移动一个实际行
- #gj :向下移动一个屏幕行
- #k :向上移动一个实际行
- #gk :向上移动一个屏幕行
- #0 :移动到实际行的行首
- #g0 :移动到屏幕行的行首
- #^ :移动到实际行的第一个飞空白字符
- #g^ :移动到屏幕行的第一个飞空白字符
- #$ :移动到实际行的行尾
- #g$ :移动到屏幕行的行尾
20、基于单词移动
-
#w或W :光标右移一个字至字首
-
#b或B :光标左移一个字至字首
-
#e或E :光标右移一个字至字尾
21、用精准的文本对象选择选区
文本对象允许操作括号、被引用的文本、XML标签以及其他文本的常见结构,假设光标位于需要选取的内容内部,a和i的区别在于选不选取边界
- #vi} :选取{}里面的内容,不包括{}
- #va} :选取{}里面的内容,包括{}
文本对象 | 选择区域 |
---|---|
a)或者ab | 一对圆括号 |
a}或者aB | 一对花括号 |
a] | 一对方括号 |
a> | 一对尖括号 |
a’ | 一对单引号 |
a" | 一对双引号 |
a` | 一对反引号 |
at | 一对XML标签 |
22、利用s命令删除行首,行尾的空格和tab键
#:%s/^\s+
#:%s/\s+$
其中
%s表示全局搜索
/为分隔符如例:s/a/b/g ;a 被查找的字符串(正则匹配);b 要替换成的文字;g 表示全局搜索替换(否则只处理找到的第一个结果)
^代表行首
\s代表空格和tab
+代表匹配一个或多个
$匹配行尾
23、对象选择调整起始位置(Shift+v,Crtl+v,v)
我们在使用Shift+v选择文本对象时,又是开始选择了一部分代码行,发现上面的注释也是需要的:
那这时候很多人会选择Esc重新选择
或者是先选中当前内容,做完相应操作再来把遗漏的部分选上,再操作。
这里分享一个vi命令:
#Shift+o
24、normal修改可视块区域
比如需要在每行的行首行尾加上;或者//,一行一行的添加会很麻烦,使用Shift+v选中修改区域进入末行模式
#: normal A;回车(在每行末尾加上;)
#: normal I//回车(在没开行首加上//)