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

news2024/7/4 4:55:40

引言:
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! ggVG
    call matchadd('ErrorMsg', @/)
    let @/ = old_search

    " 恢复光标位置
    call setpos('.', save_cursor)
endfunction

" 创建一个自定义命令来调用函数
command! HighlightDuplicates :call HighlightDuplicates()

脚本定义了一个名为 HighlightDuplicates 的函数。这个函数首先保存当前的光标位置,然后使用正则表达式查找文本中的重复单词,并使用 matchadd() 函数标记这些重复单词。最后,它将光标位置恢复到之前保存的位置。

将脚本保存到一个 .vim 结尾的文件中,并在 Vim 中执行 :source 文件名.vim 加载脚本。然后,使用 :HighlightDuplicates 命令来调用这个函数,在文本中查找重复的单词并进行标记。


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1308515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0基础学习VR全景平台篇第127篇:什么是VR全景/720全景漫游?

“全景”作为一种表现宽阔视野的手法&#xff0c;在很久之前就得到了普遍的认同。北宋年间&#xff0c;由张择端绘制的《清明上河图》就是一幅著名的全景画。摄影术出现后&#xff0c;全景摄影也随之而生。 到今天&#xff0c;全景拍摄不再被专业摄影师所独享&#xff0c;广大…

uniapp 之 图片 视频 文件上传

<view class"" style"padding: 24rpx 0"><text>相关资料 <text class"fs-26 color-666">&#xff08;图片、视频、文档不超过9个&#xff09;</text> </text><view class"flex align-center" style&…

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取)

1. DenseNet 网络介绍 本章实现的项目是DenseNet 网络对花数据集的五分类&#xff0c;下载链接&#xff1a; 基于迁移学习的 DenseNet 图像分类项目 DenseNet 网络是在 ResNet 网络上的改进&#xff0c;大概的网络结构如下&#xff1a; 1.1 卷积的简单介绍 图像识别任务主要…

通过 RIOT 将 AWS ElastiCache 迁移到阿里云 Tair

本文通过示例介绍了 RIOT 如何轻松地将数据从 AWS ElastiCache 迁移到云原生内存数据库&#xff08;如 Tair 和云数据库 Redis 版&#xff09;。 1. 准备资源迁移 1.1. 源代码 AWS ElastiCache cache.r6g.xlarge。它有三个数据分片&#xff0c;与 Redis 6.2 兼容。 AWS EC2 t2.…

共建开源新里程:北京航空航天大学OpenHarmony技术俱乐部正式揭牌成立

12月11日,由OpenAtom OpenHarmony(以下简称“OpenHarmony”)项目群技术指导委员会(以下简称“TSC”)和北京航空航天大学共同举办的“OpenHarmony软件工程研讨会暨北京航空航天大学OpenHarmony技术俱乐部成立仪式”在京圆满落幕。 现场大合影 活动当天,多位重量级嘉宾出席了此次…

2023.12.14 hive sql的聚合增强函数 grouping set

