vim 12种模式的切换、常用命令集合

开发工具

每当别人问你:

💦你在什么环境下写代码、调试、编译、链接代码?

🧑🏿Visual Studio 2022。VScode。IntelliJ IDEA。Eclipse...

对于上面这种环境,我们称之为集成开发环境(IDE)。然而,相比我们在 Linux 中大部分情况下,我们所使用的工具都是独立的工具 ------ 比如我们写代码用 vim、编译用 gcc/g++、调试用 gdb、维护项目关系用 make/Makefile 等。在Linux环境中,vim可谓是程序员们的老朋友了。



vi/vim 的区别简单说,它们都是多模式编辑器,不同的是 vim 是 vi 的升级版本,它不仅兼容 vi 的所有指令,而且还有一些新特性。例如语法高亮,可视化操作不仅可以在终端运行,也可以运行于 x window、 mac os、windows,所以这里我们学习 vim。

不过,vim 并不好学,学习成本较高,那为啥还要学习 vim 呢 ?------ 主要原因有两个:其一是 vim 用的比较广泛,当然其功能也是很强大,大成后可以完全摆脱鼠标的束缚,尤其是嵌入式软件开发工作者,在实际工作中,没有界面操作时,对终端的依赖程度十分高;其二是基本所有的 Linux 机器上都默认带有 vim 的,可以这么说,vim 只要熟练了,其它的文本编译器都不足为惧。vim 和 make/Makefile 使用的熟练度是衡量一个 Linux 程序员水平的一个很重要的东西。

1、vim的基本概念

vim 共有 12 种模式:six BASIC modes 和 six ADDITIONAL modes。

详细介绍三种常用模式:命令模式、插入模式和底行模式。

这是六种基本模式:

normal mode 正常模式

visual mode 可视化模式

command mode 命令模式

insert mode 插入模式 i / a / o

select mode 选择模式

ex mode 扩展模式

有六种附加模式。这些是基本模式的变体:

Operator-pending 模式 这类似于普通模式,但在操作符命令启动后,Vim 正在等待 {motion} 来指定操作符将要处理的文本。


Replace mode 替换模式 替换模式是插入模式的一个特例。可以执行与插入模式相同的操作,但对于您输入的每个字符,现有文本中的一个字符将被删除。


Virtual Replace mode 虚拟替换模式 虚拟替换模式与替换模式类似,但您替换的不是文件字符,而是屏幕空间。


Insert Normal mode 插入普通模式 在插入模式下按 CTRL-O 键进入。这类似于普通模式,但在执行一个命令后,Vim 将返回到插入模式。如果启用了"showmode"选项,则窗口底部将显示"--(插入)--"。


Insert Visual mode 插入可视模式 从插入模式开始可视选择时进入,例如,使用 CTRL-O 然后按"v"、"V"或 CTRL-V。当可视选择结束时,Vim 返回插入模式。如果"showmode"选项处于打开状态,则窗口底部将显示"--(插入)VISUAL --"。


Insert Select mode 插入选择模式 从插入模式启动选择模式时进入。例如,通过拖动鼠标或 <S-Right>。选择模式结束时,Vim 返回插入模式。如果"showmode"选项处于打开状态,则窗口底部会显示"-- (insert) SELECT --"。

mode-switching / 模式转换

如果出于某种原因你不知道自己处于哪种模式,你可以随时获得通过输入两次<Esc >返回正常模式。【这不适用于Ex模式 】

但是,使用" :visual "。当你看到屏幕闪烁或键入<Esc >后会听到铃声。但是,在插入模式下使用CTRL-O后按<Esc >会听到 "哔" 声,但您仍处于插入模式,请再次键入<Esc>以返回正常模式。

转换模式 To 模式 *i_esc *
正常 可视 选择 插入 替换 命令行 Ex
FROM 模式
正常 v V ^V * 4 * 1 R gR : / ? ! Q
可视 * 2 ^G c C - - : - -
选择 * 5 ^O ^G * 6 - - - - - -
插入 <Esc> - - - - <Insert> - - - -
替换 <Esc> - - - - <Insert> - - - -
命令行 * 3 - - - - :start - - - -
Ex :vi - - - - - - - - - -

- - not possible

*1 通过输入命令" i "," I "," a "从普通模式进入插入模式," A "、" o "、" O "、" c "、" C "、" s " 或 S "。

*2 通过发出非移动命令从可视模式进入正常模式,执行命令,或者按 " v "," V "或" CTRL-V "(参见 | v_v |),它只会停止可视模式,而没有任何副作用。

