Linux——文本编辑器Vim
Linux中的所有内容以文件形式管理,在命令行下更改文件内容,常常会用到文本编辑器。我们首选的文本编辑器是Vim,它是一个基于文本界面的编辑工具,使用简单且功能强大,更重要的是,Vim是所有Linux发行版本的默认文本编辑器。
很多UNIX和Linux的老用户习惯称呼它为Vi, Vi是Vim的早期版本,现在我们使用的Vim(Vi improved)是Vi的增强版,增加了一些正则表达式的查找、多窗口的编辑等功能,使得Vim对于程序开发来说更加方便。想了解Vi和Vim的区别,可以在Vim命令模式下输入“:help vi_diff”,就能够看到两者区别的摘要。
值得一提的是,Vim是慈善软件,如有赞助或评比得奖,所得钱财将用于救助乌干达孤儿。软件使用是免费的,使用者是否捐款赞助当然不会勉强。
1、Vim的工作模式
在使用Vim编辑文件前,我们先来了解一下它的三种工作模式:命令模式、输入模式和编辑模式,如下图所示:
1.1、命令模式
使用Vim编辑文件时,默认处于命令模式。在此模式下,可以使用上、下、左、右键或者k、j、h、l命令进行光标移动,还可以对文件内容进行复制、粘贴、替换、删除等操作。
1.2、输入模式
在输入模式下可以对文件执行写操作,类似在Windows的文档中输入内容。进入输入模式的方法是输入i、a、o等插入命令,编写完成后按Esc键即可返回命令模式。
1.3、编辑模式
如果要保存、查找或者替换一些内容等,就需要进入编辑模式。编辑模式的进入方法为:在命令模式下按“:”键,Vim窗口的左下方会出现一个“:”符号,这时就可以输入相关的指令进行操作了。指令执行后会自动返回命令模式。
对于新手来说,经常不知道自己处于什么模式。不论是自己忘了,还是不小心切换了模式,都可以直接按一次Esc键返回命令模式。如果你多按几次Esc键后听到了“嘀——”的声音,则代表你已经处于命令模式了。
2、进入Vim
了解了Vim的工作模式后,就可以愉快地使用Vim进行文件编辑了。先来看一下Vim打开文件的方法。
2.1、使用Vim打开文件
使用Vim打开文件很简单,例如,明哥想打开一个自己编写的文件/test/vi.test,打开方法如下:
[root@itxdl ~] vim /test/vi.test
刚打开文件时进入的是命令模式,此时文件的下方会显示文件的一些信息,包括文件名、文件的总行数和字符数,以及当前光标所在的位置等,此时可以使用插入命令进入输入模式对文件进行编辑,如下图所示:
2.2、直接进入指定位置
如果想直接进入Vim编辑文件的指定行数处或者特定字符串所在行,节省编辑时间,例如,打开/tmp/passwd.vi文件时直接进入第20行,则可以这样操作:
[root@itxdl ~] vim +20 /tmp/passwd.vi
打开文件后,直接进入“nobody”字符串所在行,则可以这样操作:
[root@itxdl ~]# vim +/nobody /tmp/passwd.vi
如果文件中有多个“nobody”字符串,则会以查到的第一个为准。
3、Vim的基本应用
打开文件后,接下来开始对文件进行编辑。Vim虽然是一个基于文本模式的编辑器,但却提供了丰富的编辑功能。对于习惯使用图形界面的朋友来说,刚开始会较难适应,但是熟练后就会发现,使用Vim进行编辑实际上更加快速。
3.1、插入命令
从命令模式进入输入模式进行编辑,可以按下I、i、O、o、A、a等键来完成,不同的键只是光标所处的位置不同而已。当进入输入模式后,你会发现,在Vim编辑窗口的左下角会出现“INSERT”标志,这就代表我们可以执行写入操作了,如图下图所示:
常用的插入命令:
i ——在当前光标所在位置插入随后输入的文本,光标后的文本相应向右移动I ——在光标所在行的行首插入随后输入的文本,行首是该行的第一个非空白字符,相当于光标移动到行首再执行i命令a ——在当前光标所在位置之后插入随后输入的文本A ——在光标所在行的行尾插入随后输入的文本,相当于光标移动到行尾再执行a命令o ——在光标所在行的下面插入新的一行。光标停在空行的行首,等待输入文本O ——在光标所在行的上面插入新的一行。光标停在空行的行首,等待输入文本
注意:在Linux纯字符界面中,默认是不支持中文输入的。如果想要输入中文,则有三种方法:
(1)安装中文语言支持和图形界面,在图形界面下输入中文,使用gVim(Vim的图形前端)。
(2)安装中文语言支持,使用远程连接工具(如PuTTY),在远程连接工具中调整中文编码,进行中文输入。
(3)倘若非要在Linux纯字符界面中输入中文,则可以安装中文插件,如zhcon。
3.2、光标移动命令
在进行编辑工作之前,需要将光标移动到适当的位置。Vim提供了大量的光标移动命令,注意这些命令需要在命令模式下执行。下面介绍一些常用的光标移动命令。
3.2.1、以字符为单位移动
上、下、左、右方向键 ——移动光标
习惯使用鼠标的用户可能很自然地想到用光标来进行编辑定位,但是你会发现鼠标不会给你任何反应。在 Vim中进行定位需要通过上、下、左、右方向键,并且无论是命令模式还是输入模式,都可以通过方向键来移动光标(在编辑模式中,方向键是用来查看命令历史记录的)。
H、j、k、l ——移动光标
外,还可以在命令模式中使用h、j、k、l 4个字符控制方向,分别表示向左、向下、向上、向左。在大量编辑文档时,会频繁地移动光标,这时使用方向键可能会比较浪费时间,使用这4个键就很方便快捷。当然,这同样是一件熟能生巧的事情。
3.3、使用Vim进行编辑
光标移动到指定位置后,如何进行编辑操作呢?Vim提供了大量的编辑命令,下面介绍其中一些常用的命令。
3.3.1、查找指定字符串
/要查找的字符串 ——从光标所在行开始向下查找所需的字符串?要查找的字符串 ——从光标所在行开始向上查找所需的字符串:set ic ——查找时忽略大小写
一个字符串可以是一个或者多个字母的集合。如果想在Vim中查找字符串,则需要在命令模式下进行。在Vim命令模式中输入“/要查找的字符串”,再按一下回车键,就可以从光标所在行开始向下查找指定的字符串。如果要向上查找,则只需输入“?要查找的字符串”即可。例如,在/etc/passwd.vi文件中查找字符串“root”,则运行命令如下图所示:
如果匹配的字符串有多个,则可以按“n”键向下继续匹配查找,按“N”键向上继续匹配查找。如果在文件中并没有找到所要查找的字符串,则在文件底部会出现“Pattern not found”提示,如下图所示:
在查找过程中需要注意的是,要查找的字符串是严格区分大小写的,如查找“shenchao”和“ShenChao”会得到不同的结果。如果想忽略大小写,则输入命令“:set ic”;调整回来输入“:set noic”。如果在字符串中出现特殊符号,则需要加上转义字符“\”。常见的特殊符号有\、*、?、^、 等。如果出现这些字符,例如,要查找字符串“ 10 等。如果出现这些字符,例如,要查找字符串“10 等。如果出现这些字符,例如,要查找字符串“10”,则需要在命令模式中输入“/10$”。
还可以查找指定的行。例如,要查找一个以root为行首的行,则可以进行如下操作:
/^root
要查找一个以root为行尾的行,则可以进行如下操作:
/root$
3.3.2、使用Vim进行替换
r ——替换光标所在处的字符R ——从光标所在处开始替换字符,按Esc键结束
小写“r”可以替换光标所在处的某个字符,将光标移动到想替换的单个字符处,按下“r”键,然后直接输入替换的字符即可;大写“R”可以从光标所在处开始替换字符,输入会覆盖后面的文本内容,直到按Esc键结束替换。
3.3.3、使用Vim进行删除、粘贴、复制
x ——删除光标所在字符nx ——从光标所在位置向后删除n个字符,n为数字dd ——删除整行。如果之后粘贴,则此命令的作用是剪切ndd ——删除多行dG ——删除从光标所在行到文件末尾的内容D ——删除从光标所在处到这行行尾的内容:起始行,终止行d ——删除指定范围的行yy或Y ——复制单行nyy或nY ——复制多行p ——粘贴到当前光标所在行下P ——粘贴到当前光标所在行上
如果处于命令模式下,则可以按下“x”键来删除光标所在位置的单个字符;快速按两下“d”键来进行整行删除;如果想要删除连续多行,例如,想要删除10行,则可以按下“10dd”,可以快速删除当前光标所在行下10行。
此时被删除的内容并没有真正删除,都临时放在了内存中。将光标移动到指定位置处,按下“p”键,就可以将刚才删除的内容又粘贴到此处。在软件开发中可能需要将连续两行进行互换,就可以先将上面的一行通过“dd”键删除,再将光标移动到下面,通过“p”键将其重新粘贴,这样就能够达到两行互相交换位置的目的。
有时候可能需要把两行进行连接。如在下面的文件中有两行,现在需要使其成为一行,实际上就是将两行间的换行符去掉。可以直接在命令模式中按下“J”键,按下前后分别如下图所示:
3.3.4、使用Vim撤销上一步操作
u ——撤销
如果不小心误删除了文件内容,则可以通过“u”键来撤销刚才执行的命令。如果要撤销刚才的多次操作,则可以多按几次“u”键。
3.4、保存退出命令
Vim的保存和退出是在命令模式中进行的,为了方便记忆,只需要记住w、q、!三个符号的含义即可完成保存任务。
字母“w” ——保存不退出字母“q” ——不保存退出字符“!” ——强制性操作
例如,在命令模式中只输入“w”字母就意味着保存但不退出;如果输入“wq”就意味着保存并且退出;如果输入“w!”或“wq!”就意味着强制保存或强制保存退出,这种情况经常发生在对一个文件没有写权限的时候(显示readonly,如下图所示),但如果你是文件的所有者或者root用户,就可以强制执行。
其他用法,如“q!”表示不保存退出;保留源文件,而另存为其他的文件,可以用“w新文件名”,如“w /tmp/shadow.vi”。
在命令模式中,还可以输入“ZZ”命令退出,按两次“Shift+Z”快捷键比较方便,强烈推荐。此时如果对文件没有修改,就是不保存退出;如果对文件已经进行了一些修改,就是保存后退出。
相关文章:

