【Linux】文本编辑器-vim使用

news2024/11/20 13:36:09

目  录

  • 1 vim的基本概念
  • 2 vim的基本操作
  • 3 vim常用模式命令集
    • 3.1 vim正常模式命令集
    • 3.2 vim末行模式命令集
  • 4 vim的简单配置


1 vim的基本概念

vim编辑器与vi编辑器一样都是多模式编辑器,不同的是vim编辑器是vi编辑器的升级版本,vim不仅兼容vi的所有指令,而且还添加了许多新的特性。例如语法加亮,其可视化操作不仅可以在终端上运行,也可以运行于x window、mac os、Windows。
不同于vs2022等集编辑、调试、编译、运行等于一身的集成开发环境(IDE),vim编辑器就是单纯的文本编辑器,当然,如果经过一定配置,也可以使vim集多功能于一声,但通常我们还是将vim作为编辑器使用。

vim编辑器常用的三种模式:

(1)正常 / 普通 / 命令模式(Normal mode / Command mode)

功能: 控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入 Insert modeLast line mode

(2)插入模式(Insert mode)

功能: 只有在 Insert mode 下才可以进行文字输入,通过按 [ESC] 键可以回到命令模式。

(3)末行模式(Last line mode)

功能: 文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。在命令模式下时,可以通过 : (即按下 shift 与 : ) 进入末行模式。如果想要查看所有模式,可以在vim编辑器的末行模式下直接输入命令:help vim-modes 即可。

如下图所示:这里vim编辑器一共有12种模式,包括六种基础模式和六种额外模式:six BASIC modessix ADDITIONAL modes

vim模式


2 vim的基本操作

通过输入命令:vim 文件名 即可打开vim编辑器编辑对应文件,如果对应文件不存在,将会创建一个新的同名文件,但需要注意的是,如果退出时没有保存,这个新文件不算被真的创建,即退出vim编辑器后文件将不复存在。当我们进入vim编辑器时,默认一开始处于 命令模式 ,如果要输入文字,应当先切换到插入模式。

vim三种常用模式间的切换:

(1)正常模式切换至插入模式

  • 输入 a(按字母键 a ):从光标当前位置的下一个位置开始输入文字;
  • 输入 i(按字母键 i ):从光标当前位置开始输入文字;
  • 输入 o (按字母键 o ):插入新的一行(空行),从行首开始输入文字

(2)插入模式或末行模式切换至正常模式

  • [ESC] 键切换至正常模式,当在插入模式中输入错误而需要删除相应内容时,除了可以在插入模式下直接删除外,还可以在正常模式下通过命令删除。

(3)正常模式切换至末行模式

  • [shift 与 ;] ,等同于输入 [:] 即可切换至末行模式

模式切换


vim编辑器的退出及文件保存:

在正常模式下,按冒号键 [:] 进入末行模式(Last line mode):

  • 输入 w :保存当前文件
  • 输入 wq :保存当前文件并退出vim编辑器
  • 输入 q! :当使用vim打开文件并进行过内容更改后,如果不保存直接在末行模式下输入:q 退出,可能会提示 E37: No write since last change (add ! to override) 并且不允许退出,此时如果确认不需要保存更改后的文件而直接退出,输入:q! 即可不存盘强制退出vim编辑器。
  • 输入 wq! :当使用vim编辑器打开某些重要文件并进行过内容更改后(例如以root用户身份打开对所用用户均最多只有可读权限的文件并进行修改),如果直接在末行模式下输入:wq 保存文件并退出vim,可能会提示 E45: 'readonly' option is set (add ! to override) 并且不允许退出,此时如果希望保存对这个重要文件的更改再退出,输入:wq! 即可强制存盘并退出。

注意事项:

  • 如果不知道当前处在什么模式下,可以按 [ESC] 键,最终都会回到正常模式下,接着可以再从正常模式切换至其它模式。
  • 退出vim编辑器的时候,一般要先保存再退出。
  • 在vim中操作时,尽量不要使用鼠标及其上的滚轮,因为如果直接用鼠标或滚轮拉动编辑框的话,可能会将编辑框拉动到不属于vim编辑器范围的地方,而显示出不属于当前被编辑文件中的内容(可能是之前的Linux下输入的一些指令),如下图所示。

错误操作示例


3 vim常用模式命令集

3.1 vim正常模式命令集

