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 文件,会发现什么都没有,因为普通用户没有权限。

相关推荐
cccccc语言我来了1 天前
(Linux (6):从包管理到工具探索,构建系统操作基础认知)
linux·运维·服务器
8K超高清1 天前
高校巡展:中国传媒大学+河北传媒学院
大数据·运维·网络·人工智能·传媒
ben9518chen1 天前
嵌入式Linux C语言程序设计九
linux·c语言
wuk9981 天前
CentOS7环境搭建L2TP服务器
运维·服务器
恒创科技HK1 天前
香港1核2G云服务器当网站服务器够用不?
运维·服务器
IT 小阿姨(数据库)1 天前
PostgreSQL 之上的开源时序数据库 TimescaleDB 详解
运维·数据库·sql·postgresql·开源·centos·时序数据库
颜大哦1 天前
linux安装mysql
linux·运维·mysql·adb
学习3人组1 天前
Node.js 网站服务器开发
运维·服务器·node.js
来知晓1 天前
Linux:WSL内存空间管理之清完内存C盘可用空间不增问题解决
linux·运维·服务器
大聪明-PLUS1 天前
嵌入式 Linux 初学者指南 – 第 2 部分
linux·嵌入式·arm·smarc