Linux——文本编辑器Vim
Linux中的所有内容以文件形式管理,在命令行下更改文件内容,常常会用到文本编辑器。我们首选的文本编辑器是Vim,它是一个基于文本界面的编辑工具,使用简单且功能强大,更重要的是,Vim是所有Linux发行版本的默…...

以“美”为鉴,探寻香港比特币现货ETF的未来发展
出品|欧科云链研究院 作者|Hedy Bi 根据The Block于1月29日的报道,嘉实国际成为了首家向香港证监会提交比特币现货ETF申请的机构。早在去年12月22日,香港证监会发布了《有关证监会认可基金投资虚拟资产的通函》,明确…...
Unity项目打包的方法(之一)
在 Unity 中,将项目打包成 .unitypackage 文件和直接压缩 Assets、Packages 和 ProjectSettings 目录有几个关键区别,主要体现在打包方式、使用目的和包含的内容上。 打包成 UnityPackage .unitypackage 是 Unity 的一种打包格式,它允许你将项…...

如何安装MySQL
如何安装MySQL 前提条件下载MySQL在 Windows 上安装 MySQL验证 MySQL 安装 MySQL是当今工业界广泛使用的最流行的关系数据库管理软件之一。它通过各种存储引擎提供多用户访问支持。它得到了甲骨文公司的支持。在本节中,我们将学习如何为初学者下载和安装 MySQL。 前…...
如何编写.gitignore文件
文章目录 前端架构师教你如何编写.gitignore文件.gitignore文件简介.gitignore文件的语法规则.gitignore文件的最佳实践常见问题与解决 前端架构师教你如何编写.gitignore文件 .gitignore文件简介 .gitignore文件是Git版本控制系统中一个非常有用的工具。它可以指定一组文件或…...