*3 通过以下方式从命令行模式进入正常模式:

  • 按 <CR >或<NL>,将执行输入的命令。

  • 删除整行(例如,使用CTRL-U)并给出最后的<BS>。

  • CTRL-C 或 <Esc> 退出命令行而不执行命令。

    在最后一种情况下, <Esc > 可能是使用 'wildchar' 选项定义的字符,在这种情况下它将启动命令行完成。您可以忽略它并再次输入<Esc >。{Vi: 当按下时,命令行被执行。这对大多数人来说是意料之外的;因此它被改变了。

    在 Vim 中,当 <Esc > 是映射的一部分时,命令行执行。如果您希望在输入**<Esc > 时也使用 Vi 行为,请使用" :cmap ^V<Esc> ^V ^M" }

*4 通过以下方式从 正常模式 进入 选择模式

  • 当 'selectmode' 包含 "mouse" 时,使用鼠标选择文本
  • 使用不可打印的命令移动光标,同时保持 Shift 按下键,并且 "selectmode" 选项包含 "key"
  • 当 'selectmode' 包含 "cmd" 时使用 " v "、" V " 或 " CTRL-V "
  • 使用 " gh "、" gH " 或 " g CTRL-H " | g_CTRL-H |

*5 使用不可打印的命令从选择模式进入正常模式以移动光标,而无需按住 Shift 键。

*6 通过输入可打印字符从 选择模式 进入插入模式。选择内容被删除并且字符被插入。

如果"insertmode"选项打开,则编辑文件将在插入模式下开始。

*CTRL-_CTRL-N * *i_CTRL-_CTRL-N * *c_CTRL-_CTRL-N * *v_CTRL-_CTRL-N *

此外,命令 CTRL-\ CTRL-N 或 <C-\ > <CN > 可用于从任何其他模式进入正常模式。这可用于确保 Vim 处于正常模式,而不会像 <Esc > 那样发出蜂鸣声。然而,这不在 Ex模式下工作。在带有参数的命令(如 | f | 或 | m |)之后使用时,将应用使用 " ttimeoutlen" 设置的超时。

*CTRL-_CTRL-G * *i_CTRL-_CTRL-G * *c_CTRL-_CTRL-G * *v_CTRL-_CTRL-G *

当设置了 "insertmode" 时,可以使用命令 CTRL-\ CTRL-G 或 <C-\ > <CN> 进入插入模式。否则进入正常模式。这可以用来确保 Vim 处于 'insertmode'指示的模式,无需了解 Vim 当前处于什么模式。

* Q* * mode-Ex* * Ex-mode* * Ex* * EX* * E501*

Q

切换到 "Ex"模式。 这有点像一个接一个地输入":"命令,不同之处在于:

  • 您不必一直按":"。

  • 屏幕不会在每个命令之后更新。

  • 没有正常的命令行编辑。

  • 不使用映射和缩写。

实际上,您正在使用"标准"行输入编辑命令(<Del > 或 <BS > 删除,CTRL-U 删除整行)编辑行。如果在命令行上以 "ex" 调用 Vim,它将默认进入此模式。

使用 ":vi" 命令 |:visual| 退出 "Ex"模式

注意:在旧版本的 Vim "Q"格式文本中,现在使用 |gq| 完成。但是,如果您使用

|vimrc_example.vim| 脚本,"Q"的工作方式与"gq"相同。

* gQ*

gQ

像使用"Q"一样切换到 "Ex"模式 ,但实际上就像依次输入":"命令一样。所有命令行编辑、完成等均可用。

使用":vi"命令 |:visual| 退出 "Ex"模式。

{not in Vi}

===============================================================

2、vim的基本操作

三种常用模式:

1> vim拥有三种操作模式
命令行模式(Command Mode) :

当我们vim到某个文件时,默认进入的就是 命令模式。

实现光标的移动,字符、字或行的删除,移动、复制等编辑型操作。

插入模式(Insert Mode) :

自定义输入文本的模式 在命令模式下按下键盘'i' 'a' 'o' ---> -- INSERT -- 意味着进入了插入模式。

只有在插入模式下,才可以做文字输入。

底行模式 :

就是给文件做最后处理的模式。

其实,本来Vim只有命令模式和插入模式就可以了,但是,在命令行模式下,输入的命令不回显,有些命令回显比较好, 所以,又专门弄了一个底行模式,在这种模式下,输入的命令回显在编辑器的底部,所以叫底行模式。

三种模式的运行切换:

