使用 VIM 编辑器对文件进行编辑
一、VIM 的两种状态
VIM(vimsual)是 Linux/UNIX 系列 OS 中通用的全屏编辑器。vim 分为两种状态,即命令状态和编辑状态,在命令状态下,所键入的字符系统均作命令来处理;而编辑状态则是用来编辑文本资料(类似 word)。
当进入 vim 时,会首先进入命令状态。在命令状态下,输入 i(插入)或 a(添加)可以进入编辑状态(左下角有 - - INSERT - -,或者 - - 插入 - - 代表处于编辑状态);在编辑状态下,按 Esc 键进入命令状态。
在命令状态下,有如下一些常用命令:
-
新增:
a :从光标后面开始添加文本
A :从光标所在行的末尾开始添加文本 -
插入:
i :从光标前面开始插入文本
I :从光标所在行的开始处插入文本
注意
当需要编辑一个名为 file 的文件时,输入 vim file 命令并进入编辑状态时,出现 “- - 插入 - - W10:警告:正在修改一个只读文件” ,该如何处理?
① 查看 file 文件的权限:ls -l ,发现没有写权限
② 进入 root 用户,给 file 文件添加写权限:su and chmod a+w file ,此时再执行 ls -l 命令,可以发现 file 文件有了写权限
此时再 vim file 并编辑,就不会出现上述问题了。

