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

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...