当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/414368.html

相关文章:

  • ip route-static 概念及题目
  • 教做3d的网站自媒体平台大全
  • 高性能分布式对象存储RustFS
  • 操作系统应用开发(九)RustDesk远程桌面介绍——东方仙盟筑基期
  • 【Rust GUI开发入门】编写一个本地音乐播放器(2. Rodio播放库的使用)
  • 企业网站建设的方法有哪些wordpress 工具安装教程
  • LabVIEW 模拟单摆运动(DAE 法)
  • 【计算机基础】网络系列(一)HTTP
  • Linux与STM32实时性与系统资源解析
  • 深圳网站建设icxun邯郸二手房出售信息
  • 展示内容框
  • 衡石HQL深度解析:如何用类SQL语法实现跨源数据的高效联邦查询?
  • 明明是新电脑,却越用越卡?如何优化?
  • StringBuffer和StringBuilder
  • 华为本地pbr及mqc及traffic-filter使用案例
  • Spring 依赖注入
  • 南宁做网站优化的公司类似58同城分类信息网站开发
  • ArkTS基础语法
  • ROS-Jazzy_rclpy
  • Socket 编程 TCP(准备阶段)
  • 【Ultralytics】评估报错:解决 KeyError: ‘info‘ 错误
  • 哪些是实名制网站母了猜猜看游戏做网站
  • 【Linux】TCP原理
  • 论文阅读:arxiv 2024 Fast Adversarial Attacks on Language Models In One GPU Minute
  • OpenJDK 17 方法链接与同步方法入口点生成机制深度解析
  • qt-C++笔记之自定义绘制:QWidget中的paintEvent 与 QGraphicsItem中的paint
  • 项目:智能排队控制系统
  • LeetCode:71.字符串解码
  • LeetCode:66.搜索旋转排序数组
  • 阿帕奇网站搭建六安做网站的