探索 Vim:一个强大的文本编辑器
引言:
Vim(Vi IMproved)是一款备受推崇的文本编辑器,拥有强大的功能和高度可定制性,提供丰富的编辑和编程体验。本文将探讨 Vim 的基本概念、使用技巧以及为用户带来的独特优势。
简介和发展
1. Vim 的简介和历史
Vim(Vi Improved)是一个备受欢迎的文本编辑器,它是 Vi 编辑器的改进版本,具有强大的功能和高度的可定制性。以下是 Vim 的简介和历史:
Vi 的诞生
- Vi 是 1976 年由 Bill Joy 开发的一款文本编辑器,最初是为 Unix 系统设计的。Vi 以其简洁、高效的操作方式而闻名,成为 Unix 和类 Unix 系统上的标准编辑器。
Vim 的诞生
- Vim 由 Bram Moolenaar 在 1991 年推出,是对 Vi 的改进和扩展。Vim 不仅保留了 Vi 的操作理念,还增加了更多功能和特性,使编辑更为高效。
Vim 的特点和功能
- 模式化编辑: Vim 包含三种主要模式,正常模式(Normal Mode)、插入模式(Insert Mode)和命令行模式(Command Mode),使得编辑更为灵活。
- 强大的快捷键和命令: Vim 提供了丰富的快捷键和命令,能够高效地进行文本编辑、移动和操作。
- 高度可定制性: 用户可以根据自己的需求定制配置,安装插件和脚本,扩展编辑器功能。
- 跨平台性: Vim 可在各种操作系统上运行,包括 Unix/Linux、Windows、macOS 等。
Vim 的发展
- Vim 经过多年的发展和持续更新,逐渐发展成为一个功能强大且稳定的文本编辑器。Vim 社区也非常活跃,持续贡献和改进编辑器。
Vim 以其高效的编辑方式、丰富的功能和强大的可定制性,受到程序员和技术人员的喜爱。成为了许多开发者和系统管理员的首选编辑器之一,并且持续发展和改进。
基本功能
Vim 基础操作:
1. 进入 Vim 编辑器
在终端中键入 vim 文件名
即可打开名为 “文件名” 的文件。
2. 模式介绍
-
正常模式(Normal Mode): 这是默认模式,用于浏览、移动光标和执行命令。按下
Esc
键进入正常模式。 -
插入模式(Insert Mode): 此模式下,可以键入文本。按下
i
进入插入模式。 -
命令行模式(Command Mode): 用于保存、退出、搜索等操作。在正常模式下按下
:
进入命令行模式。
Vim 的命令行模式是用于执行各种命令的地方,例如搜索、保存文件、退出编辑器等。
3. 常用命令
以下是一些常用的 Vim 命令行模式及其示例:
1. 保存和退出
- 保存文件:
:w
或:write
保存文件。 - 不保存退出:
:q!
强制退出而不保存修改。 - 保存并退出:
:wq
或:x
或Shift + ZZ
保存并退出编辑器。
2. 搜索和替换
- 搜索关键词:
:/关键词
开始向下搜索。 - 向上搜索:
:?关键词
开始向上搜索。 - 替换内容:
:%s/旧内容/新内容/g
替换整个文件中的内容。
3. 文本显示和跳转
- 跳转到指定行:
:行号
快速跳转到指定行。 - 查看指定行范围的内容:
:起始行号,结束行号p
显示指定范围的内容。
4. 文件操作和缓冲区
- 打开文件:
:e 文件名
打开另一个文件。 - 在新标签页中打开文件:
:tabe 文件名
在新标签页中打开文件。 - 列出缓冲区:
:ls
显示当前打开的文件列表。 - 切换缓冲区:
:buffer 缓冲区编号
切换到指定缓冲区。
5. 帮助和外部命令
- 显示帮助文档:
:help
打开 Vim 帮助文档。 - 执行外部命令:
:!command
执行外部命令并返回 Vim。
6.行号控制
-
显示行号: 在正常模式下,键入
:set number
或简写为:set nu
,按下回车键。这将显示每一行的行号。 -
关闭行号: 在正常模式下,键入
:set nonumber
或简写为:set nonu
,按下回车键。这将关闭行号显示。
7. 永久显示行号
要使行号在 Vim 永久显示,可以编辑~/.vimrc
文件,并添加以下行:
set number
每次打开 Vim 时自动显示行号。
4. 常用移动命令(在正常模式下)
- h/j/k/l: 左/下/上/右移动光标。
- w/b: 向前/向后移动一个单词。
- 0/$: 移动到行首/行尾。
- gg/G: 跳转到文件开头/结尾。
- Ctrl + F/B: 向前/向后翻页。
5. 常用编辑命令(在正常模式下)
- x: 删除光标所在位置的字符。
- dw/d$: 删除光标位置到单词末尾/行尾的内容。
- yy/p: 复制当前行/粘贴内容。
- u: 撤销上一步操作。
这是一些基本的 Vim 操作,Vim 拥有丰富的功能和命令。
高级功能
Vim 是一个强大而灵活的编辑器,除了基本操作外,还有许多高级功能可以提高编辑效率和灵活性。以下是一些 Vim 的高级编辑功能介绍:
1. 宏录制和重放
- 录制宏: 按下
q
后紧跟宏名称,然后执行一系列操作,再按下q
停止录制。例如:qa...q
。 - 重放宏: 输入
@宏名称
即可重放录制的宏。例如:@a
。
2. 分割窗口
- 水平分割:
:sp 文件名
或者Ctrl + w + s
。 - 垂直分割:
:vsp 文件名
或者Ctrl + w + v
。 - 切换窗口:
Ctrl + w + 方向键
。
3. 书签和标签
- 设置书签: 在光标位置按下
m + 字母
,如ma
。 - 跳转到书签:
‘ + 字母
,如'a
。 - 标签页:
:tabnew 文件名
打开一个新标签页。
4. 公式计算
- 计算表达式: 在命令行模式下输入
:echo 表达式
,如:echo 2 + 2
。
5. 文本对象选择
- 选择块:
v + a + 包围块字符
,如va"
。 - 选择段落:
v + ap
。 - 选择括号内的内容:
vi(
或vi{
。
6. 搜索和替换
- 全局替换:
:%s/查找内容/替换内容/g
。 - 多文件替换:
:args 文件列表
然后:argdo %s/查找内容/替换内容/g | update
。
以上 Vim 中的一些高级编辑功能,可以更高效地编辑和管理文本。
脚本功能
Vim 脚本可以用于自动化和扩展 Vim 的功能。脚本使用 Vim 脚本语言,可以执行各种操作,从简单的自动化任务到复杂的编辑过程。
以下是一些 Vim 脚本的基本操作:
1. 创建和运行脚本
- 创建脚本文件: 使用 Vim 编辑器创建一个新文件,文件名以
.vim
结尾。 - 写入脚本内容: 使用 Vim 脚本语法编写脚本内容。
- 保存并执行脚本: 保存文件后,可以在 Vim 中使用
:source 文件名.vim
命令执行脚本。
2. 基本脚本语法
- 注释: 使用
"
进行注释。 - 变量: 定义变量需要使用
let 变量名 = 值
。 - 条件语句: 可以使用
if/elseif/else/endif
进行条件判断。 - 循环语句: 使用
for/endfor
或while/endwhile
进行循环操作。
3. 实现功能
- 自定义命令: 使用
command
命令创建自定义命令。 - 函数定义和调用: 使用
function 函数名() / endfunction
来定义函数,并通过函数名调用。 - 操作文本: 可以编写脚本来执行自定义的文本操作,如搜索替换、格式化等。
4. 插件和扩展
- 插件编写: 利用脚本语言编写 Vim 插件,扩展 Vim 的功能。
- 使用已有插件: 在脚本中使用已有的 Vim 插件提供的功能,如语法高亮、代码折叠等。
插件介绍
当涉及到 Vim 插件时,有许多令人印象深刻且实用的插件可以增强 Vim 的功能。以下介绍一些受欢迎的 Vim 插件:
1. NERDTree
- 功能: 提供侧边栏文件系统浏览器,方便文件和目录的导航。
- 安装: 使用插件管理器(如 Vundle、Pathogen 或 Vim-Plug)安装。
- 命令:
:NERDTreeToggle
打开或关闭 NERDTree。
2. CtrlP
- 功能: 快速文件搜索和切换。
- 安装: 使用插件管理器安装。
- 命令:
Ctrl + P
触发搜索,然后输入文件名进行快速定位。
3. vim-airline
- 功能: 美化状态栏,提供有吸引力的状态信息。
- 安装: 使用插件管理器安装。
- 自定义: 提供多种主题和自定义选项。
4. Ale
- 功能: 提供实时语法检查和 linting。
- 支持语言: 支持多种编程语言,包括 Python、JavaScript、C++ 等。
- 配置: 可以根据需要配置检查器和显示方式。
5. Vim-commentary
- 功能: 快速注释/取消注释代码。
- 使用:
gcc
注释当前行,gc
注释选定的区域。
6. Fugitive
- 功能: 用于 Git 版本控制的集成。
- 命令: 提供了多种 Git 命令和便捷的 Git 操作。
插件安装示例
使用 Vim-Plug 插件管理器举例:
-
安装 Vim-Plug:
- 在终端中运行以下命令以安装 Vim-Plug:
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
- 在终端中运行以下命令以安装 Vim-Plug:
-
编辑 .vimrc 文件:
- 打开 Vim 配置文件
.vimrc
(如果不存在则创建),通常位于~/.vimrc
或~/.vim/.vimrc
。 - 在文件中添加对于插件的配置。例如:
" 在 .vimrc 文件中添加插件配置 call plug#begin('~/.vim/plugged')" 添加需要安装的插件,例如: Plug 'scrooloose/nerdtree' " NERDTree 插件 Plug 'kien/ctrlp.vim' " CtrlP 插件call plug#end()
- 打开 Vim 配置文件
-
安装插件:
- 保存
.vimrc
文件后,重新启动 Vim。 - 运行
:PlugInstall
命令,在 Vim 中安装配置文件中指定的插件。 - 安装完成后,重启 Vim,新插件即可生效。
- 保存
-
使用插件:
- 根据插件的说明,查看插件的使用方式和快捷键。
- 每个插件都有自己的命令和快捷键。
安装并使用插件的确切步骤取决于选择的插件和插件管理器。请遵循插件的安装说明,并根据需要进行自定义配置。
5. 调试和测试
- 调试脚本: 使用 Vim 的调试功能检查脚本运行时的问题。
- 测试脚本: 编写测试用例,确保脚本功能正确。
Vim 脚本是 Vim 强大的一部分,通过脚本编写,自定义编辑器行为并实现想要的功能。
6. 脚本示例
统计文件的单词数量
当涉及到 Vim 脚本示例:
" 在 Vim 脚本中创建一个命令,用于统计文件中单词数量并显示结果
command! WordCount :echo "单词数量:" . wordcount().words
将上述代码保存到一个以 .vim
结尾的文件中,例如 wordcount.vim
。然后,在 Vim 中执行 :source wordcount.vim
加载该脚本。
然后在 Vim 中输入 :WordCount
命令,并按回车键。将计算当前文件中的单词数量,并在底部状态栏显示结果。
查找文件中的重复单词
在文本中查找重复的单词,并将其标记出来:
" 创建一个函数来查找并标记重复的单词
function! HighlightDuplicates()" 保存当前的光标位置let save_cursor = getpos(".")" 使用正则表达式查找重复的单词并进行标记let old_search = @/let @/ = '\<\(\w\+\)\>\_s*\%(\<\1\>\)\@!'normal! ggVGcall matchadd('ErrorMsg', @/)let @/ = old_search" 恢复光标位置call setpos('.', save_cursor)
endfunction" 创建一个自定义命令来调用函数
command! HighlightDuplicates :call HighlightDuplicates()
脚本定义了一个名为 HighlightDuplicates
的函数。这个函数首先保存当前的光标位置,然后使用正则表达式查找文本中的重复单词,并使用 matchadd()
函数标记这些重复单词。最后,它将光标位置恢复到之前保存的位置。
将脚本保存到一个 .vim
结尾的文件中,并在 Vim 中执行 :source 文件名.vim
加载脚本。然后,使用 :HighlightDuplicates
命令来调用这个函数,在文本中查找重复的单词并进行标记。
喜欢的话,请收藏+关注!
万一有趣的事还在后头呢!
相关文章:

探索 Vim:一个强大的文本编辑器
引言: Vim(Vi IMproved)是一款备受推崇的文本编辑器,拥有强大的功能和高度可定制性,提供丰富的编辑和编程体验。本文将探讨 Vim 的基本概念、使用技巧以及为用户带来的独特优势。 简介和发展 1. Vim 的简介和历史 V…...
K8S(十)—容器探针
这里写目录标题 容器探针(probe)检查机制探测结果探测类型何时该使用存活态探针?何时该使用就绪态探针?何时该使用启动探针? 使用exechttptcpgrpc使用命名端口 使用启动探针保护慢启动容器定义就绪探针配置探针HTTP 探测TCP 探测探针层面的…...
[C错题本]
1.int,short,long都是signed的 但是char可能是signed 也可能是unsigned的——《C Primer》 2.在16位的PC中 char类型占1个字节 int占2个字节 long int占4个字节 float占四个字节 double占八个字节 3.自增运算符和自减运算符即使是在判断条件中使用也会实际生效 int i 1; int…...

tomcat启动异常:子容器启动失败(a child container failed during start)
最近在使用eclipse启动Tomcat时,发现一个问题,启动以前的项目突然报子容器启动异常。 异常信息如下: 严重: 子容器启动失败 java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: 无法启动组件[org.apache.…...

JAVA序列化(创建可复用的 Java 对象)
JAVA 序列化(创建可复用的 Java 对象) 保存(持久化)对象及其状态到内存或者磁盘 Java 平台允许我们在内存中创建可复用的 Java 对象,但一般情况下,只有当 JVM 处于运行时,这些对象才可能存在,即,这些对象的生命周期不…...

如何使用自动化工具编写测试用例?
以下为作者观点,仅供参考: 在快速变化的软件开发领域,保证应用程序的可靠性和质量至关重要。随着应用程序复杂性和规模的不断增加,仅手动测试无法满足行业需求。 这就是测试自动化发挥作用的地方,它使软件测试人员能…...
redis底层数据结构之skiplist实现
skiplist实现 skiplist跳跃表,是一种有序数据结构,通过在每个节点中维持多个指向其他节点的指针,来达到快速访问节点的目的,redis使用skiplist作为zsort的底层实现之一 结构很像树形结构 typedef struct zskiplistNode { // 对象…...

mjpg-streamer配置其它端口访问视频
环境 树莓派4B ubuntu 20.04 U口摄像头 确认摄像头可访问 lsusb查看 在dev下可查看到video* sudo mplayer tv://可打开摄像头并访问到视频 下载mjpg-streamer并编译安装 在github下载zip包,下载的源码,需要编译安装 unzip解压 cd mjpg-streamer/mjp…...

C++相关闲碎记录(15)
1、string字符串 #include <iostream> #include <string> using namespace std;int main (int argc, char** argv) {const string delims(" \t,.;");string line;// for every line read successfullywhile (getline(cin,line)) {string::size_type beg…...

汽车IVI中控开发入门及进阶(十一):ALSA音频
前言 汽车中控也被称为车机、车载多媒体、车载娱乐等,其中音频视频是非常重要的部分,音频比如播放各种格式的音乐文件、播放蓝牙接口的音乐、播放U盘或TF卡中的音频文件,如果有视频文件也可以放出音频,看起来很简单,在windows下音乐播放器很多,直接打开文件就能播放各…...

Gradle 之初体验
文章目录 1.安装1)检查 JDK2)下载 Gradle3)解压 Gradle4)环境变量5)验证安装 2.优势总结 Gradle 是一款强大而灵活的构建工具,用于自动化构建、测试和部署项目。它支持多语言、多项目和多阶段的构建&#x…...