二、VIM 的常用命令操作(类似快捷键)
以下操作均在 “命令状态” 下进行
1. 删除与修改
1)删除
-
x :删除光标处的字符
-
dd :删除光标所在的整行
-
[n]dd :删除光标所在行以及下面的 n-1 行(删除 n 行)
-
D :删除光标到行尾的文本,常用语删除注释语句(d$)
2)修改
-
yy :复制光标所在的整行
-
[n]yy :从光标开始往下复制 n 行,[n] 表示一个整数
-
p :将复制后的文本粘贴到光标所在的下一行
-
u :撤销上次操作
-
Ctrl r :恢复上次操作
-
快捷修改单个字母: 先按 r 键,再输入要替换的内容
2. 光标移动
-
^ :光标移动到行首
-
$ :光标移动到行尾
-
gg :光标定位到文档头
-
G :光标定位到文档尾
-
[n]G :光标定位到第 n 行行首,[n] 表示一个整数,比如 20G
也可以通过冒号 + 数字来定位到第几行,比如 :20
较不常用:
-
H :光标定位到当前页首
-
L :光标定位到当前页的最后一行的行首
-
w :光标往后移一个字 / 单词
-
b :光标往前移一个字 / 单词
3. 查找与替换
1)查找
/[str] :用来查找字符串 str ,[str] 表示要查找的字符串。回车后会加亮显示所有找到的字符串,输入 n 移动到下一个找到的字符串,输入 Ctrl n(即 N)移动到上一个找到的字符串。
例如:vim ~/.bashrc ,然后输入 /alias ,输入 n 向下翻,输入 N 向上翻。
2)替换
部分替换
: s/[src]/[dst](只能替换光标所在的行)
例如:若要将光标所在行的 hello little dog 替换成 hello little cat ,则输入 : s/dog/cat
-
/i :忽略大小写
-
/g :全部匹配
例如:若要将 1-6 行的 hello 或 Hello 替换成 good ,则输入 :1,6 s/hello/good/ig
全部替换
:%s/[src]/[dst]/g :将文档中所有 src 的字符串替换为 dst 字符串
例如:若要将文档中所有的 hello 替换成 good ,则输入 :%s/hello/good/g
:%s/^ //g :将文档每一行的行首的空格去掉,想去掉几个空格,就在 ^ 与 // 之间打几个空格。
4. 块操作
v :可视化块选择状态,页面底部会出现 “- - 可视 - -” 的字样,选中块之后,可以对块进行删除(d),复制(y),剪切(x)
Ctrl + v :竖向选择模式,页面底部会出现 “- - 可视 块 - -” 的字样
1)批量删除
假设你想删除多行文本开头的字符,可以按以下步骤操作:
-
将光标放在要删除的字符上,按下 Ctrl + v 进入块模式。
-
移动光标选择要操作的行。
-
按下 d 键删除选中的字符
2)批量插入
如果你想在多行文本的开头插入相同的内容,可以按以下步骤操作:
-
按下 Ctrl + v 进入块模式,选择要操作的行。
-
按下大写 I 键(即 Shift + i),进入插入模式。
-
输入你想要插入的内容,例如批量注释代码就输入 “//” 。
-
按下 Esc 键退出插入模式,插入的内容会应用到所有选中的行
3)块内替换
Vim 还支持在块内进行替换操作。例如,你可以使用 %V 进行块内替换:
-
按下 Ctrl + v 选择要替换的块。
-
按下 : 进入命令模式。
-
输入 s/%V[旧文本]/[新文本]/g,然后按下回车键
4)块复制和粘贴
你可以使用块模式复制和粘贴文本:
-
按下 Ctrl + v 选择要复制的块。
-
按下 y 键复制选中的内容。
-
移动光标到目标位置,按下 p 键粘贴内容
5)块删除和剪切
块删除和剪切操作类似:
-
按下 Ctrl + v 选择要删除或剪切的块。
-
按下 d 键删除选中的内容,或按下 x 键剪切选中的内容
6)块覆盖
块覆盖指的是在一个地方通过块复制或块剪切方式得到块的副本,然后在另一个地方再次块选择一个块的方位,按下 p 键,即可实现用块内容覆盖目标块。
5. 文档保存及退出
结束编辑,按 Esc 键进入命令状态。
-
:q :在未修改文档的情况下退出
-
:q! :放弃文档的修改,强行退出
-
:w :文档存盘
-
:wq or :x :文档存盘退出
需要注意:此时的键盘需要是英文的,冒号和感叹号必须是英文冒号和感叹号。
6. vim 的配置
放置 .vimrc 到 ~ 目录下:vim ~/.vimrc ,然后将下列指令放置在文件内:
set nu
set cursorline
set hlsearch
set tabstop=4
set fileencodings=utf-8,gbk,gb2312
-
set nu :显示行号
-
set cursorline :加一条横线
-
set hlsearch :搜索时高亮
-
set tabstop=4 :Tab 键是 4 个空格
-
set fileencodings=utf-8,gbk,gb2312 :设置编码
注意:用 vim 编辑文件时,使用的注释符号是一个双引号 " 。
7. 其他
1)Ctrl+s
如果在编辑过程中不小心按了 Ctrl+s ,vim 会处于僵死状态(被冻结),此时按 Ctrl+q 可以恢复。
2)Ctrl+z
在命令状态时,按了 Ctrl+z ,此时会出现如下所示的情况:

输入查看系统内所有进程的命令:ps -elf ,可以发现该进程虽然已经暂停,但仍占据内存空间

输入杀死进程的命令:kill -9 2823 ,然后再查看系统内所有进程:ps -elf ,可以发现进程已被杀死

若此时再输入命令:vim file1 ,会出现下图所示的情况:

可以选择恢复:按下 R 键,如果不想下次打开仍出现上述情况,则按下 D 键删除交换文件。
3)了解
-
在命令模式中输入 :help :查看该命令的帮助提示(不常用,通过 :q 进行退出)
-
在命令模式中输入 :%!xxd :进入十六进制模式
-
在命令模式中输入 :%!xxd -r :返回文本模式
-
在命令模式中输入 gg=G 可以自动对齐,可以通过输入 gg=10gg 只自动对齐第一行到第十行
-
增加一个横向的 vim :在命令模式下执行 :sp or :new [文件名] ;增加一个纵向的 vim :在命令模式下执行 :vsp or :vnew [文件名](按 Ctrl+w 切换光标的区域,按 :q 退出)
-
定位到 file 的第 3 行:执行 vim +3 file
-
定位到第一个 hello 处:执行 vim +/hello file