U-Boot学习(7):内核启动之bootz启动zImage源码分析
在上一节中,我们分析了U-BOOT初始化的流程,最后就是进入U-Boot的命令行中执行了,如果用户没有任何操作,则经过固定延时后将执行默认的bootcmd环境变量里的指令,那这里面肯定就是启动内核了。在U-BOOT简介及命令行指令详…...
[GN] DP学习笔记板子
文章目录 Bitset滚动数组多重背包区间DP树形dp状压dp模拟退火 Bitset 使用bitset需要引用<bitset>头文件。 其声明方法为: std::bitset<N>s; (N为s长度)常用函数: b.any() 判断b中是否存在值为1的二进制位 b.none() 判断b中是否不存在值为1的二…...

GLog开源库使用
Glog地址:https://github.com/google/glog 官方文档:http://google-glog.googlecode.com/svn/trunk/doc/glog.html 1.利用CMake进行编译,生成VS解决方案 (1)在glog-master文件夹内新建一个build文件夹,用…...
微信小程序如何实现点击上传图片功能
如下所示,实际需求中常常存在需要点击上传图片的功能,上传前显示边框表面图片显示大小,上传后将图形缩放到边框大小。 实现如下: .wxml <view class="{{img_src==?blank-area:}}" style="width:100%;height:40%;display:flex;align-items: center;jus…...