3、vim插入模式命令集

			i / a / o    进入到插入模式  
			按「i」切换进入插入模式「insert mode」,按"i"进入插入模式后是从光标当前位置开始输入文件;
			按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
			按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。
			
			「i」:i是从光标所在位置开始输入
			「I」:I是光标所在行第一个非空白字符开始输入
			「a」:a是从光标所在的下一个字符开始输入
			「A」:A是从光标所在行的最后一个字符开始输入
			「o」:o是从光标所在行的下一行新的一行开始输入
			「O」:O是从光标所在行的上一行新的一行开始输入
			「r」:r是取代光标所在的字符一次
			「R」:R是依次取代光标所在字符

			从插入模式切换为命令模式:按「ESC」键。

4、vim命令行模式命令集

移动光标
			按「gg = G」: 自动排版
			vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格
			按「G」:移动到文章的最后
			按「 $ 」:移动到光标所在行的"行尾"
			按「^」:移动到光标所在行的"行首"
			按「w」:光标跳到下个字的开头
			按「e」:光标跳到下个字的字尾
			按「b」:光标回到上个字的开头
			按「#l」:光标移到该行的第#个位置,如:5l,56l
			按[gg]:进入到文本开始
			按[G]:回到文件末尾
			按[shift+g]:进入文本末端
			按「ctrl」+「b」:屏幕往"后"移动一页
			按「ctrl」+「f」:屏幕往"前"移动一页
			按「ctrl」+「u」:屏幕往"后"移动半页
			按「ctrl」+「d」:屏幕往"前"移动半页
			按「v」:v是光标起始和结束之间的文本会被选中
			按「V」:V是光标起始和结束之间的所有行被选中
			按「ctrl」+「v」:Ctrl+v是光标起始和结束之间构成的矩形区域被选中
删除文字
			「x」:每按一次,删除光标所在位置的一个字符
			「#x」:例如,「6x」表示删除光标所在位置的"后面(包含自己在内)"6个字符
			「X」:大写的X,每按一次,删除光标所在位置的"前面"一个字符
			「#X」:例如,「20X」表示删除光标所在位置的"前面"20个字符
			「dd」:剪切光标所在行 
			「#dd」:从光标所在行开始剪切#行 
			「d1G」:d1G是删除当前行前面的所有数据
			「dG」:dG是删除当前行之后的全部数据
复制
			「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
			「#yw」:复制#个字到缓冲区
			「yy」:复制光标所在行到缓冲区。
			「#yy」:例如,「6yy」表示拷贝从光标所在的该行"往下数"6行文字。
			「y1G」:y1G是复制当前行前面的所有数据
			「yG」:yG是复制当前行之后的全部数据
			「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与"y"有关的复制命令都必须与"p"配合才能完成复制与粘贴功能。
替换
			「r」:替换光标所在处的字符。
			「R」:替换光标所到之处的字符,直到按下「ESC」键为止。	
撤销上一次操作
			「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次"u"可以执行多次回复。
			「ctrl + r」: 撤销的恢复,反撤销。
			「.(小数点)」: 重复上一个动作。
更改
			「cw」:更改光标所在处的字到字尾处
			「c#w」:例如,「c3w」表示更改3个字
跳至指定的行
			「ctrl」+「g」列出光标所在行的行号。
			「#G」:例如,「15G」,表示移动光标至文章的第15行行首

5、vim底行模式命令集

在使用低行模式之前,请记住先按「ESC」键确定您已经处于正常模式,再按「:」冒号即可进入末行模式。

保存文件
			「w」        	保存 
			「q」         	退出 
			「wq」       	保存并退出 
			「q!」      	强制退出 
			「wq! 」   		强制保存并退出 
列出行号
			「set nu」  临时显示行数
跳到文件中的某一行
			「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。
搜索
			「/aslord」  全文搜索"aslord"
					「n」  查找下一个 
					「N」  查找上一个 
			「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按
			「n」会往后寻找到您要的关键字为止。
			「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直
			 按「n」会往前寻找到您要的关键字为止。
替换
			「s/old/new/g」  将光标所在行中的old 替换成 new 
			「%s/old/new/g」 将全文的old 替换成 new --->一句话替换变量名/函数名