【Spark精讲】Spark内存管理
目录 前言 Java内存管理 Java运行时数据区 Java堆 新生代与老年代 永久代 元空间 垃圾回收机制 JVM GC的类型和策略 Minor GC Major GC 分代GC Full GC Minor GC 和 Full GC区别 Executor内存管理 内存类型 堆内内存 堆外内存 内存管理模式 静态内存管理 …...

C语言实现Hoare版快速排序(递归版)
Hoare版 快速排序是由Hoare发明的,所以我们先来讲创始人的想法。我们直接切入主题,Hoare版快速排序的思想是将一个值设定为key,这个值不一定是第一个,如果你选其它的值作为你的key,那么你的思路也就要转换一下…...
git 避免输入用户名 密码 二进制/文本 文件冲突解决
核心概念介绍 工作区是你当前正在进行编辑和修改的文件夹,可见的。 暂存区位于.git/index(git add放入)。 代码库(工作树)位于.git(git commit将暂存区中的更改作为一个提交保存到代码库中,并清空暂存区) 避免输入用户 密码: 方式一: ht…...

[OpenWrt]RAX3000一根线实现上网和看IPTV
背景: 1.我家电信宽带IPTV 2.入户光猫,桥接模式 3.光猫划分vlan,将上网信号IPTV信号,通过lan口(问客服要光猫超级管理员密码,具体教程需要自行查阅,关键是要设置iptv在客户侧的vlan id&#…...

最新50万字312道Java经典面试题52道场景题总结(附答案PDF)
最近有很多粉丝问我,有什么方法能够快速提升自己,通过阿里、腾讯、字节跳动、京东等互联网大厂的面试,我觉得短时间提升自己最快的手段就是背面试题;花了3个月的时间将市面上所有的面试题整理总结成了一份50万字的300道Java高频面…...
html.parser --- 简单的 HTML 和 XHTML 解析器
源代码: Lib/html/parser.py 这个模块定义了一个 HTMLParser 类,为 HTML(超文本标记语言)和 XHTML 文本文件解析提供基础。 class html.parser.HTMLParser(*, convert_charrefsTrue) 创建一个能解析无效标记的解析器实例。 如果…...

赵传和源代码就是设计-UMLChina建模知识竞赛第4赛季第23轮
参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题,即可获得本轮优胜。第4题为附加题,对错不影响优胜者的判定,影响的是优胜者的得分。 所有题目的回答必须放在同一条消息中࿰…...

Leaflet.Graticule源码分析以及经纬度汉化展示
目录 前言 一、源码分析 1、类图设计 2、时序调用 3、调用说明 二、经纬度汉化 1、改造前 2、汉化 3、改造效果 总结 前言 在之前的博客基于Leaflet的Webgis经纬网格生成实践中,已经深入介绍了Leaflet.Graticule的实际使用方法和进行了简单的源码分析。认…...

html 中vue3 的setup里调用element plus的弹窗 提示
引入Elementplus之后,在setup()方法外面导入ElMessageBox const {ElMessageBox} ElementPlus 源码 : <!DOCTYPE html> <html> <head><meta charset"UTF-8"><!-- import Vue before Elemen…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...