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

一文入门vim

先来波快问快答。

第一个问题,vim是什么?

vim就是一文本编辑器。

第二个问题,我们为什么要使用vim?

好像在终端中可选择使用的文本编辑器也不多(其他有,但是相对而言vim用的比较广泛)

第三个问题,我们应该如何学习使用vim?

去看官方文档。

Vim documentation : vim onlineicon-default.png?t=N7T8https://www.vim.org/docs.php英文不好的小伙伴可以看我。

虽然我也没有多牛,但是日常简单用用还是没问题哒~

那我们第一步要做的自然就是安装vim(有些Linux发行版自带vim,可以先看看有没有),下面我以Ubuntu为例安装一下vim。

其实跟安装别的东西一样,都是固定的套路,首先更新一下软件源(不一定非更新不可)。

sudo apt-get update

接着就是安装了。

sudo apt-get install vim

安装成功之后输入下面命令查看版本。

vim -v

和查看别的东西的版本不一样,查看vim的话会直接进入到这个vim里面来。

然后有些小伙伴可能就懵逼了,因为出不去了,安装上面说的按下q也不行。

因为这时候已经在vim里了,因此我们需要使用vim的指令才能出去。

现在先不管别的,跟着我的操作我们先出去再说。首先输入冒号,我们就可以看到光标直接跑到界面的最下面了,然后再输入q,回车就退出了。

当然,也有可能安装失败,出现下面这样的提示。

不要慌,我们执行下面命令 ,把vim-common依赖删除。

sudo apt purge vim-common

然后再安装vim就可以了,如果还不行的话,另请高明吧(因为我没遇过)。

安装完vim之后,那么我们如何进入vim呢?这个很简单,我们直接在命令行输入vim+文件路径就会自动使用vim打开编辑这个文件,这个文件可以不存在,如果不存在的话vim会帮我们创建,所以我基本不使用touch去创建文件,直接用vim就好了。

vim test.c
vim ../../test.c

接下来我们来了解一下vim的三种模式。

vim一共是三种模式(不同人可能有不同的叫法):正常模式,输入模式,命令模式。还有一个视图模式,但是我基本不咋用,这边就不介绍了。

我们一开始进入vim是出于正常模式的。当我们按下a / i / o / A / I / O 之后,就会进入到输入模式,在输入模式中我们可以对文本进行普通的编辑,按下esc键回到正常模式。

当我们按下冒号:之后,会从正常模式进入到命令模式,光标会自动移动到界面的最底下,输入命令之后按下回车执行,执行之后会回到正常模式,或者按下esc键也是会回到正常模式。

我们一个模式一个模式来,先来个最简单的输入模式。

输入模式其实没什么可说的,就跟我们在Windows下用记事本差不多,就是正常的写文件。需要说的是进入输入模式的命令,我们在正常模式下按下a / i / o / A / I / O 之后,就会进入到输入模式,但是进入的方式会有所不同。

如果是a,那么进入输入模式后,会从光标当前指向的字符的后一位进行输入。

如果是i,那么会从光标当前指向的字符的前一位进行输入。

如果是o,那么会在光标的下面新开一行然后进行输入。

A则是从光标所在行的末尾进行输入;I 是从光标所在行的开头进行输入;O是在光标的上面新开一行。

有上面六种进入输入模式的方法,但是我们常用的还是小写i,怎么进入输入模式的其实没有那么重要,这六种记着一种就行。

在输入模式中,我们使用 ctrl+u 可以删除当前行中光标左侧的内容(光标右侧不会删除)。

ctrl+w会删除当前光标所在的单词光标左侧的内容。

