Linux基础开发工具 --- vim
之前我们编写,编译,调试,运行代码都是在VS2022上一并完成的,这种从代码编写,编译到调试,运行,将所有功能都集成在一款工具上的工具称之为IDE(集成开发工具)。
Linux中的开发工具不是 IDE,而是一个个独立的工具:
写代码的工具为:编辑器 vim,vi(vi 是很老的编辑器)
编译代码的工具为:gcc,g++
调试的工具为:gdb,cgdb
构建工具为:makefile,make,cmake,git
本篇博客主要关于编辑器 vim 的使用,vim 是一个只用来写代码的工具。vim 是一个在终端下编写代码的工具,作为程序员必须掌握一种能够在 linux 后端编写代码的文本编辑器,而 vim是应用最为广泛的后端文本编辑器。要想使用好vim,相关的指令必须掌握。
vim 的三种模式
我们先以 vim 的三种模式为切入点,后面会逐渐扩展其它模式。这三个模式分别是:命令模式,底行模式,插入模式。
平常我们使用键盘按 123acd 键,屏幕上就显示123acd;按 ctrl c 和 ctrl v,就是复制粘贴,是快捷操作。实际上我们可以将快捷键理解为指令。显然命令可以增加编辑效率,也就是说,在编辑的时候,命令越多,效率也就越高。为什么命令越多,效率越高呢?因为命令背后是自动化和批量化,越熟悉这些命令,编辑时效率就越高。vim 的核心就是围绕命令来展开的。
1. 模式之间的切换
使用 vim 编写 C 语言的 “hello world” 程序。vim 代码文件,打开文件,编写代码。打开文件之后,默认处在命令模式下,这也是为什么一开始无论我们怎么按动键盘,vim 都不会有反应,因为它将我们输入的东西识别成了非法命令。
当按 i 键,此时就进入了插入模式,并且左下角会显示 -- INSERT -- ,表明此时是插入模式。进入到插入模式后,怎么回到命令模式?按 Esc 键(最左上角)。
所以从命令模式进入插入模式按 i 键,从插入模式回退到命令模式按 Esc 键。
怎么退出命令模式呢?一般情况下,需要从命令模式进入到底层模式,然后输入对应的指令才能退出。如何进入底行模式呢?按 shift ;(一起按),然后再按 q 键,就退出 vim 了。若现在位于底行模式,想进入命令模式,按 Esc 键即可。
所以从命令模式进入底行模式按 : 键,从底行模式回退到命令模式按 Esc 键。
需要注意的是插入模式和底行模式不可以直接切换,必须由命令模式作为中介。如此,三种模式之间的切换方式如下图所示:
接下来讲解三种模式用到的指令。
2. 命令模式
在将命令模式的相关指令功能时,先介绍底行模式下的一个命令 --- set nu,其功能为显示代码行数,set nonu 功能与 set nu 相反:
复制粘贴功能
yy 功能为:复制光标所在行的所有内容。
p 功能为:粘贴 yy 所复制的内容到当前所在行的下一行。
功能演示:
n + yy 功能为:复制光标所处位置的 n 行的内容。
n + p 功能为:粘贴 n 行复制的内容。
光标移动功能
shift+g(G) 功能为:进入文本末端。功能演示:
gg 功能为:进入文本开始。功能演示:
n shift+g(G) 功能为:定位到第 n 行。功能演示:输入 10 G
shift+4($) 功能为:定位到当前光标所在行的结尾。功能演示:
shift+6(^) 功能为:定位到当前光标所在行的开始。功能演示:
之前介绍的指令都是大范围移动的,有没有局部范围移动的指令?有,按键盘的上下左右键,或者按 hjkl 这四个相邻的键,这四个键的功能分别为:h(左)j(下)k(上)l(右)。推荐使用 hjkl 键来控制光标的局部移动。
可能有人会想,既然有了方向键来控制光标的移动,为什么还要设置 hjkl ?因为在使用键盘时,hjkl 这四个键就在右手所在处,用起来更加的快捷;并且在电脑诞生之初,没有方向键,所以选择hjkl 这四个键来充当方向键。若想问为什么不是 wasd 这四个键,那应该思考它是什么时候作为游戏移动方向键的。
按 hjkl 这四个键,光标每次只能移动一个字符,若目标行的代码很长,想要移动到改行的某一处,岂不是要移很久?我们可以按其它键,实现快速移动的效果。
w 功能为:按照“单词”为单位,向右移动;b 功能为:按照”单词“为单位,向左移动。
这里的“单词“是什么意思?由字母和数字组成的串是一个单词,单独的特殊字符是一个单词。在使用 w 和 b 键时,特殊字符只能一个个跳过,数字和字母组成的串可以一并跳过。功能演示:
n w/b 功能为:以“单词”为单位,向右/左移动n个单词。
删除和撤销功能
dd 功能为:删除光标所在行的内容。功能演示:
n dd 功能为:删除从光标所在行开始的 n 行的内容。功能演示:5 dd
若后悔之前所执行的操作,按 u 键,功能为:撤销之前执行的操作;若对刚刚的撤销操作又后悔了,按 ctrl r 键,功能为:撤销 u 的操作。
将文本的某些内容撤销后,再保存文本内容,这时 ctrl r 键仍热可以实现撤销 u 的操作的功能。只要没有退出 vim,随时都可以撤销,一旦退出 vim ,就无法撤销了。
若不想删除整行内容,只想删除某个字符,按 x 键,功能为:删除光标所在的字符(持续按x键,持续删除)。 x 删除字符时是从左向右删除,若想要从右向左删除,按 shift+x(X) 键,功能为:从右向左删除光标所在的字符。功能演示:
n x 功能为:从光标所在位置开始,从左向右连续删除n个字符;n shift + x(X) 功能为:从光标所在位置开始,从右向左连续删除 n 个字符。
替换和注释功能
shift+`(~) 功能为:大小写迅速转换。功能演示:
若在编写代码时,某个字符写错了,想要将它修正,应该怎么办?将光标移动到要修改的字符位置处,按 r 键,进入单词的替换模式,再输入替换字符,这样错误字符就修正完毕了。r 功能为:替换光标所在位置的一个字符。功能演示:
n r 功能为:将光标所在位置的一个字符替换成 n 个替换字符。功能演示:2 r e
若想要修改光标所在行的内容,按 shift+r(R)键,进入替换模式,之后会在文本的左下角显示 --REPLACE-- 表示当前处于替换模式。shift+r(R) 功能为:让 vim 进入替换模式,进行批量化的内容替换。若想要退出替换模式,回到命令模式,按 Esc 键。
ctrl v 功能为:进入视图模式,进入之后文本的左下角会显示 -- VISUAL BLOCK --,表示当前处于替换模式。进入视图模式后,按 hjkl 键选中区域,之后按shift+i(I)键快速进入到插入模式,再输入 // ,再按 Esc 键,便就完成了批量化注释。功能演示:
位于视图模式下,使用 hjkl 键选择区域,再按 d 键,便完成了批量化去注释。功能演示:
若想要将从第 m 行到第 n 行的内容注释掉,输入 (m-n) j选中区域,shift+i ,//,Esc,完成大区域的注释。ctrl v 进入视图模式,按 hjkl 键选择区域,按 d 键,完成大区域的去注释。
在视图模式下,既然可以批量化的注释,自然也就可以批量化的增加文本中的内容,选中区域,输入内容,将选中的区域都增加新增内容。功能演示:
3. 底行模式
w 功能为:保存文本文件;q 功能为:退出文本文件;wq 功能为:保存并退出文本文件。当在退出前,修改了文本文件中的内容且没有保存,此时按 q 键,会显示:
w! 功能为:强制保存;q! 功能为:强制退出;wq! 功能为:强制保存并退出。这三个指令都是用来处理没有文本的权限时,怎么保存和退出文本。
对于普通用户,若去掉了对 code.c 文件的 r 权限,然后使用 vim 打开 code.c 文件,会发现文件里面什么都没有,这是因为没有文件的 r 权限。
加上对 code.c 的 r 权限,去掉对 code.c 的 w 权限,然后使用 vim 打开 code.c 文件,会发现能够查看到文件中的内容,但是若往文件中写入数据,然后再保存,会显示:
显示仅有只读权限。若想要退出输入 q! ,强制退出。
若在使用 vim 编写程序时,不小心退出了 XShell 软件,且文本文件中的内容没有保存,此时再重新登陆 XShell ,用 vim 打开文本文件,会出现以下内容:
Found a swap file by the name ".test.c.swp" 发现了一个 swp 文件,vim 在关闭的时候,将我们刚刚写的临时文件保存了起来。最下面几个单词的意思分别为:
1. Open Read-Only:以只读的方式打开
2. Edit anyway:强制编辑
3. Recover:恢复之前未保存的修改
4. Delete it:删除swap文件
5. Quit:退出
6. Abort:终止
输入 r/R 之后,打开文本文件,接着保存并退出;当再次打开时,它仍然会出现相同的内容,这是为什么?因为当 vim 闪退时,会默认在当前目录下生成一个临时文件。但是输入 ll 指令查看时,为什么看不见呀?因为这个临时文件是以 . 开头,若想要查看输入 ls -al 指令:
.test.c.swp 就是 vim 生成的临时文件,若不想再显示那些内容,删除 swp 文件即可。
/key 功能为:匹配搜索,按 n 键自动跳到包含 key 内容所在的行处。功能演示:
!cmd(任意指令) 功能为:不退出vim,直接执行cmd命令。功能演示:
%s/dst/src/g 功能为:将文本文件中所有的 dst 都替换成 src 。功能演示:%s/hello/666/g
vim 文件名,打开该文件,不往里面写入内容。直接 !q 退出,若该文件本身不存在,则该路径下不会新建同名文件;!wq 强制保存并退出,若该文件本身不存在,则会在该路径下新建同名文件。所以在使用 vim 编写代码时,不需要先 touch 一个文件,然后再 vim 打开该文件,可以直接vim 文件名。
vs 文件名 功能为:分屏,实现多文件编写代码。将屏幕分成两个屏:
光标位于哪个分屏,此时就在操作哪个分屏。若想将光标从一个分屏移动到另一个分屏,按 ctrl ww ,功能为:选中分屏。再输入 vs 文件名,分成三个屏,还可以分成4个屏甚至更多,退出并保存这些文件后,会发现在当前路径下生成了3个文件:
当退出 vim 后,光标在第 n 行,退出之后再次打开,光标还在原来的位置。若想要打开文本文件时光标就位于某行位置,可以输入 vim 文件名 +n,使光标定位到 n 行。功能演示:
4. 插入模式
插入模式不必多说,该模式就是写模式。之前曾介绍过由命令模式进入插入模式的一种方法,再来介绍两种方法 a 和 o,aio 这三种方法可以由命令模式进入到插入模式。位于命令模式下时,每次退出都需要进入底行模式才行,有更简便的方法的 shift+z(Z),等同于shift+; q ,直接退出 vim 。
5. 五种模式之间的转化方式
在介绍命令模式中的指令的功能时,提到过另外两种模式替换模式和视图模式。下图展示了这五种模式之间的替换方式:
vim 的简单配置
为什么是简单配置,因为 vim 的配置一件非常复杂的事,但如果只是简单的配置,那不是什么难事。
配置文件的位置:在目录 /etc/ 下,有个名为 vimrc 的文件,这是系统中公共的 vim 配置⽂件,对所有用户都有效;而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为:“.vimrc”。例如,/root 目录下,通常已经存在⼀个.vimrc 文件,如果不存在,则自己创建。
在 zs 普通账户下配置 vim:
用 vim 打开某文本文件,里面什么都没有:
演示 vim 的简单的配置:
一般在用户的家目录下,会保存着一个隐藏的临时目录,当前 zs 的家目录下并没有想要看到的:
如果没有,自己创建 touch .vimrc。打开 .vimrc ,向里面写入配置项 set nu,显示代码行号。再打开文本文件,编写代码时就自动显示行号了:
可以使用 which 指令查看到 vim 所在的目录:
这也就说明了vim实际上就是一个指令。
当我们以普通用户的身份打开 vim 时,vim 命令就会去当前用户的家目录下去查找配置文件 .vimrc。
当 vim 启动时,会将 .vimrc 文件中的配置项作为 vim 启动的原始配置文件。所以对vim做基本配置,本质就是将配置项写入.vimrc配置文件中。
可以使用 AI 来搜索你想要添加的配置项。
但是实际上我们自己做的 vim 的配置,基本上很难用,因为没有我们最需要的功能,如语法提醒,自动补齐。在实际上使用 vim 时,用到的都是强大的功能,这些都需要 vim 插件,想要什么插件可以通过 AI 获取。再安装这些插件时,不建议直接安装到系统里,可以在当前目录下,创建一个.vim 目录,将下载的插件安装到 .vim 目录中,然后再配置 .vimrc 中的配置项,再在 .vim 目录中引用 .vimrc 。
在学习权限时,提到过普通用户 sudo 进行权限提升时,是默认提升失败的,如果想要成功,需要让 root 用户将普通用户添加到信用用户列表中。怎么添加呢?找到 /etc/sudoers ,打开 /etc/sudoers 目录,找到下示内容:
按照 100 行所示的格式,添加要添加的用户账号:
添加完毕后,输入wq,保存并退出,会发现退出不了,需要 !wq ,强制保存并退出。
来验证是否添加成功:
为什么我一个超级用户,在退出 /etc/sudoers 文件时,还要强制退出呢?这与文件的权限有关,root 对该文件只有 r 权限:
如果我们以普通用户的身份,去打开 /etc/sudoers 文件,会发现什么都没有,因为普通用户没有权限。