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

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长度)常用函数&#xff1a; b.any() 判断b中是否存在值为1的二进制位 b.none() 判断b中是否不存在值为1的二…...

GLog开源库使用

Glog地址&#xff1a;https://github.com/google/glog 官方文档&#xff1a;http://google-glog.googlecode.com/svn/trunk/doc/glog.html 1.利用CMake进行编译&#xff0c;生成VS解决方案 &#xff08;1&#xff09;在glog-master文件夹内新建一个build文件夹&#xff0c;用…...

微信小程序如何实现点击上传图片功能

如下所示,实际需求中常常存在需要点击上传图片的功能,上传前显示边框表面图片显示大小,上传后将图形缩放到边框大小。 实现如下: .wxml <view class="{{img_src==?blank-area:}}" style="width:100%;height:40%;display:flex;align-items: center;jus…...

Windows Qt C++ VTK 绘制三维曲线

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

Android T 远程动画显示流程(更新中)

序 本地动画和远程动画区别是什么? 本地动画&#xff1a;自给自足。对自身SurfaceControl矢量动画进行控制。 远程动画&#xff1a;拿来吧你&#xff01;一个app A对另一个app B通过binder跨进程通信&#xff0c;控制app B的SurfaceControl矢量动画。 无论是本地动画还是远程…...

【计算机网络】【练习题及解答】【新加坡南洋理工大学】【Computer Control Network】

说明&#xff1a; 仅供学习使用。 一、题目描述 题目共4问&#xff0c;描述网络通信中的 帧传输时延&#xff08;Frame Delay&#xff09;、传播时延&#xff08;Propagation Delay&#xff09;&#xff0c;以及 链接利用率&#xff08;Link Utilization&#xff09; 的相关…...

云计算HCIE备考经验分享

大家好&#xff0c;我是来自深圳信息职业技术学院22级鲲鹏3-1班的刘同学&#xff0c;在2023年9月19日成功通过了华为云计算HCIE认证&#xff0c;并且取得了A的成绩。下面把我的考证经验分享给大家。 转专业进鲲鹏班考HCIE 大一上学期的时候&#xff0c;在上Linux课程的时候&…...

Threejs API——`OrbitControls`相机控件

文章目录 API用法API OrbitControls 相机控制用法 导入import {OrbitControls } from three/examples/jsm/controls/OrbitControls.js import {DRACOLoader,AmbientLight,Color,MOUSE,...

远程教育:低代码在教育技术领域的重塑之力

新冠肺炎大流行对世界各地的行业产生了影响&#xff0c;其中一些行业的影响远远超过其他行业。食品、零售、供应链、娱乐和航空业是受影响最大的行业&#xff0c;为确保不间断运营&#xff0c;这引发了一场数字革命。相信&#xff0c;这种数字化的采用将长期保持下去&#xff0…...

vue 模板语法值class操作

class.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>class</title><!-- 确保引入正确的Vue版本库&#xff0c;下面只是示例&#xff0c;需要替换为实际可工作的CDN地址 --><sc…...

MySQL的原生API实现插入数据后在可视化工具上不显示的问题解决

显示表中有两行数据&#xff0c;该表也设置了主键和唯一索引 点进表里看却没有数据 问题原因出现在这里&#xff0c;虽然很多常用的数据库连接池都会开启自动提交&#xff0c;但ibatis的SqlSession使用sessionFactory.openSession()创建时&#xff0c;默认的自动提交是false&am…...

Blender教程(基础)-内插面、分离、环切、倒角-08

一、内插面 菜单位置如下图位置。 单击需要处理的面&#xff0c;出现一个黄色的圈。 1、菜单选中内插 鼠标悬停在黄色圈内单击左键可以来回实现内插&#xff0c;但是发现并不好操作。 2、快捷键内插 在选中需要操作的面之后&#xff0c;鼠标移动到外面&#xff0c;键盘在英…...

Unity 自动轮播、滑动轮播

如图所示&#xff0c;可设置轮播间隔&#xff0c;可左右滑动进行轮播 1.在UGUI创建个Image&#xff0c;添加自动水平组件 2.添加并配置脚本 3.代码如下&#xff0c;都有注释 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-…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前&#xff0c;首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例&#xff0c;用_OBJECT_TYPE这个结构来解析它&#xff0c;0x80处就是今天要介绍的回调链表&#xff0c;但是先不着急&#xff0c;先把目光…...