【vim 学习系列文章 13 -- 自动命令 vim autocmd 】

news/2024/7/21 15:05:43 标签: vim, 学习, 编辑器, vim autocmd

文章目录

    • autocmd
    • 定义自动命令
      • events参数
      • pattern参数
      • nested参数
      • 删除自动命令
      • 自动命令组
      • 自动命令选项

转自:https://yyq123.github.io/learn-vim/learn-vi-49-01-autocmd.html

autocmd

自动命令,是在指定事件发生时自动执行的命令。利用自动命令可以将重复的手工操作自动化,以提高编辑效率并减少人为操作的差错。

比如自定义以下函数,用于在文件中插入当前日期:

function DateInsert()
    $read !date
endfunction

使用以下命令,可以手动调用此函数:

:call DateInsert()

而通过以下自动命令,则可以在保存文件时自动执行函数,而不再需要额外的手动操作:

:autocmd FileWritePre * :callDateInsert()<CR>

定义自动命令

可以使用以下格式的autocmd命令,来定义自动命令:

:autocmd [group] events pattern [nested] command
  • group,组名是可选项,用于分组管理多条自动命令;
  • events,事件参数,用于指明触发命令的一个或多个事件;
  • pattern,限定针对符合匹配模式的文件执行命令;
  • nested,嵌套标记是可选项,用于允许嵌套自动命令;
  • command,指明需要执行的命令、函数或脚本。

events参数

Vim内置了近80个事件,以下表格按照类别列示了较为常用的事件:

类别事件触发条件
读取BufNewFile编辑一个新文件时
读取BufReadPre读入新缓冲区之前
读取BufRead, BufReadPost读入新缓冲区之后
读取BufReadCmd开始编辑新缓冲区之前
读取FileReadPre使用:read命令读入文件之前
读取FileReadPost使用:read命令读入文件之后
读取StdinReadPre由标准输入设备读入缓冲区之前
读取StdinReadPost由标准输入设备读入缓冲区之后
写入BufWrite, BufWritePre将整个缓冲区写入文件时
写入BufWritePost将整个缓冲区写入文件之后
写入BufWriteCmd将整个缓冲区写入文件之前
缓冲区BufAdd, BufCreate将缓冲区加入缓冲区列表之后
缓冲区BufDelete从缓冲区列表中移除缓冲区之前
缓冲区BufEnter进入缓冲区之后
缓冲区BufLeave离开缓冲区之前
缓冲区BufWinEnter在窗口中显示缓冲区之后
缓冲区BufWinLeave从窗口中关闭缓冲区之前
缓冲区BufNew创建缓冲区之后
缓冲区BufUnload卸载缓冲区之前
选项FileType设置’filetype’选项之后
选项Syntax设置’syntax’选项之后
选项EncodingChanged'encoding’选项改变之后触发命令;
选项OptionSet设置任何选项之后
启动退出VimEnterVim启动并载入初始化文件之后
启动退出GUIEnter启动GUI之后
启动退出VimLeavePre改写viminfo文件之前,退出Vim之前
启动退出VimLeave改写viminfo文件之后,退出Vim之前
其它FileChangedShell当文件的最后修改时间等属性发生改变时
其它InsertEnter进入插入模式时
其它InsertLeave离开插入模式时
其它FocusGainedVim成为当前窗口时
其它FocusLostVim不再是当前窗口时
其它WinEnter进入窗口时
其它WinLeave离开窗口时
其它CursorMoved在常规模式下移动光标时
其它CursorMovedI在插入模式下移动光标时
其它CursorHold当超过’updatetime’所指定时间用户没有输入时
其它vimResized窗口尺寸变化之后

假设我们打开文件并输入文本,然后保存并退出,那么这些操作将以下顺序触发一系列事件:

操作事件
启动Vim并创建默认窗口BufWinEnter
创建默认缓冲区BufEnter
:edit a.txtVimEnter
创建新缓冲区BufNew
将新缓冲区加入到缓冲区列表之中BufAdd
退出默认缓冲区BufLeave
退出默认窗口BufWinLeave
将默认缓冲区从缓冲区列表之中移除BufUnload
删除默认缓冲区BufDelete
将a.txt文件读入新缓冲区BufReadCmd
激活新缓冲区BufEnter
激活新窗口BufWinEnter
进入插入模式InsertEnter
输入文本CursorMovedI
退出插入模式InsertLeave
:wqBufWriteCmd
退出新窗口BufWinLeave
将新缓冲区从缓冲区列表之中移除BufUnload
准备退出VimVimLeavePre
退出VimVimLeave

pattern参数

匹配模式用来指定应用自动命令的文件。在匹配模式中,可以使用以下特殊字符:

?匹配单个字符
?匹配字符’?’
.匹配字符’.’
,用于分割多个pattern
,匹配字符’,’
可以使用逗号来分割多个模式,以匹配多种类型的文件。例如以下命令,将对于.c和.h文件设置’textwidth’选项:
:autocmd BufRead,BufNewFile *.c,*.h set tw=0

您可以使用以下命令,获得匹配模式的详细说明:

:help autocmd-patterns

nested参数

