# Vim常用命令
<font style="background:yellow">
<font style="background:pink">
<font style="background: MediumSpringGreen">
2
3
# 目录
[toc]
# 🤔vim设计哲学
统一场理论:忘记vim有什么:输入模式、末行模式,vim只有一种模式:命令行模式,一切皆命令!
# 1.Vim三种模式
Vim编辑器中设置了三种模式一命令模式、末行模式和编辑模式,每种模式分别又支持多种不同的命令快捷键
我们先弄清这三种模式的操作区别以及模式之间的切换方法
- 命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。
- 输入模式:正常的文本录入。
- 末行模式:保存或退出文档,以及设置编辑环境。
说明:
vim 文件名
则进入了vim的命令模式
- 1)在每次运行Vim编辑器时,默认进入命令模式
- 2)此外,每次在编写完文档后需要先返回命令模式,然后再进人末行模式,执行文档.的保存或退出操作。
- 在Vim中,无法直接从输人模式切换到末行模式
命令模式进入输入模式:
i取自insert插入
i
光标处前一个字符编辑I
大写的 i,光标所处行首编辑
a取append追加,(我记得在Python中有用过这个函数,然后似乎C++11中也有?)
a
光标处后一个字符编辑A
光标所处行尾编辑
暂时没想到
o
光标处向下新建一行编辑O
大写的 o,光标处向上新建一行编辑
# 1.1.命令模式
命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作
剪切类(可以用作删除)(但是d却是delete删除,首字母)
dd
剪切(删除)光标所在整行5dd
删除(剪切)从光标处开始的5行
使用 | 解释 |
---|---|
x | 向后删除1个字符(相当于del按键) |
X | 向前删除1个字符(相当于Backspace按键) |
nx | n为数字,[Del]删除n个字符,比如3x |
nX | 显然容易猜 |
J(大写的j) | (闭区间,包括本身)将光标所在行和下1行的数据结合成同1行 |
dnw | 删除单词(从当前开始的单词) |
🎨dnG | (闭区间,包括本身)删除某区间和第n行,及其之间的行数(注意:n是1开始而不是0) |
🎨dG | (闭区间,包括本身)删除从光标本行到最后一行 |
🎨d0 | (闭区间,包括本身)删除从光标所在位置到这行的最开始的字符,这个区间 |
🎨d$ | (闭区间,包括本身)删除从光标所在位置到,这行的最后边的字符,这个区间 |
- 还有常用的
名字 | 解释 |
---|---|
n+空格 | 光标会向右移动n个字符的距离,比如3+空格 |
n+回车 | 光标跳转n行的距离 |
+号 | 光标移动到非空格符的下1行 |
-号 | 光标移动到非空格符的上1行 |
0 | 移动到这一行的最前面「解释:我觉得是下标0的意思」 |
$ | 移动到这一行的最后面 |
- 跳转单词?
描述 | 解释 |
---|---|
b | 向==前==移动,光标停留在前个单词词首,每次1个单词(单词中不含其他字符如:- \ = + 等) |
B | 向==前==移动,光标停留在前个单词词首,每次1个字符串(字符串可以含有其字符如:- \ = +等,is-a word/and/bog 这种都是字串) |
w或e | 向后移,光标停留在下个单词词首,每次1个单词(单词中不含其他字符如:- \ = + 等) |
W或E | 向后移,光标停留在下个单词词首,每次1个字符串(字符串可以含有其字符如:- \ = + 等,is-a word/and/bog 这种都是字串) |
复制类(暂时用copy的末尾y记忆)
命令 | |
---|---|
yy | 复制光标所在整行 |
nyy | (闭区间,包括本身)复制从光标处开始的n行 |
ynw | 复制单词(从当前开始的单词) |
🎨ynG | (闭区间,包括本身)复制某区间和第n行,及其之间的行数(注意:n是1开始而不是0) |
🎨yG | (闭区间,包括本身)复制从光标本行到最后一行 |
🎨y0 | (闭区间,包括本身)复制从光标所在位置到这行的最开始的字符,这个区间 |
🎨y$ | (闭区间,包括本身)复制从光标所在位置到,这行的最后边的字符,这个区间 |
粘贴(p是paste粘贴,首字符)
命令 | |
---|---|
p | 将之前剪切或复制过的数据粘贴到光标下一行 |
P | 将之前剪切或复制过的数据粘贴到光标上一行 |
撤销(u是unsay收回,撤回,首字母)
命令 | |
---|---|
u | 撤销上一步的操作 |
Ctrl+R (组合键) | 反撤销(后悔撤销) |
单个字符修改
X
删除光标所处的字符:X(和Windows下Ctrl+X有点类似了,但是只是删除)
替换功能⭐️⭐️replace
- 按
r
后输入新的字符替换光标所处的字符 - 按
R
后输入新的字符替换光标所处的字符,并且持续修改
字符串匹配后续的命令
n
显示搜索命令定位到的下一个字符串N
显示搜索命令定位到的上一个字符串
移动速度
gg 移动到这个档案的第一行,相当于 1G 啊! (常用)
G『也就是shift+g』移动到这个档案的最后一行(常用)
gf:文件跳转 go to file bf: 回退至原文件 back to file ctrl+o: 回退至原文件 ctrl+i :再次打开之前跳转的文件
# 1.2.输入模式-快捷键
正常的文本录入。
快捷键:
- 删除前面的单词,ctrl+w
- 删除当前到本行开始,ctrl+u
- CTRL-E 插入光标下方的字符
- CTRL-Y 插入光标上方的字符
- CTRL-M 或 CTRL-J 开始新行
CTRL-A 插入上次插入的文本
CTRL-@ 插入上次插入的文本并结束插入模式
CTRL-R {0-9a-z%#:.-="} 插入寄存器的内容
CTRL-T 在当前行首插入一个移位宽度的缩进
CTRL-D 从当前行首删除一个移位宽度的缩进
2
3
4
5
6
7
# 1.3.末行模式
末行模式:保存或退出文档,以及设置编辑环境,末行模式的命令都写在你用:
进去末行模式后面
我有其他看法,我觉得“字符串匹配”的时候,是通过/
或者?
进入的末行模式
总的来说格式::命令
执行该命令
# ⭐️**省略了:
**的命令
整数
跳转到这个整数的那一行w
保存q
退出(quit)q!
强制退出(放弃对文档的修改内容)wq!
强制保存退出
看代码常用
set nu
显示行号,nu—numset nonu
显示行号
vim设置查找字符"高亮显示"及取消
set hlsearch
- high Light,高亮
- 取消是
set nohlsearch
# ⭐️**使用/
**的命令
查找和替换
查找
/字符串
在文本中从上至下搜索该字符串?字符串
在文本中从下至上搜索该字符串在查找模式中加入
\c
「小写的c」表示大小写不敏感查找,\C
表示大小写敏感查找。例如:- 记忆法:c意思是:case
/foo\c
1
替换「substitute ,n.代替者,v.替代」
:s/one/two
将当前光标所在行的第一个 one替换成two:s/one/two/g
将当前光标所在行的所有one替换成two「global,adj.全局的,完整的;全体的」(开源实习使用了)- 下面是%的
:%s/one/two/g 8s/one/two/g
将全文中的所有one替换成two
参考资料:https://www.runoob.com/linux/linux-vim.html (opens new window)
# 2.常见场景✅
# 2.1.「⭐️展示」vim在同一个窗口中同时编辑多个文件
- 我的场景:组会,需要展示2份汇编的对比
- 「比如23.8寸的电脑,展示代码对比」因为可以承载代码放2边了
# 2.1.1.如果在终端中开没有打开vim,可以:
横向分割显示:
$ vim -o filename1 filename2
纵向分割显示:(左右)
$ vim -O filename1 filename2
- 记忆法:o意思是:open
# 2.1.2.如果已经用vim打开了一个文件,想要在窗口中同时再打开另一个文件:
- ==vertical,adj.垂直的;竖的==,n.垂直线;垂直面
纵向分割显示:(就是左边和右边)
- 去“末行模式”输入
:vs filename
纵向分割显示:
:sp filename
其中,vs可以用vsplit替换,sp可以用==split替换==。
如果finename不存在,则会新建该文件并打开。
# 2.1.3.关闭窗口
关闭光标所在的窗口:
:q 或 :close
关闭除光标所在的窗口之外的其他窗口:
:only
关闭所有窗口:
- 意思是quit all
:qa
# 2.1.4.切换窗口
打开了多个窗口,需要在窗口之间切换时:
ctrl + w w
- 即==按住ctrl键,再按两下w键==
或者ctrl + w <h|j|k|l>
即按住ctrl键,按一次w键,再按一次表示方向的h或j或k或l,则光标会切换到当前窗口的 左|下|上|右 侧的窗口
# 2.4.「查」在vim打开的文本中查找「类似Windows的Ctrl+F」
- 在normal模式下按下
/
即可进入查找模式- 「==就像,我们输入
:
会进入其他模式一样==」,输入要查找的字符串并按下回车。 - Vim会跳转到第一个匹配。按下
n
查找下一个,按下N
查找上一个。「==因为这个时候的n
的意义不再是下一行,而是匹配的下一个==」
- 「==就像,我们输入
# 2.5.在vim中统计字符串出现的次数⭐️
:%s/字符串//ng
举例,查找fail
:%s/fail//ng (注意,这种是区分大小写的)
:%s/fail\c//ng (注意,这种是 不区分 大小写的) 也就是\c
2
3
4
5
6
# 2.6.vim中「移动加速』
移动到下一个单词头部:w(word)
移动到下一个单词尾部:e(end)
移动到前一个单词头部:b(back)
移动到前一个单词尾部:ge(反向end)
单词移动同样支持数字前缀,比如 4w
可以向后移动 4 个单词。
此外大写的 W
, B
, E
具有同样的功能,只不过小写用标点符号来分隔单词,⭐️大写用空格来分隔单词,⭐️更适合⭐️在代码里移动(比如/bin/test/aa
)。
# 3.常见的可用设置
如果想让vim永久显示行号,则需要修改vim配置文件vimrc。如果没有此文件可以创建一个。在启动vim时,当前用户根目录「root」和普通用户还是不一样的下的vimrc文件会被自动读取,因此一般在当前用户的根目录下创建vimrc文件,即使用下面的命令:
vim ~/.vimrc
- 下面展示常用的+前期脚手架
set nu #永久显示行号
set hlsearch #设置,查找字符"高亮显示"
set mouse=a #运行在命令行模型使用鼠标
2
3
4
# 3.1.vim查找字符"高亮显示"
方便在公司or组会的时候展示,我的具体代码排查
- vi打开用户根目录,
vi ~/.vimrc
(如果没有会自动创建这一目录),这一目录是当前登录用户的vim设定,设置行号之类的操作也是在这里指定。 - 输入一行
set hlsearch
:wq
保存退出,即设置完成,此时用vim打开任意文档搜索字符串都可显示高亮。
还能,修改高亮的颜色
# 4.vim的插件 [打造IDE]
- taglist
- winmanager
whoway@ubuntu:~/.vim$ pwd
/home/whoway/.vim
whoway@ubuntu:~/.vim$ tree
.
├── doc
│ ├── taglist.txt
│ └── winmanager.txt
├── plugin
│ ├── taglist.vim
│ ├── winfileexplorer.vim
│ ├── winmanager.vim
│ └── wintagexplorer.vim
├── taglist_46.zip
└── winmanager.zip
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.vimrc
文件
whoway@ubuntu:~$ cat .vimrc
"设置TagList和FileExplorer打开的命令为 wm
let g:winManagerWindowLayout='FileExplorer|TagList'
nmap wm :WMToggle<cr>
"设置语法高亮
syntax enable
syntax on
"设置高亮颜色
colorscheme desert
"默认显示行号
set nu
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
"设置vim运行鼠标
set mouse=a
"filetype plugin indent on
"set completeopt=longest,menu
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 5.设置vim的.vimrc
- 使用vim时,有的时候tab键和空格的关系处理不好不利用编写程序,尤其是对于python这种对缩进格式有要求的语言
- 我们可以进行在.vimrc配置文件中进行以下设置
set ts=4 "等价于set tablestop=4 将一个tab宽度设置成4个空格
set expandtab " 将tab键转换为空格也就是说按下tab键直接转换为按下了四次空格
2
- 保存之后,对于那些==已经保存的文件==,打开文件输入
%retab!
命令,然后重新保存文件即可。
# vim缩进与空格的设置
将输入的tab展开成空格,如果要使用tab,输入ctrl+v
set expandtab
设置一个tab所占的空格长度为4
set tabstop=4
设置程序自动缩进时所占的空格长度,最好设置为与tabstop相同
set shiftwidth=4
在开启expantab后,需要设置使用**退格键(backspace)**时删除的空格数
set softtabstop=4
expandtab是将tab扩展为空格.(因为==在某些编程中, 为了编程风格的一致性, 要求不使用tab, 只使用空格==)
noexpandtab 则是相反的.
显示命令模式的命令
set showcmd
# 6.vim格式化代码快捷键
两个贼简单的方法,倾向方法一 esc,命令行模式下:
两下小g,一个等号,一个大G。
- gg
- =
- G
# 7.vim的神器⭐️块模式(visual mode)
- visual,adj,视力的;视觉的
- 可视化模式使得在 Vim 中高亮显示和操作文本变得更加容易。
# 1.进入和退出
进入
命令 | 解释 |
---|---|
v | 进入的字符可视化模式(Characterwise visual mode)。文本选择是以字符为单位的。 |
V (shift v) | 进入的行可视化模式(Linewise visual mode)。文本选择是以行为单位的。 |
ctrl-v(如果是Windows是Ctrl+q) | 进入的块可视化模式(Blockwise visual mode)。使用按键j/k/h/l 进行选中多行多列,一个矩形内的文本。 |
退出
- ⭐️或者按ctrl+c键
- 或者按ESC键
# 2.批量添加字符
- 1.
ctrl + v
选中插入行所在列 - 2.按大写
I
进入插入模式 - 3.插入要写入的字符「此时vim会显示这行咋加的」
- 4.
ESC
退出插入模式「此时,会有几微秒的时间,vim给你进行全部的替换」
# 3.在块模式-移动光标选择后,可用的
共用的
d
删除文本。u
撤销p
粘贴文本。
⭐️新增的记忆的⭐️
- 按 U 全部变为大写
- 按 u 全部变为小写
- 按 ~ 大小写互换
- 按 c 进入替换模式「也就是删掉你现在选择的部分,然后给你个插入光标,你自己写」
# 8.vim分屏
# 8.1.分屏
模仿浏览器的分屏:
vim -p file1 file2
vim -p common.f95 syn.f95 auto.sh
2
切换命令是:
:tabn
上下分屏:
vim -o file1 file2
左右分屏
vim -O file1 file2
# 8.2.对当前打开的进行分屏
操作 | 目的 |
---|---|
ctrl + w 和s | 上下分屏 |
ctrl + w 和v | 左右分屏当前 |
ctrl + w 和上下左右 | 光标移动 |
ctrl + w 和o | 取消分屏 |
ctrl + w 和c | 取消分屏 |
- 其他关闭分屏方法
#取消其它分屏,只保留当前分屏
:only
2
3
# 8.3.操作分屏
命令(快捷键) | 说明 |
---|---|
[CTRL] [W] + | 扩大窗口,增加高度,默认值为1 |
[CTRL] [W] - | 缩小窗口 |
[CTRL] [W] h或者方向键左 | 跳转到左边的窗口 |
[CTRL] [W] j | 跳转到下边的窗口 |
[CTRL] [W] k | 跳转到上边的窗口 |
[CTRL] [W] l | 跳转到右边的窗口 |
[CTRL] [W] t | 跳转到最顶上的窗口 |
[CTRL] [W] b | 跳转到最顶下的窗口 |
# 9.vimdiff
- vimdiff命令是Vim提供的文件差异比较工具
- vimdiff的作用与打开Vim时增加启动参数 -d 完全一致
- 即
vimdiff file1 file2
等价于vim -d file1 file2
。
- 即
如果真正diff的某个文件进行了修改,vimdiff会自动重新比较文件参与,如果实时diff失败了,可以通过Vim命令行窗口 :diffupdate
来手工刷新比较结果。
vimdiff配色设置 (opens new window)
# 10.批量修改字符
%s/原字符/替换字符/g
%全文的行,g全文的列1,5s/:/#/g
1,5:1-5行/lp/,/halt/s/:/##/g
/lp/,/halt/:lp字符到halt字符之间的
记忆口诀:
【部分】s/ 【部分】 / 【部分】 / 【部分】
# 参考资料
- 参考来源:知乎 (opens new window)
- ⭐️vim的中文说明文档:http://vimcdoc.sourceforge.net/ (opens new window)
- 菜鸟教程,vim命令 (opens new window)