vim的使用方法
常见的命令可参考:
Linux vi/vim | 菜鸟教程www.runoob.com/linux/linux-vim.html编辑
https://link.zhihu.com/?target=https%3A//www.runoob.com/linux/linux-vim.html
1. vim的工作模式
vi/vim 共分为三种模式,命令模式、编辑输入模式和末行(命令行)模式。

1.1 命令模式
任何时候,不管用户处于何种模式,只要按一下ESC键,即可使vi进入命令模式。我们在shel环境(提示符为$)下输入启进入编辑器时,也是处于该模式下。
在命令模式下,用户可以输入各种合法的vi命令,用于管理自己的文档。此时从键盘上输入的任何字符都被当做编辑命令来解释,若输入的字符是合法的vi命令,则vi在接受用户命令之后完成相应的动作。但需注意的是,所输入的命令并不在屏幕上显示出来。若输入的字符不是vi的合法命令,vi会响铃报警。
用户刚刚启动 vi/vim,便进入了命令模式。
此状态下敲击键盘动作会被 Vim 识别为命令,而非输入字符,比如我们此时按下 i,并不会输入一个字符,i 被当作了一个命令。以下是普通模式常用的几个命令:
- i -- 切换到输入模式,在光标当前位置开始输入文本。
- x -- 删除当前光标所在处的字符。
- : -- 切换到底线命令模式,以在最底一行输入命令。
- a -- 进入插入模式,在光标下一个位置开始输入文本。
- o:在当前行的下方插入一个新行,并进入插入模式。
- O -- 在当前行的上方插入一个新行,并进入插入模式。
- dd -- 剪切当前行。
- yy -- 复制当前行。
- p(小写) -- 粘贴剪贴板内容到光标下方。
- P(大写)-- 粘贴剪贴板内容到光标上方。
- u -- 撤销上一次操作。
- Ctrl + r -- 重做上一次撤销的操作。
- :w -- 保存文件。
- :q -- 退出 Vim 编辑器。
- :q! -- 强制退出Vim 编辑器,不保存修改。
命令模式只有一些最基本的命令,因此仍要依靠底线命令行模式输入更多命令。
1.2 编辑模式
在命令模式下按下 'i' ,'a','o' 都可以进入了输入模式,区别可参考上面的介绍,按 Esc 键可以返回到命令模式。

进入输入模式
在输入模式中,可以使用以下按键:
- 字符按键以及Shift组合,输入字符
- ENTER,回车键,换行
- BACK SPACE,退格键,删除光标前一个字符
- DEL,删除键,删除光标后一个字符
- 方向键,在文本中移动光标
- HOME/END,移动光标到行首/行尾
- Page Up/Page Down,上/下翻页
- Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
- ESC,退出输入模式,切换到命令模式
1.3 末行模式
在命令模式下,输入冒号即可进入未行模式。此时窗口的状态行会显示出冒号,等待用户输入命令。用户输入完成后,按回车执行,之后vi编辑器又自动返回到命令模式下。常见的末行命令:
- :w:保存文件。
- :q:退出 Vim 编辑器。
- :wq:保存文件并退出 Vim 编辑器。
- 进入末行模式后(esc),直接按(小写状态)shift+zz或者(大写状态)ZZ ,也可以保存退出当前文件
- :q!:强制退出Vim编辑器,不保存修改。
- :%d:清空文件内容。
- :nohl:取消由 Vim 内部命令(如搜索)引起的高亮显示。
按 ESC 键可随时退出底线命令模式。
2. VIM末行模式中分屏
| 按键 | 功能 |
|---|---|
| :sp | 当前文件水平分屏 |
| :vsp | 当前文件垂直分屏 |
| :sp 文件名 | 当前文件和另一个文件水平分屏 |
| :vsp 文件名 | 当前文件和另一个文件垂直分屏 |
| ctrl+w+w | 在多个窗口切换光标 |
| :wall/:wqall//:qall | 保存/保存退出/退出所有分屏窗口 |
| vim -O a.c b.c | 垂直分屏 |
| vim -o a.c b.c | 水平分屏 |
3. vim其他用法
| 按键 | 功能 |
|---|---|
| :!man 3 printf | 在vim中执行自定义命令 ,我这里查看printf的用法(q退出) |
| :r !ls -l | 将ls -l执行的结果写入当前文件中 |
| :r /etc/passwd | 将/etc/passwd文件中的内容写入到当前文件中 |
| :w /tmp/txt | 将当前文件内容写入到/tmp/txt文件中 |
| :w! /tmp/txt | 强制将当前文件内容写入到/tmp/txt文件中 |
| :1,10s/^/\/\// | 将第1行到10行行首添加// (^表示行首) /\/\转移字符 |
| :1,10s#^#// | 将第1行到10行行首添加//(#可以临时代替/ 分隔) |
| :%s/;/\r{\r\treturn0;\r}\r/g | 将 ; 替换成{ return 0; } |
| :1,10s#//## | 将第1行到10行行首去掉//(#可以临时代替/ 分隔) |
- :1,10s/^/\/\//
:1,10s:表示在第1行到第10行之间执行替换操作。^:表示行的开头。//:表示替换为的内容,这里是//(注释符号)。
- :1,10s#^#//
:1,10s:表示在第1行到第10行之间执行替换操作。#^#:表示查找模式,这里的^表示行的开头。//:表示替换为的内容,这里是//。
- :%s/;/\r{\r\treturn0;\r}\r/g
:%s:表示在整个文件范围内执行替换操作。/;/:要查找的模式,这里是分号;。\r:表示换行符。{:表示替换为的内容的一部分。\t:表示一个制表符(Tab)。return0;:这是替换后插入的代码部分,表示return 0;。}:表示替换为的内容的一部分。g:表示全局替换,即在每一行中替换所有匹配的分号。
- :1,10s#//##
s:表示替换操作。#:作为分隔符,指定要替换的模式。//:要被替换的字符串。##:替换为的内容(这里是空字符串,表示删除//)。
如何删除自定义列:
使用 Visual Block 模式:
- 首先,将光标移动到你想删除的列的第一个字符上。
- 按下 Ctrl-v 进入 Visual Block 模式。
- 使用方向键(h, j, k, l)或者鼠标来选择你想要删除的列的范围。
- 按下 d 来删除选中的块。
如何解决vim乱码?(中文不能正常显示)
打开用户目录下的vim配置文件
vim ~/.vimrc
输入
set termencoding=utf-8
set encoding=utf8
set fileencodings=utf8,ucs-bom,gbk,cp936,gb2312,gb18030