6、vim参数列表

			$ vim --help
			VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Oct 01 2021 01:51:08)
			
			用法: vim [参数] [文件 ..]       编辑指定的文件
			或: vim [参数] -               从标准输入(stdin)读取文本
			或: vim [参数] -t tag          编辑 tag 定义处的文件
			或: vim [参数] -q [errorfile]  编辑第一个出错处的文件
			      				
			参数:
				  --			在这以后只有文件名
				  -v			Vi 模式 (同 "vi")
				  -e			Ex 模式 (同 "ex")
				  -E			Improved Ex mode
				  -s			安静(批处理)模式 (只能与 "ex" 一起使用)
				  -d			Diff 模式 (同 "vimdiff")
				  -y			容易模式 (同 "evim",无模式)
				  -R			只读模式 (同 "view")
				  -Z			限制模式 (同 "rvim")
				  -m			不可修改(写入文件)
				  -M			文本不可修改
				  -b			二进制模式
				  -l			Lisp 模式
				  -C			兼容传统的 Vi: 'compatible'
				  -N			不完全兼容传统的 Vi: 'nocompatible'
				  -V[N][fname]		Be verbose [level N] [log messages to fname]
				  -D			调试模式
				  -n			不使用交换文件,只使用内存
				  -r			列出交换文件并退出
				  -r (跟文件名)		恢复崩溃的会话
				  -L			同 -r
				  -A			以 Arabic 模式启动
				  -H			以 Hebrew 模式启动
				  -T <terminal>	设定终端类型为 <terminal>
				  --not-a-term		Skip warning for input/output not being a terminal
				  --ttyfail		Exit if input or output is not a terminal
				  -u <vimrc>		使用 <vimrc> 替代任何 .vimrc
				  --noplugin		不加载 plugin 脚本
				  -p[N]		打开 N 个标签页 (默认值: 每个文件一个)
				  -o[N]		打开 N 个窗口 (默认值: 每个文件一个)
				  -O[N]		同 -o 但垂直分割
				  +			启动后跳到文件末尾
				  +<lnum>		启动后跳到第 <lnum> 行
				  --cmd <command>	加载任何 vimrc 文件前执行 <command>
				  -c <command>		加载第一个文件后执行 <command>
				  -S <session>		加载第一个文件后执行文件 <session>
				  -s <scriptin>	从文件 <scriptin> 读入正常模式的命令
				  -w <scriptout>	将所有输入的命令追加到文件 <scriptout>
				  -W <scriptout>	将所有输入的命令写入到文件 <scriptout>
				  -x			编辑加密的文件
				  --startuptime <file>	Write startup timing messages to <file>
				  -i <viminfo>		使用 <viminfo> 取代 .viminfo
				  --clean		'nocompatible', Vim defaults, no plugins, no viminfo
				  -h  或  --help	打印帮助(本信息)并退出
				  --version		打印版本信息并退出

7、简单vim配置

				1> 打开vim的配置文件的位置
               		sudo vim /etc/vim/vimrc

				在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。
				而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:".vimrc"。例如,/root目录下,通常已经存在一个.vimrc文件,如果不存在,则创建之。
				切换用户成为自己执行 su ,进入自己的主工作目录,执行 cd ~
				打开自己目录下的.vimrc文件,执行 vim .vimrc
				  
				2> 去到文件末尾,并添加以下内容 
					set mouse=a
					set number
					set cindent
					set st=4
					set sw=4
					set sts=4
				3> 保存并退出 
					解释: 
					1>set mouse=a    	--->vim中可以用鼠标控制光标
					2>set number      	--->显示行号 
					3>set cindent     	--->C语言的编程缩进格式 
					4>三位一体 :        	--->设置你的tab,一个tab=4个空格
						set st=4
						set sw=4
						set sts=4
					其他:
					设置语法高亮: syntax on
					显示行号: set nu
					设置缩进的空格数为4: set shiftwidth=4

			mf:快捷键自动生成初始化代码 
			 	map mf i#include <stdio.h><Esc><Esc>oint main(int argc, char *argv[])<Esc>o{<Esc>oreturn 0;<Esc>o}<Esc>2ko 

另外,我的资源中免费上传了Vim中文手册,需要的朋友自取。

以上。

我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!

相关推荐
CSND7401 小时前
Ubuntu vi(vim)编辑器配置一键补全main函数
linux·c语言·ubuntu·编辑器·vim
シ風箏4 小时前
Neo4j【环境部署 02】图形数据库Neo4j在Linux系统ARM架构下的安装使用
linux·数据库·arm·neo4j
C.L.L5 小时前
vscode中同时运行两个python文件(不用安装插件)
ide·vscode·编辑器
Cachel wood6 小时前
Vue.js前端框架教程8:Vue消息提示ElMessage和ElMessageBox
linux·前端·javascript·vue.js·前端框架·ecmascript
小屁不止是运维9 小时前
麒麟操作系统服务架构保姆级教程(二)ssh远程连接
linux·运维·服务器·学习·架构·ssh
超爱吃士力架10 小时前
Ubuntu操作系统安装docker
linux·前端·后端
黑客K-ing11 小时前
网络安全防范
linux·服务器·web安全
王三三11 小时前
群晖利用acme.sh自动申请证书并且自动重载证书的问题解决
linux·自动化·证书·群晖·acme·acme.sh·lets encrypt
路飞雪吖~11 小时前
【Linux】进程控制
linux·运维·服务器
wy02_11 小时前
Linux基本命令
linux·运维