目录 1.建库建表 2.需求 3.使用union all来完成需求 4.聚合函数增强 grouping set 5.聚合增强函数cube ,rollup 6.rollup翻滚 7.聚合函数增强 -- grouping判断 1.建库建表 -- 建库 create database if not exists test; use test; -- 建表 create table test.t_cookie(month …

理解 Proxy 和 Object.defineProperty:提升你的 JavaScript 技能(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

华为配置基本QinQ示例

组网需求 如图1所示&#xff0c;网络中有两个企业&#xff0c;企业1有两个分支&#xff0c;企业2有两个分支。这两个企业的各办公地的企业网都分别和运营商网络中的SwitchA和SwitchB相连&#xff0c;且公网中存在其它厂商设备&#xff0c;其外层VLAN Tag的TPID值为0x9100。 现…

ffmpeg编解码——数据包(packet)概念(如何正确处理数据包中的显示时间戳pts与解码时间戳dts关系?)

文章目录 FFmpeg编解码——数据包&#xff08;Packet&#xff09;概念1. 数据包&#xff08;Packet&#xff09;简介2. 数据包&#xff08;Packet&#xff09;在FFmpeg中的应用2.1 从媒体文件读取数据包2.2 向媒体文件写入数据包 3. 数据包&#xff08;Packet&#xff09;相关问…

智能优化算法应用:基于鸽群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鸽群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鸽群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鸽群算法4.实验参数设定5.算法结果6.参考文献7.MA…

数据结构-06-散列/哈希表

1-什么是散列表 散列表用的是数组支持按照下标随机访问数据的特性&#xff0c;所以散列表其实就是数组的一种扩展&#xff0c;由数组演化而来。可以说&#xff0c;如果没有数组&#xff0c;就没有散列表。散列表中的元素在数组的位置(index)是通过散列函数得到的。 2-散…

C语言 联合体验证 主机字节序 +枚举

联合体应用&#xff1a;验证当前主机的大小端&#xff08;字节序&#xff09; //验证当前主机的大小端 #include <stdio.h>union MyData {unsigned int data;struct{unsigned char byte0;unsigned char byte1;unsigned char byte2;unsigned char byte3;}byte; };int main…

华为OD机试-传递悄悄话(JavaPythonGo)100%通过率

题意 给定一个二叉树,每个节点上站着一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二又树所有节点上的人都接收到悄悄话花费的时间。 输入 给定一叉树 09 20-1-1 157-1-1-1-132 注:-1表示空节…

Redis使用——低版本不支持SSUBSCRIBE问题的解决 守护线程daemonize初步

前言 最近在使用redis的使用&#xff0c;报了一个错&#xff0c;ERR unknown command SSUBSCRIBE&#xff0c;后来发现是redis版本的问题。这个似乎是redis的发布订阅模式相关的配置。 目录 前言引出低版本不支持SSUBSCRIBE报错unknown command SSUBSCRIBE检查docker版本拉取指…

薅github的羊毛-用pages建自己的博客或资源站 - 博客工具 - 2/2

笔者调研了好多个静态博客工具&#xff0c;最后锁定Hexo了&#xff0c;但不等于其他博客不行。我只吐槽两个 Hugo - 难用Gridea - 简直就是骗钱的&#xff0c;我交钱用不了 theme没有链接&#xff0c;同步也同步不了&#xff0c;估计以前是可以&#xff0c;现在经营不下去&…

C语言结构体和位段

自定义类型&#xff1a;结构体及联合和枚举 一.结构体类型的声明1.1 结构体的概念1.2结构的声明1.3特殊的声明1.4结构体的自引用1.5可以使用typedef重命名 二.结构体变量的创建和初始化2.1结构体变量的初始化使用{}2.2初始化&#xff1a;定义变量的同时赋初值。2.3结构体嵌套及…

基于FFmpeg,实现播放器功能

一、客户端选择音视频文件 MainActivity package com.anniljing.ffmpegnative;import android.Manifest; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Ur…

【python笔记】requests模块基础总结

前言 菜某笔记总结&#xff0c;如有错误请指正。&#xff08;抱歉可能我用渗透的靶场做的功能演示&#xff0c;让单纯想看爬虫整理的朋友不好理解&#xff0c;主要看一下requests库的写法吧&#xff0c;关于sql靶场&#xff0c;文件上传靶场什么的都当做网站的名字吧&#xff…

无法打开源文件“opencv2/opencv.hpp“

如图报错&#xff0c;看见就非常高血压 解决方案&#xff1a; 1.打开项目属性 第二步&#xff0c;注意你如果跑的是Debug&#xff0c;那么你在项目属性里面设置的必须选择Debug模式&#xff0c;跑的Release模式&#xff0c;则你必须要设置相应的Release模式&#xff01;否则你…

【金华模式】双龙旅游引燃露营设计和文旅产融合新方式

&#xff08;中国国际教育电视台 黎明&#xff09;金华双龙风景旅游区位于浙江省金华市北郊的金华山麓&#xff0c;是一处融自然山水、溶洞群景观、科普探险、康体休闲、避暑度假、观光朝圣于一体的景区。旅游区人文积淀深厚&#xff0c;道、儒、释文化兼收并蓄&#xff0c;东汉…