当前位置: 首页 > 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-…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

Ubuntu系统多网卡多相机IP设置方法

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