# Vim常用命令

<font style="background:yellow">
<font style="background:pink">
<font style="background: MediumSpringGreen">
1
2
3

# 目录

[toc]

# 🤔vim设计哲学

统一场理论:忘记vim有什么:输入模式、末行模式,vim只有一种模式:命令行模式,一切皆命令!

# 1.Vim三种模式

Vim编辑器中设置了三种模式一命令模式、末行模式和编辑模式,每种模式分别又支持多种不同的命令快捷键

我们先弄清这三种模式的操作区别以及模式之间的切换方法

  • 命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。
  • 输入模式:正常的文本录入。
  • 末行模式:保存或退出文档,以及设置编辑环境。

2020_06_22_Vim_01

说明: 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		  从当前行首删除一个移位宽度的缩进

1
2
3
4
5
6
7

# 1.3.末行模式

末行模式:保存或退出文档,以及设置编辑环境,末行模式的命令都写在你用:进去末行模式后面

我有其他看法,我觉得“字符串匹配”的时候,是通过/或者?进入的末行模式

总的来说格式::命令执行该命令

# ⭐️**省略了:**的命令

  • 整数跳转到这个整数的那一行
  • w 保存
  • q 退出(quit)
  • q!强制退出(放弃对文档的修改内容)
  • wq!强制保存退出

看代码常用

  • set nu显示行号,nu—num
  • set 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 
1

纵向分割显示:(左右)

$ vim -O filename1 filename2
1
  • 记忆法:o意思是:open

# 2.1.2.如果已经用vim打开了一个文件,想要在窗口中同时再打开另一个文件:

  • ==vertical,adj.垂直的;竖的==,n.垂直线;垂直面

纵向分割显示:(就是左边和右边)

  • 去“末行模式”输入
:vs filename
1

纵向分割显示:

:sp filename
1

其中,vs可以用vsplit替换,sp可以用==split替换==。

如果finename不存在,则会新建该文件并打开。

# 2.1.3.关闭窗口

关闭光标所在的窗口:

:q 或 :close
1

关闭光标所在的窗口之外的其他窗口:

:only
1

关闭所有窗口:

  • 意思是quit all
:qa
1

# 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
1
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
1
  • 下面展示常用的+前期脚手架
set nu			#永久显示行号
set hlsearch	#设置,查找字符"高亮显示"

set mouse=a		#运行在命令行模型使用鼠标
1
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
1
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
1
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键直接转换为按下了四次空格
1
2
  • 保存之后,对于那些==已经保存的文件==,打开文件输入%retab!命令,然后重新保存文件即可。

# vim缩进与空格的设置

将输入的tab展开成空格,如果要使用tab,输入ctrl+v

set expandtab
1

设置一个tab所占的空格长度为4

set tabstop=4
1

设置程序自动缩进时所占的空格长度,最好设置为与tabstop相同

set shiftwidth=4
1

在开启expantab后,需要设置使用**退格键(backspace)**时删除的空格数

set softtabstop=4
1

expandtab是将tab扩展为空格.(因为==在某些编程中, 为了编程风格的一致性, 要求不使用tab, 只使用空格==)

noexpandtab 则是相反的.

显示命令模式的命令

set showcmd
1

# 6.vim格式化代码快捷键

两个贼简单的方法,倾向方法一 esc,命令行模式下:

两下小g,一个等号,一个大G。

  1. gg
  2. =
  3. 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
1
2

切换命令是::tabn

image-20221113144635924

上下分屏:

vim -o file1 file2
1

左右分屏

vim -O file1 file2
1

# 8.2.对当前打开的进行分屏

操作 目的
ctrl + w 和s 上下分屏
ctrl + w 和v 左右分屏当前
ctrl + w 和上下左右 光标移动
ctrl + w 和o 取消分屏
ctrl + w 和c 取消分屏
  • 其他关闭分屏方法

#取消其它分屏,只保留当前分屏
:only 
1
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/ 【部分】 / 【部分】 / 【部分】
1

# 参考资料