Windows Qt C++ VTK 绘制三维曲线
Qt 自带数据可视化从文档上看,只能实现三维曲面。 QwtPlot3D在Qt6.6.0上没编译通过。 QCustomPlot 只能搞二维。 VTK~搞起。抄官网demo。 后续需求: 1、对数轴 2、Y轴逆序 3、Z轴值给色带,类似等高线图的色带 期待各位大佬多多指导。…...

Android T 远程动画显示流程(更新中)
序 本地动画和远程动画区别是什么? 本地动画:自给自足。对自身SurfaceControl矢量动画进行控制。 远程动画:拿来吧你!一个app A对另一个app B通过binder跨进程通信,控制app B的SurfaceControl矢量动画。 无论是本地动画还是远程…...

【计算机网络】【练习题及解答】【新加坡南洋理工大学】【Computer Control Network】
说明: 仅供学习使用。 一、题目描述 题目共4问,描述网络通信中的 帧传输时延(Frame Delay)、传播时延(Propagation Delay),以及 链接利用率(Link Utilization) 的相关…...

云计算HCIE备考经验分享
大家好,我是来自深圳信息职业技术学院22级鲲鹏3-1班的刘同学,在2023年9月19日成功通过了华为云计算HCIE认证,并且取得了A的成绩。下面把我的考证经验分享给大家。 转专业进鲲鹏班考HCIE 大一上学期的时候,在上Linux课程的时候&…...
Threejs API——`OrbitControls`相机控件
文章目录 API用法API OrbitControls 相机控制用法 导入import {OrbitControls } from three/examples/jsm/controls/OrbitControls.js import {DRACOLoader,AmbientLight,Color,MOUSE,...

远程教育:低代码在教育技术领域的重塑之力
新冠肺炎大流行对世界各地的行业产生了影响,其中一些行业的影响远远超过其他行业。食品、零售、供应链、娱乐和航空业是受影响最大的行业,为确保不间断运营,这引发了一场数字革命。相信,这种数字化的采用将长期保持下去࿰…...
vue 模板语法值class操作
class.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>class</title><!-- 确保引入正确的Vue版本库,下面只是示例,需要替换为实际可工作的CDN地址 --><sc…...

MySQL的原生API实现插入数据后在可视化工具上不显示的问题解决
显示表中有两行数据,该表也设置了主键和唯一索引 点进表里看却没有数据 问题原因出现在这里,虽然很多常用的数据库连接池都会开启自动提交,但ibatis的SqlSession使用sessionFactory.openSession()创建时,默认的自动提交是false&am…...

Blender教程(基础)-内插面、分离、环切、倒角-08
一、内插面 菜单位置如下图位置。 单击需要处理的面,出现一个黄色的圈。 1、菜单选中内插 鼠标悬停在黄色圈内单击左键可以来回实现内插,但是发现并不好操作。 2、快捷键内插 在选中需要操作的面之后,鼠标移动到外面,键盘在英…...

Unity 自动轮播、滑动轮播
如图所示,可设置轮播间隔,可左右滑动进行轮播 1.在UGUI创建个Image,添加自动水平组件 2.添加并配置脚本 3.代码如下,都有注释 using UnityEngine; using UnityEngine.UI;public class IndicatorManager : MonoBehaviour {public …...

纯html+js+css个人博客
首页 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8"><title>主页</title><!-- 引入layui css文件 --><link rel"stylesheet" href"layui-…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...