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

探索 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:xShift + 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/endforwhile/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 插件管理器举例:

  1. 安装 Vim-Plug:

    • 在终端中运行以下命令以安装 Vim-Plug:
      curl -fLo ~/.vim/autoload/plug.vim --create-dirs \https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
      
  2. 编辑 .vimrc 文件:

    • 打开 Vim 配置文件 .vimrc(如果不存在则创建),通常位于 ~/.vimrc~/.vim/.vimrc
    • 在文件中添加对于插件的配置。例如:
      " 在 .vimrc 文件中添加插件配置
      call plug#begin('~/.vim/plugged')" 添加需要安装的插件,例如:
      Plug 'scrooloose/nerdtree'  " NERDTree 插件
      Plug 'kien/ctrlp.vim'       " CtrlP 插件call plug#end()
      
  3. 安装插件:

    • 保存 .vimrc 文件后,重新启动 Vim。
    • 运行 :PlugInstall 命令,在 Vim 中安装配置文件中指定的插件。
    • 安装完成后,重启 Vim,新插件即可生效。
  4. 使用插件:

    • 根据插件的说明,查看插件的使用方式和快捷键。
    • 每个插件都有自己的命令和快捷键。

安装并使用插件的确切步骤取决于选择的插件和插件管理器。请遵循插件的安装说明,并根据需要进行自定义配置。

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 命令来调用这个函数,在文本中查找重复的单词并进行标记。


喜欢的话,请收藏+关注!
万一有趣的事还在后头呢!
42CF4001.png

相关文章:

探索 Vim:一个强大的文本编辑器

引言&#xff1a; Vim&#xff08;Vi IMproved&#xff09;是一款备受推崇的文本编辑器&#xff0c;拥有强大的功能和高度可定制性&#xff0c;提供丰富的编辑和编程体验。本文将探讨 Vim 的基本概念、使用技巧以及为用户带来的独特优势。 简介和发展 1. Vim 的简介和历史 V…...

K8S(十)—容器探针

这里写目录标题 容器探针&#xff08;probe&#xff09;检查机制探测结果探测类型何时该使用存活态探针?何时该使用就绪态探针?何时该使用启动探针&#xff1f; 使用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时&#xff0c;发现一个问题&#xff0c;启动以前的项目突然报子容器启动异常。 异常信息如下&#xff1a; 严重: 子容器启动失败 java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: 无法启动组件[org.apache.…...

JAVA序列化(创建可复用的 Java 对象)

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

如何使用自动化工具编写测试用例?

以下为作者观点&#xff0c;仅供参考&#xff1a; 在快速变化的软件开发领域&#xff0c;保证应用程序的可靠性和质量至关重要。随着应用程序复杂性和规模的不断增加&#xff0c;仅手动测试无法满足行业需求。 这就是测试自动化发挥作用的地方&#xff0c;它使软件测试人员能…...

redis底层数据结构之skiplist实现

skiplist实现 skiplist跳跃表&#xff0c;是一种有序数据结构&#xff0c;通过在每个节点中维持多个指向其他节点的指针&#xff0c;来达到快速访问节点的目的&#xff0c;redis使用skiplist作为zsort的底层实现之一 结构很像树形结构 typedef struct zskiplistNode { // 对象…...

mjpg-streamer配置其它端口访问视频

环境 树莓派4B ubuntu 20.04 U口摄像头 确认摄像头可访问 lsusb查看 在dev下可查看到video* sudo mplayer tv://可打开摄像头并访问到视频 下载mjpg-streamer并编译安装 在github下载zip包&#xff0c;下载的源码&#xff0c;需要编译安装 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&#xff09;检查 JDK2&#xff09;下载 Gradle3&#xff09;解压 Gradle4&#xff09;环境变量5&#xff09;验证安装 2.优势总结 Gradle 是一款强大而灵活的构建工具&#xff0c;用于自动化构建、测试和部署项目。它支持多语言、多项目和多阶段的构建&#x…...

【Spark精讲】Spark内存管理

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

C语言实现Hoare版快速排序(递归版)

Hoare版 快速排序是由Hoare发明的&#xff0c;所以我们先来讲创始人的想法。我们直接切入主题&#xff0c;Hoare版快速排序的思想是将一个值设定为key&#xff0c;这个值不一定是第一个&#xff0c;如果你选其它的值作为你的key&#xff0c;那么你的思路也就要转换一下&#xf…...

git 避免输入用户名 密码 二进制/文本 文件冲突解决

核心概念介绍 工作区是你当前正在进行编辑和修改的文件夹&#xff0c;可见的。 暂存区位于.git/index(git add放入)。 代码库(工作树)位于.git(git commit将暂存区中的更改作为一个提交保存到代码库中,并清空暂存区) 避免输入用户 密码&#xff1a; 方式一&#xff1a; ht…...

[OpenWrt]RAX3000一根线实现上网和看IPTV

背景&#xff1a; 1.我家电信宽带IPTV 2.入户光猫&#xff0c;桥接模式 3.光猫划分vlan&#xff0c;将上网信号IPTV信号&#xff0c;通过lan口&#xff08;问客服要光猫超级管理员密码&#xff0c;具体教程需要自行查阅&#xff0c;关键是要设置iptv在客户侧的vlan id&#…...

最新50万字312道Java经典面试题52道场景题总结(附答案PDF)

最近有很多粉丝问我&#xff0c;有什么方法能够快速提升自己&#xff0c;通过阿里、腾讯、字节跳动、京东等互联网大厂的面试&#xff0c;我觉得短时间提升自己最快的手段就是背面试题&#xff1b;花了3个月的时间将市面上所有的面试题整理总结成了一份50万字的300道Java高频面…...

​html.parser --- 简单的 HTML 和 XHTML 解析器​

源代码&#xff1a; Lib/html/parser.py 这个模块定义了一个 HTMLParser 类&#xff0c;为 HTML&#xff08;超文本标记语言&#xff09;和 XHTML 文本文件解析提供基础。 class html.parser.HTMLParser(*, convert_charrefsTrue) 创建一个能解析无效标记的解析器实例。 如果…...

赵传和源代码就是设计-UMLChina建模知识竞赛第4赛季第23轮

参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。第4题为附加题&#xff0c;对错不影响优胜者的判定&#xff0c;影响的是优胜者的得分。 所有题目的回答必须放在同一条消息中&#xff0…...

Leaflet.Graticule源码分析以及经纬度汉化展示

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

html 中vue3 的setup里调用element plus的弹窗 提示

引入Elementplus之后&#xff0c;在setup&#xff08;&#xff09;方法外面导入ElMessageBox const {ElMessageBox} ElementPlus 源码 &#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><!-- import Vue before Elemen…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...