默认情况下,自动命令并不会嵌套执行。例如在自动命令中执行:e:w命令,将不会再次触发BufRead和BufWrite事件。而使用nested参数,则可以激活嵌套的事件。

:autocmd FileChangedShell *.c nested e!

删除自动命令

使用以下命令,可以删除所有自动命令:

:autocmd!

注意:此操作也将删除插件所定义的自动命令,请谨慎操作。

使用以下命令,可以删除指定组的自动命令:

:autocmd! group

在命令中指定组、事件和匹配模式,可以删除特定的自动命令:

autocmd! Unfocussed FocusLost *.txt

在命令中使用特殊字符“*”来指代所有事件或文件。例如以下命令,将删除Unfocussed组中所有针对txt文件的自动命令:

autocmd! Unfocussed * *.txt

在命令中忽略文件匹配模式,那么所有针对指定事件的针对命令都将被删除。例如以下命令,将删除Unfocussed组在所有针对FocusLost事件的自动命令:

autocmd! Unfocussed FocusLost

自动命令组

通过:augroup命令,可以将多个相关联的自动命令分组管理,以便于按组来查看或删除自动命令。例如以下命令,将C语言开发的相关自动命令,组织在“cprogram”组内:

:augroup cprograms
:    autocmd!
:    autocmd FileReadPost *.c :set cindent
:    autocmd FileReadPost *.cpp :set cindent
:augroup END

如果我们针对同样的文件和同样的事件定义了多条自动命令,那么当满足触发条件时将分别执行多条自动命令。因此,建议在自动命令组的开头增加:autocmd!命令,以确保没有重复的自动命令存在。

您可以使用以下命令,获得自动命令组的帮助信息:

:help :augroup

自动命令选项

通过eventignore选项,可以忽略指定的事件,而不触发自动命令。例如使用以下命令,将忽略进入窗口和离开窗口的事件:

:set eventignore=WinEnter,WinLeave

如果希望忽略所有事件,那么可以使用以下设置:

:set eventignore=all

命令小结:

:autocmd!删除自动命令
:augroup定义自动命令组
:set eventignore设置忽略的事件

推荐阅读
https://yyq123.github.io/learn-vim/learn-vi-49-01-autocmd.html


http://www.niftyadmin.cn/n/5229263.html

相关文章

Set系列的集合

无序&#xff1a; 存取的顺序不一样 不重复&#xff1a;可以去重 无索引&#xff1a;不能使用普通for进行遍历&#xff0c;也不能通过索引获取元素 Set集合的实现类 HashSet&#xff1a;无序&#xff0c;不重复&#xff0c;无索引 LinkedHashSet&#xff1a;有序&#xff…

jupyter notebook 添加环境与删除环境

添加环境 一、查看conda现有的环境 打开 Anaconda Powershell Prompt 输入以下代码&#xff0c;查看全部环境&#xff1a;conda env list 可以看到如下已经配置的环境变量&#xff1a; 二、激活现有环境 在 Anaconda Powershell Prompt 继续输入&#xff0c;激活环境&#…

服务器安装JDK17 版本显示JDK8

服务器之前安装的是JDK8&#xff0c;后面升级JDK17后&#xff0c;发现执行 java -vsrsion 显示的是此时我的环境变量已经换成了JAVA17的路径 输入&#xff1a; vim /etc/profile 解决办法&#xff1a; 1.更新自己环境变量 bash export JAVA_HOME/usr/local/jdk-17.0.7 …

svn合并冲突时每个选项的含义

合并冲突时每个选项的含义 - 这个图片是 TortoiseSVN&#xff08;一个Subversion&#xff08;SVN&#xff09;客户端&#xff09;的合并冲突解决对话框。当你尝试合并两个版本的文件并且出现差异时&#xff0c;你需要解决这些差异。这个对话框提供了几个选项来处理合并冲突&…

快速排序并不难

快速排序的核心框架是“二叉树的前序遍历对撞型双指针”。我们在《一维数组》一章提到过”双指针思路“&#xff1a;在处理奇偶等情况时会使用两个游标&#xff0c;一个从前向后&#xff0c;一个是从后向前来比较&#xff0c;根据结果来决定继续移动还是停止等待。快速排序的每…

Win Server 2019远程桌面服务部署

一、添加远程桌面授权服务 服务器管理 - 添加角色和功能打开“添加角色和功能向导”窗口&#xff0c;选择基于角色或给予功能安装&#xff1a; 打开服务器管理&#xff0c;打开角色和功能&#xff0c;添加远程回话主机和远程桌面授权 image.png 以上配置完成后使用期限为120…

基于Python的电影数据可视化分析系统的设计与实现

点我完整下载&#xff1a;基于Python的电影数据可视化分析系统的设计与实现.docx 基于Python的电影数据可视化分析系统的设计与实现 Design and Implementation of a Python-based Movie Data Visualization and Analysis System 目录 目录 2 摘要 3 关键词 4 第一章 绪论 4 1.…

3D模型渲染导致电脑太卡怎么办?

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 1、什么是3D渲染&#xff1f; 3D渲染是指通过计算机图形学技术将三维模型转化为二维图像的过程…