Linux——vim/vi 文本操作
一、查找/替换
1. 查找
在normal模式下按下/
即可进入查找模式,输入要查找的字符串并按下回车。 Vim会跳转到第一个匹配。按下n
查找下一个,按下N
查找上一个。
Vim查找支持正则表达式,例如/vim$
匹配行尾的"vim"
。 需要查找特殊字符需要转义,例如/vim\$
匹配"vim$"
。
2. 大小写敏感查找
在查找模式中加入\c
表示大小写不敏感查找,\C
表示大小写敏感查找。例如:
/foo\c
将会查找所有的"foo"
,"FOO"
,"Foo"
等字符串。
3. 大小写敏感配置
Vim 默认采用大小写敏感的查找,为了方便我们常常将其配置为大小写不敏感:
" 设置默认进行大小写不敏感查找
set ignorecase
" 如果有一个大写字母,则切换到大小写敏感查找
set smartcase
将上述设置粘贴到你的
~/.vimrc
,重新打开Vim即可生效
4. 查找当前单词
在normal模式下按下*
即可查找光标所在单词(word), 要求每次出现的前后为空白字符或标点符号。例如当前为foo
, 可以匹配foo bar
中的foo
,但不可匹配foobar
中的foo
。 这在查找函数名、变量名时非常有用。
按下g*
即可查找光标所在单词的字符序列,每次出现前后字符无要求。 即foo bar
和foobar
中的foo
均可被匹配到。
5. 查找与替换
:s
(substitute)命令用来查找和替换字符串。语法如下:
:{作用范围}s/{目标}/{替换}/{替换标志}
例如:%s/foo/bar/g
会在全局范围(%
)查找foo
并替换为bar
,所有出现都会被替换(g
)
6. 作用范围
作用范围分为当前行、全文、选区等等。
当前行:
:s/foo/bar/g
全文:
:%s/foo/bar/g
选区,在Visual模式下选择区域后输入:
,Vim即可自动补全为 :'<,'>
。
:'<,'>s/foo/bar/g
2-11行:
:5,12s/foo/bar/g
当前行.
与接下来两行+2
:
:.,+2s/foo/bar/g
7. 替换标志
上文中命令结尾的g
即是替换标志之一,表示全局global
替换(即替换目标的所有出现)。 还有很多其他有用的替换标志:
空替换标志表示只替换从光标位置开始,目标的第一次出现:
:%s/foo/bar
i
表示大小写不敏感查找,I
表示大小写敏感:
:%s/foo/bar/i
# 等效于模式中的\c(不敏感)或\C(敏感)
:%s/foo\c/bar
c
表示需要确认,例如全局查找"foo"
替换为"bar"
并且需要确认:
:%s/foo/bar/gc
回车后Vim会将光标移动到每一次"foo"
出现的位置,并提示
replace with bar (y/n/a/q/l/^E/^Y)?
按下y
表示替换,n
表示不替换,a
表示替换所有,q
表示退出查找模式, l
表示替换当前位置并退出。^E
与^Y
是光标移动快捷键,参考: Vim中如何快速进行光标移。
二、复制/粘贴/删除
1. 复制/粘贴
方法1:(强烈推荐)
由此可有:
:9,15 move 16 或 :9,15 m 16 将第9行到第15行的文本内容到第16行的后面
方法2:
光标移动到结束行,ma
光标移动到起始行,输入y'a
光标移动到需要复制的行,输入p,行前复制则输入大写P
方法3:
把光标移到第9行 shift + v
再把光标移动到第15行 ctrl + c
再把光标死去到第16行 p mysql
方法4:
光标移动到起始行,输入ma
光标移动到结束行,输入mb
光标移动到粘贴行,输入mc
然后输入:'a,'b, co 'c 把co换成m就是剪切
若要删除多行,则输入:'a,'b de
vi设置自动缩进:set smartindent
vi设置显示行号:set number 或 set nu
2. 删除
1)方法1
- dd:删除一行
- ndd:删除以当前行开始的n行
- dw: 删除以当前字符开始的一个字符
- ndw:删除以当前字符开始的n个字符
- d$、D:删除以当前字符开始的一行字符
- d): 删除到下一句的开始
- d}:删除到下一段的开始
- d回车:删除2行
2)方法2
- 首先在命令模式下,输入“:set nu”显示行号;
- 通过行号确定你要删除的行;
- 命令输入“:32,65d”,然后回车,32-65行就被删除了。
三、多行注释/取消注释
1.多行注释:
2.取消多行注释:
四、批量缩进
1. 方法1
- 在程序代码界面,按esc,退出编辑模式,到命令模式,并在英语输入法下输入“:”;
- 将所要批量缩进的行号写上,按照格式:“行号1,行号2>”输入命令,如要将2至9行批量缩进一个tab值,则命令为“2,9>”;
- 输入完毕后,按回车执行,可以看到2至9行全部缩进了一个tab值。
- 同样的,如果要缩回来一个tab值,则用命令“行号1,行号2<”即可
2. 方法2
- esc从编辑模式退到命令模式,将光标移到需要缩进的行的行首,然后按shift+v(或ctrl+v),可以看到该行已被选中,且左下角提示为“可视行”(可视块);
- 按键盘上的上下方向键(如果是ctrl+v则上下左右均可),如这里按向下的箭头,选中所有需要批量缩进的行;
- 选择好了之后,按shift+>,是向前缩进一个tab值,按shift+<,则是缩回一个tab值。
五、光标移动
1. vim key
2. 字符移动
在Vim的Normal模式里(如果你在Visual模式或者Insert模式,可以按<Esc>
回到Normal模式), 通过h
, j
, k
, l
, i
来进行左下上右的光标移动。
在Vim中多数操作都支持数字前缀,比如10j
可以向下移动10行。
3. 单词移动
多数情况下单词移动比字符移动更加高效。 w
移动光标到下一个单词的词首,b
移动光标到上一个单词的词首;e
移动光标到下一个单词的结尾,ge
移动光标到上一个单词的结尾。
单词移动同样支持数字前缀,比如
4w
可以向后移动4个单词。连续的标点符号算一个单词。有趣的是,
W
,B
,E
具有同样的功能,只不过它是用空格来分隔单词的,可以跳地更远~
^
到行首,$
到行尾。
拷贝一行:
^y$
。
4. 相对屏幕移动
通过c-f
向下翻页,c-b
向上翻页;c-e
逐行下滚,c-y
逐行上滚。这在几乎所有Unix软件中都是好使的,比如man
和less
。 H
可以移动到屏幕的首行,L
到屏幕尾行,M
到屏幕中间。
zt
可以置顶当前行,通常用来查看完整的下文,比如函数、类的定义。 zz
将当前行移到屏幕中部,zb
移到底部。
5. 文件中移动
通过:10
可以直接移动光标到文件第10行。如果你看不到行号,可以:set number
。 gg
移到文件首行,G
移到尾行。
拷贝整个文件:
ggyG
。
/xx
可以查找某个单词xx
,n
查找下一个,N
查找上一个。 在光标跳转之后,可以通过c-o
返回上一个光标位置,c-i
跳到下一个光标位置。
?xx
可以反向查找,q/
,q?
可以列出查找历史。
6. 窗格间移动
参考另一篇文章:Vim 多文件编辑。
六、多文件编辑
TODO
七、UNDO
撤销上一步操作,可以在普通模式下,使用‘u’键恢复;若有多步操作,则一直撤销,直到不能撤销为止。
参考资料:
- https://www.cnblogs.com/huxinga/p/7942194.html
- https://www.cnblogs.com/MMLoveMeMM/articles/3707287.html
- https://www.cnblogs.com/chinalorin/p/5830375.html
- https://jingyan.baidu.com/article/1612d5008ea0b8e20e1eee81.html
- https://harttle.land/2015/11/07/vim-cursor.html
- https://harttle.land/2015/11/12/vim-tabpage.html