三、VIM 外使用到的命令
1. 管道查找替换程序 sed
举例:
1)将家目录下所有的 py 文件中的 function 替换成 case :find . -name “*.py” | xargs sed -i ‘s/function/case/g’
利用 find . -name “*.py” | xargs grep case 可以看出已经修改成功。

2)将 hello.py 中的 function 替换成 case 并重定向输出到 hello_new.py 中:sed ‘s/function/case/g’ hello.py > hello_new.py

2. vimdiff 命令
vimdiff 命令是 Vim 编辑器 的 diff 模式,用于比较和合并文件。它等同于 vim -d 命令,可以同时打开多个文件,并高亮显示文件中内容的差异部分。
1)启动 vimdiff
vimdiff hello.py hello_new.py or vim -d hello.py hello_new.py

这会在 Vim 编辑器中垂直分割窗口,分别显示两个文件,并用不同的背景色高亮显示差异部分。
2)光标移动
在 vimdiff 模式下,可以使用以下快捷键在差异点之间移动光标:
-
]c :跳转到下一个差异点
-
[c :跳转到上一个差异点
-
要在两个窗口之间切换光标,可以使用以下按键:
Ctrl-w l :切换到右侧窗口
Ctrl-w h :切换到左侧窗口
Ctrl-w w :在两个窗口间切换
3)内容合并
vimdiff 提供了方便的命令来合并文件内容:
-
dp(diff put):将当前差异点的内容覆盖到另一文件中的对应位置
-
do(diff obtain):将另一窗口中差异点的内容拉取到当前位置并进行替换
4)同时操作两个文件
在 vimdiff 模式下,可以使用 Vim 编辑器的命令和快捷键来操作文件:
-
:qa :退出所有文件
-
:wa :保存所有文件
-
:wqa :保存并退出所有文件
-
:qa! :强制退出(不保存)所有文件
相关文章:
使用 VIM 编辑器对文件进行编辑
一、VIM 的两种状态 VIM(vimsual)是 Linux/UNIX 系列 OS 中通用的全屏编辑器。vim 分为两种状态,即命令状态和编辑状态,在命令状态下,所键入的字符系统均作命令来处理;而编辑状态则是用来编辑文本资料&…...
visual studio 2022的windows驱动开发
在visual studio2022中,若在单个组件中找不到Windows Driver Kit (WDK)选项,可通过提升vs版本解决,在首次选择时选择WDM 创建好项目在Source Files文件夹中创建一个test.c文件,并输入以下测试代码: #include <ntdd…...
基于大数据的美团外卖数据可视化分析系统
【大数据】基于大数据的美团外卖数据可视化分析系统 (完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统通过对海量外卖数据的深度挖掘与分析,能够为美团外卖平台提供运营决策支…...
C/C++测试框架googletest使用示例
文章目录 文档编译安装示例参考文章 文档 https://github.com/google/googletest https://google.github.io/googletest/ 编译安装 googletest是cmake项目,可以用cmake指令编译 cmake -B build && cmake --build build将编译产物lib和include 两个文件夹…...
vue2打包部署到nginx,解决路由history模式下页面空白问题
项目使用的是vue2,脚手架vue-cli 4。 需求:之前项目路由使用的是hash,现在要求调整为history模式,但是整个过程非常坎坷,遇到了页面空白问题。现在就具体讲一下这个问题。 首先,直接讲路由模式由hash改为…...
如何将本地项目上传到Gitee的指定分支
在团队协作开发中,我们经常需要将本地项目代码上传到代码托管平台(如Gitee)的特定分支。本文将详细介绍从零开始完成这一过程的完整步骤,包含多种场景的解决方案和常见问题处理。 一、准备工作 1.1 安装Git 确保你的系统已安装…...
【数据结构】排序算法(中篇)·处理大数据的精妙
前引:在进入本篇文章之前,我们经常在使用某个应用时,会出现【商品名称、最受欢迎、购买量】等等这些榜单,这里面就运用了我们的排序算法,作为刚学习数据结构的初学者,小编为各位完善了以下几种排序算法&…...
AI随身翻译设备:从翻译工具到智能生活伴侣
文章目录 AI随身翻译设备的核心功能1. 实时翻译2. 翻译策略3. 翻译流程4. 输出格式 二、AI随身翻译设备的扩展功能1. 语言学习助手2. 旅行助手3. 商务助手4. 教育助手5. 健康助手6. 社交助手7. 技术助手8. 生活助手9. 娱乐助手10. 应急助手 三、总结四、未来发展趋势࿰…...
chromadb 安装和使用
简介 Chromadb 是一个开源的嵌入式向量数据库,专为现代人工智能和机器学习应用设计,旨在高效存储、检索和管理向量数据。以下是关于它的详细介绍: 核心特性 易于使用:提供了简洁直观的 API,即使是新手也能快速上手…...
【全球首发】DeepSeek谷歌版1.1.5 - 免费GPT-4级别AI工具
【全球首发】DeepSeek谷歌版1.1.5 - 免费GPT-4级别AI工具 资源简介 DeepSeek谷歌版1.1.5是目前全球领先的免费AI助手,性能超越国内主流AI产品,提供类似GPT-4的智能体验。 版本信息 最新版本:1.1.5(2024最新版)应用…...
LeetCode第132题_分割回文串II
LeetCode 第132题:分割回文串 II 题目描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。 返回符合要求的 最少分割次数 。 难度 困难 题目链接 点击在LeetCode中查看题目 示例 示例 1: 输入…...
LabVIEW 在故障诊断中的算法
在故障诊断领域,LabVIEW 凭借其强大的图形化编程能力、丰富多样的工具包以及卓越的功能性能,成为工程师们进行故障诊断系统开发的得力助手。通过运用各种算法,能够对采集到的信号进行全面、深入的分析处理,从而准确地诊断出系统中…...
SQL DB 数据类型
SQL DB 数据类型 引言 在数据库管理系统中,数据类型是定义和存储数据的方式。SQL(结构化查询语言)数据库中的数据类型决定了数据的存储格式、大小、取值范围以及如何处理数据。合理选择和使用数据类型对于确保数据库性能、数据完整性和应用程序的准确性至关重要。 SQL 数…...
Qt音频输出:QAudioOutput详解与示例
1. 简介 QAudioOutput是Qt多媒体框架中的一个关键类,它提供了将PCM(脉冲编码调制)原始音频数据发送到音频输出设备的接口。作为Qt多媒体组件的一部分,QAudioOutput允许开发者在应用程序中实现音频播放功能,支持多种音…...
springboot 启动方式 装配流程 自定义starter 文件加载顺序 常见设计模式
目录 springboot介绍 核心特性 快速搭建 Spring Boot 项目 方式一:使用 Spring Initializr 方式二:使用 IDE 插件 示例代码 1. 创建项目并添加依赖 2. 创建主应用类 3. 创建控制器类 4. 运行应用程序 配置文件 部署和监控 部署 监控 与其…...
Android学习之Material Components
以下是 Material Design 提供的核心控件列表(基于最新 Material Components for Android 库),按功能分类整理: 1. 基础按钮类 控件名称类名说明MaterialButtoncom.google.android.material.button.MaterialButton遵循 Material 规…...
sentinel新手入门安装和限流,热点的使用
1 sentinel入门 1.1下载sentinel控制台 🔗sentinel管理后台官方下载地址 下载完毕以后就会得到一个jar包 1.2启动sentinel 将jar包放到任意非中文目录,执行命令: java -jar 名字.jar如果要修改Sentinel的默认端口、账户、密码ÿ…...
Ubuntu 22 Linux上部署DeepSeek R1保姆式操作详解(Xinference方式)
一、安装步骤 1.基础环境安装 安装显卡驱动、cuda,根据自己硬件情况查找相应编号,本篇不介绍这部分内容,只给出参考指令,详情请读者自行查阅互联网其它参考资料。 sudo apt install nvidia-utils-565-server sudo apt install…...
ANTLR 实战_从零开始构建自定义语言解析器
1. 引言 1.1 什么是 ANTLR ANTLR(Another Tool for Language Recognition)是一个强大的解析器生成器,用于构建语言解析器、编译器和解释器。 1.2 ANTLR 的历史与发展 ANTLR 由 Terence Parr 创建,最初发布于 1995 年。经过多次版本更新,ANTLR 已成为构建解析器的首选工…...
CTF类题目复现总结-hashcat 1
一、题目地址 https://buuoj.cn/challenges#hashcat二、复现步骤 1、下载附件,解压得到What kind of document is this_文件; 2、用010 Editor打开What kind of document is this_文件,发现是office文件; 3、将后缀名改为ppt时…...
4月5日作业
需求: 1.按照图示的VLAN及IP地址需求,完成相关配置 2.要求SW 1为VLAN 2/3的主根及主网关 SW2为VLAN 20/30的主根及主网关,SW1和 SW2互为备份 3.可以使用super vlan 4.上层通过静态路由协议完成数据通信过程 5.AR1为企业出口路由器…...
Bert论文解析
文章目录 BERT:用于语言理解的深度双向转换器的预训练一、摘要三、BERT介绍BERT及其详细实现答疑:为什么没有标注的数据可以用来预训练模型?1. 掩码语言模型(Masked Language Model, MLM)2. 下一句预测(Nex…...
无招回归阿里
这两天,无招回归阿里的新闻被刷屏了。无招创业成立的两氢一氧公司无招的股份也被阿里收购,无招以这种姿态回归阿里,并且出任钉钉的 CEO。有人说,这是对 5 年前“云钉一体”战略的纠偏。现在确实从云优先到 AI 优先,但云…...
初探:简道云平台架构及原理
一、系统架构概述 简道云作为一款低代码开发平台,其架构设计以模块化和云端协同为核心,主要分为以下层次: 1. 前端层 可视化界面:基于Web的拖拽式表单设计器,支持动态渲染(React/Vue框架)。多…...
LeetCode 热题 100 堆
215. 数组中的第K个最大元素 给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 …...
面试常被问道OSPF的问题
面试中经常会涉及到OSPF相关的问题,作为网络工程师,我们对OSPF的了解可不能仅停留在“我知道它是路由协议”这么表面。 想面试官满意,拿到Offer,必须能回答得出细节,深度挖掘它的工作原理、配置技巧、以及应用场景。 …...
Redis(笔记)
简介: 常用数据类型: 常用操作命令: Redis的Java客户端: 操作字符串类型的数据: 操作Hash类型的数据: 操作列表类型的数据: 操作集合类型的数据: 操作有序集合类型数据: 通用命令…...
bootloader+APP中,有些APP引脚无法正常使用?
问:bootloaderAPP程序中,为什么有些APP引脚无法正常使用?无法设置高低电平 主控芯片GD32F415,参考案例bootloader中的引脚使用: 参考案例APP程序的引脚使用: 以及个人使用的无线模组,高电平使能…...
高并发内存池:原理、设计与多线程性能优化实践
高并发内存池是一种专门为多线程环境设计的内存管理机制,其核心目标是通过优化内存分配和释放过程,解决传统内存分配器(如malloc/free)在高并发场景下的性能瓶颈,显著提升多线程程序的内存访问效率。 目录 一、核心设计…...
基于内容的课程推荐网站的设计与实现00(SSM+htmlL)
基于内容的课程推荐网站的设计与实现(SSMhtml) 该系统是一个基于内容的课程推荐网站,旨在为用户提供个性化的课程推荐。系统包含多个模块,如教学视频、教学案例、课程信息、系统公告、个人中心和后台管理。用户可以通过首页访问不同的课程分类ÿ…...