如图,中文显示正常
相关文章:
vim的使用方法
常见的命令可参考: Linux vi/vim | 菜鸟教程www.runoob.com/linux/linux-vim.html编辑https://link.zhihu.com/?targethttps%3A//www.runoob.com/linux/linux-vim.html 1. vim的工作模式 vi/vim 共分为三种模式,命令模式、编辑输入模式和末行&am…...
OPPO携手比亚迪共同探索手机与汽车互融新时代
10月23日,OPPO与比亚迪宣布签订战略合作协议,双方将共同推进手机与汽车的互融合作,这一合作也标志着两大行业巨头在技术创新和产业融合上迈出了重要一步,为手机与汽车的深度融合探索新的可能。 OPPO创始人兼首席执行官陈明永、OP…...
Apache Linkis:重新定义计算中间件
在大数据技术蓬勃发展的今天,我们见证了从单一计算引擎到多元化计算范式的演进。然而,随着企业数据应用场景的日益丰富,一个严峻的挑战逐渐显现:如何有效管理和协调各类计算引擎,使其能够高效协同工作?Apac…...
go gorm简单使用方法
GORM 是 Go 语言中一个非常流行的 ORM(对象关系映射)库,它允许开发者通过结构体来定义数据库表结构,并提供了丰富的 API 来操作数据库。 安装 go get -u gorm.io/gorm go get -u gorm.io/driver/sqlite表结构 在 gorm 中定义表结…...
【c++高级篇】--多任务编程/多线程(Thread)
目录 1.进程和线程的概念: 1.1 进程(Process): 1.2线程(Thread): 1.3 对比总结: 2.多线程编程: 2.1 基于线程的多任务处理(Thread)…...
【力扣专题栏】两数相加,如何实现存储在链表中的整数相加?
题解目录 1、题目描述解释2、算法原理解析3、代码编写(原始版本)4、代码编写(优化版本) 1、题目描述解释 2、算法原理解析 3、代码编写(原始版本) /*** Definition for singly-linked list.* struct ListN…...
SOLID - 接口隔离原则(Interface Segregation Principle)
SOLID - 接口隔离原则(Interface Segregation Principle) 定义 接口隔离原则(Interface Segregation Principle,ISP)是面向对象设计中的五个基本原则之一,通常缩写为SOLID中的I。这一原则由Robert C. Martin提出&…...
arrylist怎么让他变得不可修改
在Java中,要将一个 ArrayList变得不可修改,你可以使用以下几种方法: ###1. 使用 Collections.unmodifiableList Java 提供了 Collections.unmodifiableList 方法,可以生成一个不可修改的视图。这种方式返回的列表将不允许添加、…...
SpringMVC实战(3):拓展
四、RESTFul风格设计和实战 4.1 RESTFul风格概述 4.1.1 RESTFul风格简介 RESTful(Representational State Transfer)是一种软件架构风格,用于设计网络应用程序和服务之间的通信。它是一种基于标准 HTTP 方法的简单和轻量级的通信协议&…...
Vue应用中使用xlsx库实现Excel文件导出的完整指南
Vue应用中使用xlsx库实现Excel文件导出的完整指南 在现代Web开发中,经常需要将数据导出为Excel文件,以便于用户进行离线分析或记录。Vue.js作为一个轻量级且高效的前端框架,结合xlsx库可以轻松实现这一功能。本文将详细介绍如何在Vue应用中使…...
【数据分析】Power BI的使用教程
目录 1 Power BI架构1.1 Power BI Desktop1.2 Power BI服务1.3 Power BI移动版 2 Power Query2.1 Power Query编辑器2.2 Power Query的优点2.3 获取数据2.4 数据清洗的常用操作2.4.1 提升标题2.4.2 更改数据类型2.4.3 删除错误/空值2.4.4 删除重复项2.4.5 填充2.4.6 合并列2.4.…...
融合ASPICE与敏捷开发:探索汽车软件开发的最佳实践
ASPICE(Automotive SPICE,即汽车软件过程改进和能力dEtermination)与敏捷开发在软件开发领域各自具有独特的价值和特点,它们之间的关系可以归纳为既相互区别又相互补充。 一、ASPICE的特点 ASPICE是汽车行业对软件开发流程的一个评…...
后台管理系统的通用权限解决方案(三)SpringBoot整合Knife4j生成接口文档
1 Knife4j介绍 knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案,前身是swagger-bootstrap-ui,取名knife4j是希望它能像一把匕首一样小巧,轻量,并且功能强悍! 其底层是对Springfox的封装,使…...
保研考研机试攻略:python笔记(1)
🐨🐨🐨宝子们好呀 ~ 我来更新欠大家的python笔记了,从这一篇开始我们来学下python,当然,如果只是想应对机试并且应试语言以C和C为主,那么大家对python了解一点就好,重点可以看高分篇…...
在浏览器中运行 Puppeteer:解锁新能力
Puppeteer,这个强大的浏览器自动化工具,通常在Node.js环境中运行。但你有没有想过,在浏览器本身中运行Puppeteer会是什么样子?这不仅能让我们利用Puppeteer的功能完成更多任务,还能避开Node.js特定的限制。 支持的功…...
Kafka消费者故障,出现活锁问题如何解决?
大家好,我是锋哥。今天分享关于【Kafka消费者故障,出现活锁问题如何解决?】面试题?希望对大家有帮助; Kafka消费者故障,出现活锁问题如何解决? 1000道 互联网大厂Java工程师 精选面试题-Java资…...
pytorch 交叉熵损失函数 BCELoss
BCE Loss 交叉熵损失函数计算公式: BCE Loss - 1/n*(y_actual * log(y_pred) (1 - y_actual) * log(1 - y_pred)) t[i]为标签值:0或者1 o[i]是经过sigmoid后的概率值 BCEWithLogitsLoss 这个损失将Sigmoid层和BCELoss合并在一个类中。 BCEWithLog…...
【进阶】面向对象之接口(多学三招)
文章目录 IDK8开始接口中新增的方法1.允许在接口中定义默认方法,需要使用关键字default修饰2.接口中的默认方法的定义格式3.接口中默认方法的注意事项总结 IDK8开始接口中新增的方法 JDK7以前:接口中只能定义抽象方法。JDK8的新特性:接口中可以定义有方法体的方法。(默认、静态…...
linux上trace code的几种方法
我们在看代码时,总是会遇到下面问题: 1.查看某个场景下的代码执行流 2.查看某个函数被执行时的routine 但是,如果直接查看源码,源码可能代码量大,且分支多,不容易理清。就需要让相关程序运行起来查看。 …...
文件操作(1) —— 文件基础知识
目录 1. 为什么使用文件? 2. 文件种类【按功能分】 3. 文件名 4. 数据文件种类【按存储方式细分】 5. 文件的打开和关闭 5.1 流和标准流 5.2 文件指针 5.3 文件的打开和关闭函数 6. 文件缓冲区 1. 为什么使用文件? 如果没有⽂件,我…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
