探索 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…...
对话系统之解码策略(Top-k Top-p Temperature)
一、案例分析 在自然语言任务中,我们通常使用一个预训练的大模型(比如GPT)来根据给定的输入文本(比如一个开头或一个问题)生成输出文本(比如一个答案或一个结尾)。为了生成输出文本,…...
《面向机器学习的数据标注规程》摘录
说明:本文使用的标准是2019年的团体标准,最新的国家标准已在2023年发布。 3 术语和定义 3.2 标签 label 标识数据的特征、类别和属性等。 3.4 数据标注员 data labeler 对待标注数据进行整理、纠错、标记和批注等操作的工作人员。 【批注】按照定义…...
VGG(pytorch)
VGG:达到了传统串型结构深度的极限 学习VGG原理要了解CNN感受野的基础知识 model.py import torch.nn as nn import torch# official pretrain weights model_urls {vgg11: https://download.pytorch.org/models/vgg11-bbd30ac9.pth,vgg13: https://download.pytorch.org/mo…...
celery/schedules.py源码精读
BaseSchedule类 基础调度类,它定义了一些调度任务的基本属性和方法。以下是该类的主要部分的解释: __init__(self, nowfun: Callable | None None, app: Celery | None None):初始化方法,接受两个可选参数,nowfun表…...
单片机上位机(串口通讯C#)
一、简介 用C#编写了几个单片机上位机模板。可定制!!! 二、效果图...
初识Flask
摆上中文版官方文档网站:https://flask.github.net.cn/quickstart.html 开启实验之路~~~~~~~~~~~~~ from flask import Flaskapp Flask(__name__) # 使用修饰器告诉flask触发函数的URL,绑定URL,后面的函数用于返回用户在浏览器上看到的内容…...
JeecgBoot jmreport/queryFieldBySql RCE漏洞复现
0x01 产品简介 Jeecg Boot(或者称为 Jeecg-Boot)是一款基于代码生成器的开源企业级快速开发平台,专注于开发后台管理系统、企业信息管理系统(MIS)等应用。它提供了一系列工具和模板,帮助开发者快速构建和部署现代化的 Web 应用程序。 0x02 漏洞概述 Jeecg Boot jmrepo…...
机器学习---模型评估
1、混淆矩阵 对以上混淆矩阵的解释: P:样本数据中的正例数。 N:样本数据中的负例数。 Y:通过模型预测出来的正例数。 N:通过模型预测出来的负例数。 True Positives:真阳性,表示实际是正样本预测成正样…...
【机器学习】应用KNN实现鸢尾花种类预测
目录 前言 一、K最近邻(KNN)介绍 二、鸢尾花数据集介绍 三、鸢尾花数据集可视化 四、鸢尾花数据分析 总结 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Fil…...
ACL和NAT
目录 一.ACL 1.概念 2.原理 3.应用 4.种类 5.通配符 1.命令 2.区别 3.例题 4.应用原则 6.实验 1.实验目的 2.实验拓扑 3.实验步骤 7.实验拓展 1.实验目的 2.实验步骤 3.测试 二.NAT 1.基本理论 2.作用 3.分类 静态nat 动态nat NATPT NAT Sever Easy-IP…...
口碑好的番禺网站建设/广州网站优化方式
小程序的火爆已经不是一两天了,有些小程序成本价可能几百几千,但是如果是卖的话,可能几万、几十万都是有可能的,也造成现在很多年轻人学习小程序,小猿圈web前端讲师解读微信小程序文件下载--视频和图片,希望…...
电子商务网站建设流程/中国站长之家网站
JarsLink (原名Titan) 是一个基于JAVA的模块化开发框架,它提供在运行时动态加载模块(一个JAR包)、卸载模块和模块间调用的API。也是阿里巴巴的开源项目之一 https://github.com/alibaba/ja...,目前在微贷事业群广泛使用。 使用场…...
网站代码在哪里写/杭州网站制作排名
问题描述: 原因: 在apptool 2.0以后命令发生了变化,不能再使用 apktool d <apk_path> <outfile_path> 解决方法:解决方法: 使用命令行apktool d -f <apk_path> -o <outfile_path> 终极解决方法: 输入 apktool 指令,能看到你所安装版本支持的全部指令 转…...
网站健设推广产品多少钱/山东百搜科技有限公司
0、首先得理解MP3格式文件的结构 简单的就是 MP3 文件大体分为三部分:TAG_V2(ID3V2),音频数据,TAG_V1(ID3V1) 参考此博客:点击打开链接 ID3V1的结构是: 表1:ID3V1结构 ------------------------------…...
用php制作动态网站/个人网站制作流程
根据医学和我的体验、观察,一个人真正睡着觉最多只有三个钟头,其余都是浪费时间,躺在枕头上做梦,没有哪个人不做梦。至于醒来觉得自己没有做梦,那是因为他忘记了。 正午(即中午12点)只要闭眼真…...
网站建设工具的实验心得/电商关键词seo排名
随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 在对数组进复制时,我们可以编写一个for循环实现,但是比较麻烦,我们可以使用System类的静态方法arraycopy()。 arraycopy()方…...