退出输入模式重回正常模式则按下Esc键,或者是ctrl+c / ctrl+[

在输入模式下,我们很有可能是敲代码的,那自然是少不了代码补全的,在vim中我们可以通过下载安装插件的方式来实现,但是这里就不细说了,直接说一个最简单的,在输入模式下直接ctrl+n可以给我们补全关键词。

输入模式还是很简单的,我们需要特别记忆的是在正常模式和命令模式下的操作。

先来正常模式,我们一进入vim就是出于正常模式的。正常模式也是用的最多的。

一般情况下我们移动光标的操作是在正常模式下进行的而不是输入模式。因此我们先来看看如何移动光标。

我们习惯于用上下左右键来移动,但是在vim中,我们可以用 h j k l 这四个键来代替上下左右键,这样可以减少我们的手指移动。

h对应的是左键;

j对应的是下键;

k对应的是上键;

l对应的是右键。

一开始我们可能会不适应,但是一旦适应之后,我们编写文件的效率就会大幅提升,因为我们的手几乎可以不移动,并且使用vim是可以不使用鼠标的!

除了上面最基础的上下左右键,我们vim还支持很多种移动方式。

比如说以单词为单位移动。

按下w,跳转到下一个单词的开头(以非空白符分隔的),W和w类似,但是单词是以空白符分隔的;

按下e,跳转到下一个单词的结尾(以非空白符分隔的),E是以空白符分隔的单词。

按下b,跳转到上一个单词的开头。

常用的还是w和b。

我们还可以按下0来跳转到本行的开头,按下$跳转到本行的结尾。

接下来就是一些大幅度跳转的按键了。

gg跳转至文件的开头。

G跳转至文件的结尾。

H跳转至屏幕的开头。

M跳转至屏幕的中间(如果文件内容没塞满整个屏幕,那么是跳转到文件内容的中间)。

L跳转至屏幕的结尾。

关于光标跳转我们知道上面这些就够了(其实上面这些已经不少了)。

接下来我们看看在vim里如何复制粘贴。

首先先说一下怎么撤回,以免大家去测试的时候把原本的内容给整没了(自己新建一个没用的文件去测试),当我们按下u的时候,就会执行撤回操作了。

复制的按键是y,粘贴的按键是p

粘贴玩不出花,但是y可以有不同的组合。

常用的有下面几种。

yy,复制当前一行,在yy之前加上数字,比如说10yy,则是复制当前往下十行内容。

yiw(yaw),复制当前所在的单词。

y+上下左右键,y+上复制当前行和上一行,y+下复制当前行和下一行,y+左复制光标所在字符的左边一个字符,y+右复制光标所在字符。

除了复制还有剪切。

剪切的d,然后和y是差不多的,dd剪切一行,diw(可以简写成dw)剪切当前单词(但是是从光标往右开始剪),daw则是剪切当前完整单词。

删除就是剪切了,其他就是x可以删除,但是x是删除一个字符(通过开头加上数字可以批量删除单个字符)。因此我们使用d删除的时候会把我们的“剪切板”覆盖,所以要注意复制和删除的顺序。

其实vim里用的不是剪切板,而是“寄存器”,默认情况下使用的是无名寄存器,在这种情况下,我们这个无名寄存器会存放我们最后复制(剪切)的内容。不过我们可以通过指定不同的“寄存器”来将复制和剪切的内容分开存放,甚至可以同时复制多个不同的内容。

我们只需要在执行复制(剪切)命令之前指定一下寄存器即可,指定的方式就是 “ +(a~z),比如说我依次按下下面几个按键(忽略下面的空格)。

" a 10 yy 

可以看到下面就有提示说10行复制到了“a中。

我们粘贴的时候也和复制的时候一样先指定寄存器即可。

如果我们要查看不同寄存器存放的内容,我们需要在命令模式下输入reg。进入命令模式就是打个冒号

顺带一提,我们默认使用的无名寄存器其实有名字,就是"" 不过默认情况我们都是可以忽略的。

除了a~z,还有一些别的,比如说"+就是系统剪切板,使用系统剪切板就可以在vim之外粘贴了。

除了上面的复制粘贴,我们还有个在小范围内效率更高的操作,那就是替换。

输入r,再加个字符,就可以把光标当前所在的字符替换掉,这比我们剪切一个字符再粘贴上去效率可高多了。

当然,替换的话只能替换一个字符,如果我们有多个字符需要改写,那么我们使用s,就会把当前光标所指的字符删除,并且进入输入模式,也就是说 s 等于 x+i (有点鸡肋哈)。

除了r,我们还有R,跟r相比,输入R之后,就会不断地替换字符,光标自动往后移动,按下Esc退出这个连续替换。

S就是把整行删除并进入输入模式,也就是说S 等于 dd+i (还是有点鸡肋哈)。

接下来是命令模式了,我们在正常模式下输入冒号即可进入。

在命令模式下输入q则是退出vim(很多小伙伴初次使用vim的时候连退出都不会就是因为我们要退出的话需要在命令模式下,而一开始进入vim是正常模式)

w是写入文件,也就是保存我们编写的内容。

可以连着用,wq就保存并退出。

如果再命令前面加个 ! 就是强制的意思,比如说 !wq就是强制保存并退出(最好不要强制,能正常使用命令咱就正常使用命令)。

说实话,我平时常用的就上面俩命令了,不过我们还是介绍一下其他的命令叭。

我们可以对文件进行搜索,输入 / 加上我们要查找的内容即可搜素我们光标之前的符合搜索条件的内容。?则是向后搜素。

搜索完之后光标会跳转到第一个搜索结果上,然后我们按下n则会跳转到下一个搜索结果,N则是跳转到上一个。

除了这个查找,我们还可以替换,替换的命令比较麻烦,我这边直接以下面一个例子来讲解。

0,10 s/hello/world/g

前面的0,10表示我们替换的范围是0~10行,接着是一个空格(可以不加),可以用%表示整个文件。

s是固定写法,意思是substitute替换。

接着hello是被替换的内容(可以是正则表达式),而world是要替换上去的内容。

最后一个g是全局范围内执行(这个不和最开始指定范围冲突)。除了g之外还有n(不真的替换,但是会显示出如果替换的话会换掉多少),c(每次替换前需要确认)

查找替换就是上面这些了,什么什么?你说你不确定范围是几行到几行?我们可以设置显示行号来更方便我们看清楚。

set number

这样就会显示出行号了,但是这样我们下次打开文件又是没有显示行号的,如果我们需要这个功能一直存在,我们可以把想实现的功能的命令写到配置文件中,这个后面再说。

接下来我们来尝试用vim同时打开多个文件。

命令是e,只需要在e后面加上空格和要打开的文件名,vim就会打开对应的文件,这有点像我们浏览器的标签页一样。

要查看我们现在打开了多少文件,只需要输入命令ls就可以查看啦(不要和Linux的ls弄混了,虽然功能差不多)。

每个文件前面有从1开始的标号,如果我们要转到别的文件,我们就输入命令b,后面跟上要跳转的文件的标号即可,或者直接b加上文件名。

可能有小伙伴会觉得这样跳来跳去好麻烦,那我们还可以使用分屏的功能。

使用vs + 文件名,会将屏幕垂直分割,另一边打开的是另一个文件,如果不加文件名,那么就是将当前的文件再开一格。

如果我们要跳转我们的光标到别的文件,那么我们可以ctrl+w 然后再跟上上下左右键(hjkl)对光标进行文件间的移动。

以上就足够大家入门vim啦,也足够大家日常使用了,接下来就是一些提升我们编辑体验的命令了。我们把这些命令写入vim的配置文件中,这样我们每次打开vim,都会去自动读取我们的配置,这样就不用每次打开vim都手动输入那些命令了。

首先vim的配置文件就在我们当前用户目录下。名字叫.vimrc,算是隐藏文件,直接ls是看不到的,我们使用 ll 就能看到了,但是也有可能没有,没有的话我们就直接创建一个就好了。

 vim ~/.vimrc 

我们写在这个配置文件中的都是我们在命令模式下的命令。在配置文件中 “后的是注释

下面就介绍几个常用的配置。

显示行号。

set number

语法高亮

syntax on

搜索忽略大小写

set ignorecase

搜索的时候结果高亮。

set hlsearch

去掉输入错误的提示声音

set noeb

Tab键的宽度

set tabstop=4

不要用空格代替制表符(取消no就是用空格代替)

set noexpandtab

编码设置

set enc=utf-8

这边只是简单地跨进vim的门槛,更详细的内容还是需要大家去查官方文档的,当然更重要的是实战,只是看是学不会vim的哦。

相关文章:

一文入门vim

先来波快问快答。 第一个问题,vim是什么? vim就是一文本编辑器。 第二个问题,我们为什么要使用vim? 好像在终端中可选择使用的文本编辑器也不多(其他有,但是相对而言vim用的比较广泛) 第三…...

植物ATAC-seq文献集锦(三)——果实发育篇

ATAC-seq在植物研究领域的应用我们已经介绍2期了,本期我们聚焦ATAC-seq技术在果实发育方向的应用案例。 植物ATAC-seq文献集锦(一)——基因组篇 植物ATAC-seq文献集锦(二)——生长发育篇 文献一:Ident…...

在自己的电脑上搭建我的世界Java版服务器

很多朋友,喜欢玩Minecraft,也希望搭建一个服务器,用于和小伙伴联机; 并且,拥有服务器后,即使所有玩家都下线,“世界”依旧在运行,玩家可以随时参与其中,说不定一上线&am…...

1.PyQt6库和工具库QTDesigner安装

1.安装PyQT6和pyqt6-tools 1. PyQt6库是PyQt的开发库 2.pyqt6-tool时QTDesigner设计器工具支持库 pip install PyQt6 pip install pyqt6-tools 2.在Pycharm中配置外部工具QTDesigner和PYGIC 配置外部工具QTDesigner 1. QTDesigner是QT界面设计器 2.打开Pycharm->Settin…...

Hbase搭建教程

Hbase搭建教程 期待您的关注 ☀小白的Hbase学习笔记 目录 Hbase搭建教程 1.上传hbase的jar包并解压 2.重新登录 3.启动zookeeper 4.配置环境变量 5.关闭ZK的默认配置 6.修改hbase-site.xml文件 7.修改regionservers文件 8.将配置好的文件分发给其它节点 9.配置环境变量…...

利用three-csg-ts对做物体交互式挖洞

默认物体均为居中,如果指定位置没有发生偏移,可能是因为在执行布尔操作之前没有正确设置变换。确保在进行布尔运算之前应用所有必要的变换。以下是经过修正的完整代码示例,它会确保圆柱正确旋转并与盒子进行 CSG 操作。 安装依赖 首先&…...

腾讯云对象存储不绑定自定义备案域名不给下载应该如何处理?

从2024年1月1日起,腾讯云对象存储(COS)将实施新政策:新创建的存储桶不再支持使用path-style域名(即存储桶绝对路径)。此外,使用默认域名访问的新存储桶将不再支持任意类型文件的预览&#xff0c…...

C 语言实例 - 输出数组

使用 for 循环输出数组 #include <stdio.h>int main() {int array[10] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};int loop;for(loop 0; loop < 10; loop)printf("%d ", array[loop]);return 0; }输出结果为&#xff1a; 1 2 3 4 5 6 7 8 9 0使用 for 循环逆向输…...

回溯算法练习题(2024/6/10)

1组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2&#xff1a; 输入&#xff1a;n …...

机器学习--线性模型和非线性模型的区别?哪些模型是线性模型,哪些模型是非线性模型?

文章目录 引言线性模型和非线性模型的区别线性模型非线性模型 总结线性模型非线性模型 引言 在机器学习和统计学领域&#xff0c;模型的选择直接影响到预测的准确性和计算的效率。根据输入特征与输出变量之间关系的复杂程度&#xff0c;模型可以分为线性模型和非线性模型。线性…...

[linux] Qwen2Tokenizer报错 transformers版本问题

上午没问题&#xff0c;下午pull了新代码&#xff0c;就有了报错。。 发现是transformers版本问题。但。。其实我都默认安的是最新版本。。 也许这就是人生吧。。 报错&#xff1a; File "/Pai-Megatron-Patch/megatron_patch/tokenizer/__init__.py", line 213…...

算法刷题笔记 单链表(C++实现)

文章目录 题目描述基本思路实现代码 题目描述 实现一个单链表&#xff0c;链表初始为空&#xff0c;支持三种操作&#xff1a; 向链表头插入一个数&#xff1b;删除第 k个插入的数后面的一个数&#xff1b;在第 k个插入的数后插入一个数。 现在要对该链表进行M次操作&#x…...

Oracle 排查慢SQL

Oracle 排查慢SQL select * from v s q l a r e a w h e r e r o w n u m < 10 ; s e l e c t ∗ f r o m v sqlarea where rownum<10; select * from v sqlareawhererownum<10;select∗fromvsql where rownum<10; select * from dba_hist_sqltext where rownum<…...

java技术专家面试指南80问【java学习+面试宝典】(七)

Dubbo需要 Web 容器吗&#xff1f; 不需要&#xff0c;如果硬要用 Web 容器&#xff0c;只会增加复杂性&#xff0c;也浪费资源。 PrintStream、BufferedWriter、PrintWriter的比较? PrintStream类的输出功能非常强大&#xff0c;通常如果需要输出文本内容&#xff0c;都应…...

4机器学习期末复习

在机器学习中&#xff0c;数据清洗与转换包括哪些内容&#xff1f; 对数据进行初步的预处理&#xff0c;需要将其转换为一种适合机器学习模型的表示形式对许多模型类型来说&#xff0c;这种表示就是包含数值数据的向量或者矩阵&#xff1a; 1&#xff09;将类别数据编码成为对…...

chatgpt: int t[] int *t 区别

在C语言中&#xff0c;int t[]和int *t虽然在某些情况下可以相互替换&#xff0c;但它们有一些关键的区别。这些区别主要体现在声明的语义、内存分配方式和使用场景上。以下是详细的解释&#xff1a; ### 1. int t[] #### 语义: - int t[]声明了一个数组&#xff0c;t是一个数…...

网络安全技术实验六 入侵检测技术实践

一、实验目的和要求 理解基于网络的入侵检测系统的基本原理&#xff0c;掌握snort IDS工作机理&#xff1b; 学习应用snort三种方式工作&#xff1b;熟练编写snort规则&#xff1b; 完成snort数据包记录、日志查看、字符串匹配、ARP欺骗攻击检测、端口扫描工具检测等功能。 …...

SpringBoot中获取当前请求的request和response

在Spring Boot中&#xff0c;你可以以多种方式获取当前请求的HttpServletRequest和HttpServletResponse对象。以下是几种常见的写法示例&#xff1a; 1. 在方法参数中声明 最常见和推荐的方式是在控制器方法的参数中直接声明HttpServletRequest和HttpServletResponse对象。Sp…...

Neo4j 桌面版打不开踩坑贴

真的踩坑。。。没有人告诉我为啥桌面版和社区版不能一起下啊&#xff01;&#xff01; 我是先下载了社区版之后再下载的桌面版&#xff0c;结果桌面版界面一直打不开。 尝试了网上多种办法都没效果&#xff0c;好多都是说jdk不兼容导致无法打开&#xff0c;让我从JDK 17 ->…...

[数据集][目标检测]中国象棋检测数据集VOC+YOLO格式300张12类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;300 标注数量(xml文件个数)&#xff1a;300 标注数量(txt文件个数)&#xff1a;300 标注类别…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...