(1)光标移动

  • vim中可以直接使用键盘上的上下左右键来移动光标,但正规的vim是用小写英文字母(注意大写锁定不能打开)[h][j][k][l] 来分别控制光标 左、下、上、右 的移动。
  • [G] :移动光标至文件最后,可以以 shift + g 的方式输入 G ,也可以通过打开大写锁定输入 G
  • [$] :移动光标至当前所在行的行尾。
  • [^] :移动光标至当前所在行的行首(如果有前置空格,则是移动到当前行第一个非空字符上)。
  • [#l] :移动光标至该行的第 # 个位置,如: 5 l , 26 l \pmb{5l,26l} 5l,26l
  • [ctrl + g] :列出光标所在行的行号信息,如下图所示。

ctrl+g(行号显示)

  • [#G] :移动光标至文件第 # 行行首,如:5G 表示移动光标至文中第5行行首(前置空格不算,至该行第一个非空字符)。
  • [w] :以单词为单位,移动光标至下一个单词的首字符处; [#w] 则表示移动光标至后 # 个单词的首字符处。
  • [b] :以单词为单位,如果光标位于当前单词的首字符处,则移动光标至前一个单词的首字符处;如果光标位于当前单词的非首字符处,则移动光标至当前单词的首字符处; [#b] 中的 # 则表示移动步长。
  • [e] :以单词为单位,如果光标位于当前单词的尾字符处,则移动光标至下一个单词的尾字符处;如果光标位于当前单词的非尾字符处,则移动光标至当前单词的尾字符处; [#e] 中的 # 则表示移动步长。
  • [gg] :移动光标至文件起始位置(起始第一个非空字符处)。
  • [ctrl + b] :屏幕往后(下)移动一页,即可显示前一页的内容。
  • [ctrl + f] :屏幕往前(上)移动一页,即可显示后一页的内容。
  • [ctrl + u] :屏幕往后(下)移动半页,即可显示前半页的内容。
  • [ctrl + d] :屏幕往前(上)移动半页,即可显示后半页的内容。

(2)文字删除

  • [x] :行内删除,每按一次,删除光标所在位置的一个字符(直到该行所有字符被删除,不可再删,也不会跳到其它行进行删除)。
  • [#x] :行内删除,表示删除包括光标所在位置在内的其后 # 个字符。
  • [X] :行内删除,每按一次,删除光标所在位置的前一个字符。
  • [#X] :行内删除,表示删除光标所在位置的前 # 个字符(不包括光标所在位置)。
  • [dd] :删除(剪切)光标所在行,如果将被删除行再进行粘贴,则表示对该行的剪切,否则就只是删除。
  • [#dd] :对包括当前光标所在行在内的向下(后) # 行进行删除(剪切)。

(3)内容复制

  • [yw] :以单词为单位(汉字以单个字符为分界),将包括光标所在位置在内到词尾的字符复制到缓冲区。
  • [#yw] :以单词为单位,将包括光标所在位置的字符开始往后的 # 个词复制到缓冲区。
  • [yy] :复制光标所在行到缓冲区。
  • [#yy] :复制包括光标所在行在内的其后 # 行内容到缓冲区。
  • [p] :将缓冲区中的内容从光标所在处开始向后粘贴; [#p] 表示将缓冲区中的内容粘贴 # 次。所有与 y 有关的复制命令都必须配合 p 才能完成完整的复制粘贴功能。

(4)内容替换

  • [r + 字符] :以 r 之后跟着的字符替换光标所在处的字符; [#r + 字符] 表示以 r 之后跟着的字符替换包括光标所在处在内的其后 # 个字符。
  • [R + 字符] :替换光标所到之处的字符,直到按下 [ESC] 键为止。

(5)操作撤销与恢复

  • [u] :如果误执行了一个命令,通过按下 [u] 可以回到执行该命令前的状态,多次按 [u] 可进行多次撤销。
  • [ctrl + r] :如果误撤销,可以通过 [ctrl + r] 恢复撤销。

3.2 vim末行模式命令集

在使用末行模式之前,先按 [ESC] 键确认回到正常模式下,再按 [:] 进入末行模式。

(1)显示行号

  • 输入 set nu :在文件中的每一行前面列出行号,如下图所示。

显示行号

  • 输入 set nonu :取消行号显示。

(2)将光标跳转到文件中某一行行首并在当前界面中显示出该行

  • 输入 [#][#] 表示一个数字,在末行模式下输入一个数字,再按回车键就会跳转到该行并显示,如:在末行模式下输入 17 就会跳转到文件中第 17 行。注意:在末行模式下不要使用小键盘输入,可能会进入插入模式,因此需要使用大键盘上的数字进行输入。

(3)字符(串)查找

  • [/字符(串)] :先按 [/] 键,再输入想要查找的字符(串),如果第一次找到的关键字不是目标关键字,可以一直按 [n] 键,会往查找到目标关键字为止。
  • [?字符(串)] :先按 [?] 键,再输入想要查找的字符(串),如果第一次找到的关键字不是目标关键字,可以一直按 [n] 键,会往查找到目标关键字为止。

(4)内容替换

  • 输入 %s/(替换前内容)/(替换后内容)/g :将某部分内容全部替换为目标内容,其中 g (global) 表示全部替换(如下图示例所示)。

替换示例

(5)不退出vim,执行Linux命令行命令

  • [! command] :在末行模式下,输入如:! ls -l! gcc test01.c -o test01 等命令(在原命令前加上 ! ),即可在不退出vim的情况下执行相应命令(如下图所示为在末行模式下输入 ! ls -l 且执行后的显示结果),再通过按回车键 [ENTER] 回到vim编辑器中。

示例

(6)分屏编辑多个文件

  • 输入 vs filename :通过输入 vs filename 命令可实现vim编辑器的分屏编辑,如果当前文件 filename 不存在,则会新建一个同名文件并打开,如果退出时保存了该文件,则表示其被真正创建,如果没保存就直接退出vim,则该文件不算被创建,退出vim后依旧不存在。在vim分屏编辑下,光标在哪就表示正在编辑哪个文件(如下图所示)。
  • 按住 ctrl 的同时双击 w 可以切换编辑当前分屏下不同的文件;在对应文件编辑下输入 wq 即可依次结束该文件的分屏编辑。

分屏编辑


4 vim的简单配置

  • 一个用户对应一个vim配置,当前用户所作的配置不会影响其它用户,当切换到不同用户时,如果该用户没有进行过配置,则需再次配置。
  • vim配置的是通过设置配置文件及安装相关插件来实现的。

配置文件的位置:

  • 在目录/etc/下有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。
  • 在每个用户的家目录下,都可以建立自己私有的配置文件,命名为 .vimrc 。例如:/root目录下,或者用户 jml 家目录下 /home/jml
  • 通过命令 su 用户 切换用户为想要进行vim配置的用户,进入该用户的家目录下(可以通过命令 cd ~ 进入)。
  • 打开家目录下创建好的 .vimrc 文件,执行命令 vim .vimrc ,进入vim编辑器中编辑配置文件。

常用配置选项举例:

  • 设置语法高亮:syntax on
  • 显示行号:set nu
  • 设置缩进的空格数为4:set shiftwidth=4
  • 突出显示当前行:set cursorline

设置结果如下图所示:

配置对比
这里只以几个例子做简单介绍,如果想进行更多配置可再搜索相关命令添加到配置文件 .vimrc 中。当然,如果想配置出更好看的vim,原生的配置功能可能不全,需要选择安装相关插件来完善配置,这里就不做具体讲解。


以上是我对Linux中vim编辑器相关知识的一些学习记录总结,如有错误,希望大家帮忙指正,也欢迎大家给予建议和讨论,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django by Example·第二章|Enhancing Your Blog with Advanced Features@笔记

Django by Example第二章|Enhancing Your Blog with Advanced Features笔记 这本书的结构确实很不错,如果能够坚持看下去,那么Django框架的各种用法也就掌握的七七八八了。之前写过一篇这本书的第一章,看完第一章就算是入门了,但…

acwing差分

题目:输入一个长度为 n 的整数序列。接下来输入 m 个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c。请你输出进行完所有操作后的序列。输入格式第一行包含两个整数 n 和 m。第二行包含 n 个整数,表示整…

【C++高阶数据结构】跳表(skiplist)

🏆个人主页:企鹅不叫的博客 ​ 🌈专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接:代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

第十一章Thymeleaf学习

文章目录什么是Thymeleaf什么是模板引擎Thymeleaf的同行Thymeleaf优势一个实例来认识大概过程导入对应的jar包配置对应的xml文件对应的ViewBaseServlet编写——对应的模板引擎写对应的Servlet类并且继承ViewBaseServlet对应index.html资源——对应的模板Thymeleaf的基础语法th名…

337. 打家劫舍 III

目录题目思路代码题目 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。 除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”…

笔试强训(11)

第一题:二进制插入二进制插入__牛客网 给定32位整数n和m,同时我们指定i和j,将m的二进制位数插入到n的二进制位数的j到i位,我们保证n的j到i位均是等于0的,况且m的二进制位数小于等于i-j1,其中二进制的位数从0开始从低到…

js设计模式(八)-总体感受一下设计模式

前言 首先,不得不说我们是站在巨人的肩膀上写代码,前辈们已经很合理的帮助我们总结出来了23种设计模式,虽然有些已经被语言直接使用Api实现了,感谢走在前沿的攻城狮。 但是真真正正的看一遍所有的设计模式还是很有必要的&#x…

MyBatis查询数据库

1.MyBatis 是什么? MyBatis 是⼀款优秀的持久层框架,它⽀持⾃定义 SQL、存储过程以及⾼级映射。MyBatis 去除了⼏乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接⼝和 Java POJO&#xf…

计算机基础——计算机分类

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 前言 本章将会讲解计算机分类应用领域以及发展趋势 一.计算机分类 计算机并非只有日常所…

并行计算 Clion配置使用OpenMP

文章目录配置CMakeList.txt文件OpenMP之HelloWorld数据共享属性shared子句private子句default子句default(shared)default(none)配置CMakeList.txt文件 文件底部加入以下内容,即可支持OpenMP FIND_PACKAGE(OpenMP REQUIRED) if (OPENMP_FOUND)message("OPENM…

STM32MP157驱动开发——Linux DAC驱动

STM32MP157驱动开发——Linux DAC驱动0.前言一、DAC 简介二、驱动源码分析1.设备树下的 DAC 节点2.驱动源码分析1)stm32_dac 结构体2)stm32_adc_probe 函数3)stm32_dac_iio_info 结构体三、驱动开发1.修改设备树2.使能DAC驱动四、 运行测试0.…

读书笔记 -公司改造 和 紧迫感

读书笔记 -公司改造 - 三枝匡 读书笔记 -公司改造 - 三枝匡 2022 年夏天的时候在微信读书上读了这本书,这是我们 CSDN 的创始人蒋涛推荐的,当时记了一些笔记如下。 总结: 每个有一定的历史,比较成功、或者尚未非常成功的公司遇…

基于Java+SpringBoot+vue+element实现毕业就业招聘系统

基于JavaSpringBootvueelement实现毕业就业招聘系统 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

用最简单的案例带你掌握C++中各种指针

1、前言 指针,作为C/C中最神秘、功能最强大的语法,着实是难以理解 、难以掌握、难以运用。😥 但是,能灵活的使用指针,对利用C/C开发程序将有很大的帮助,让我们一起来了解了解吧。 2、啥是指针&#xff1f…

参加《2022 中国开发者影响力盛典》我的 4 重收获!

感谢 CSDN 邀请,西红柿有幸参加了 2022 中国开发者影响力盛典暨 CSDN 企业生态汇,让我有了一个不虚此行的下午,也跟大家分享一下我在会上的 4 重收获吧~第一重收获:互联网圈大佬 会议聚焦开发者生态建设主题,分享了 CS…

分布式基础篇4 —— 基础篇完结

分类维护一、三级分类后端实现准备工作跨域问题关闭 ESLint 检查前端实现二、分类删除前端完善分类列表后端实现——删除配置发送请求代码片段前端实现——删除三、分类增加前端实现四、分类修改五、拖拽菜单拖拽效果实现拖拽数据收集拖拽功能完成拖拽功能完善六、批量删除品牌…

JS知识补充-JS原型链

概述JS原型链别名:隐式原型链作用:根据一定路径查找属性(方法)作用举例:我们定义一个构造函数Fn,使用此构造函数创建一个对象fn1,接着使用创建的对象fn1去调用toString方法并打印,我…

【阶段三】Python机器学习03篇:机器学习中的函数、机器学习中的梯度下降、机器学习的数据结构:张量与机器学习概率与统计基础

本篇的思维导图: 机器学习中的函数 函数描述了输入与输出的关系。在函数中,一个事物(输出)随着另一个(或一组)事物(输入)的变化而变化,如下图所示。 输入与输出的关系一般情况下,用x(或x1,x2,x3,…)表示输入,用y表示输出,并把它们叫作变量,…

Java设计模式中的设计原则/开闭原则、里氏代换原则和依赖倒转原则又是什么,怎么用

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用! 3.设计原则 3.1 目的 提高软件系统可维护性与可复用性增加软件可扩展性与灵活性节约开发成本与维护成本 3.2 开闭原则 3.2.1 特点 对扩展开放,对修…

实战干货|自研数据存储迁移MySQL实战

背景 最近公司内部在做某自研数据存储的下线工作,这里我们暂且化名其为DistributeSQL,由于DistributeSQL不再进行服务支持,需要迁移项目中使用到该存储到其他数据存储中。 本篇来聊聊这次在数据存储迁移过程中的方案设计思路、实现的大致细节…