关于vim能快速编辑文本的能力,我们见识到了 operator + motion ,见识到了. 范式和宏。甚至可以使用命令来加快文本编辑。在后面我们又介绍了快捷键绑定来快速执行我们想要的操作。今天我们再来介绍一个新的能加快我们编辑文本速度的东西——Abbreviations

缩写简介

Abbreviations 翻译成中文的意思大概是缩写。但是仅仅以缩写来描述这个特性,似乎是不够的,但是也找不到准确的中文来描述,暂时就采用这个名称吧。它的这个特性允许我们将输入的一段内容自动更新为新的内容

我们先来体验一下它的基本用法。

在命令中输入 :iabbrev mian main

我们输入 mian( 后它会自动将内容替换为 main(。这样即使我们手误将 main 写成了 mian ,vim能自动帮我们更新。再也不用怕编辑器报找不到 main 函数了



我们发现了它的第一个用途——纠正笔误。但是基于这一特性,我们还可以使用几个简单的字符来快速展开成常用的长文本。例如

:iabbrev pcr Copyright 2022 Masimaro, all rights reserved 通过输入 pcr(program copy right) 来快速产生一条程序的版权信息。



又或者在 python 使用 nmain 展开成 if name== "__main__":。快速写下测试语句。



我们发现 iabbrevi+ abbrev 合成的一条命令。看到这相信各位小伙伴应该明白了。这个命令是作用于插入模式下。该特性还可以作用于 命令模式和替换模式。但是这里就不对它做深入的介绍了。有兴趣的小伙伴可以查看vim手册来了解。

对比键盘映射

我们可以使用快捷键映射来达到同样的效果,例如我们可以定义 :inoremap mian <esc>viwdimain 同样可以达到更正 mianmain 的效果

但是我们发现这有几个弊端,第一因为我们定义了一个 mian 的关键字,这就需要手速要够快了,在短时间内输入完成 mian 。第二我们针对只输入mian 确实能达到更正的效果,但是如果我连着其他的语句一起输入就不一定有这个效果了,例如我们想输入 miantest 但是它会给我们替换成 maintest 这就有点得不偿失了。在这种情况下,abbreviations 可以正常工作。而且我们发现相比于使用映射,abbreviations 显的更为简洁,也更加符合逻辑。

keywords characters

我们发现在使用 abbreviations 这一特性的时候,只有在输入空格或者回车的时候它才会启用自动更新,但是输入字母的时候却不会。如何定义输入何种字符的时候它才会启用自动更新呢?

abbreviations 这一特性是在我们输入 non-keyword character 的时候会检查上一个 non-keyword character 到这个之间的单词是否符合之前定义的替换规则,如果符合将会发生替换行为,否则不会发生。只要定义了 non-keyword character 就可以定义它发生更新的时机。那么我们该如何定义 non-keyword character 字符呢?

只要不在 iskeyword 中的字符都算是 non-keyword character。我们执行 set iskeyword? 可以看到 iskeyword 的定义如下:

@,48-57,_,192-255

看起来很复杂是不是?首先 @ 代表字母字符,48-57是字符0到字符9的ascii 编码,_ 单纯的代表下划线,192-255代表ascii码中一些特殊字符。你只需要记住它包含一切字母,数字,_ 以及一些特殊字符。或者更简单的说,格式控制字符(像空格、制表符、回车)都会触发这一行为。如果你想修改 keyword 。可以在vim手册中详细阅读关于 iskeyword 部分的说明。这里就不再过多介绍,我认为当前定义更符合编码时的直觉。

本地缓冲缩写

结合上一章学习的本地设置,我们也可以设置本地缓冲的缩写,例如

:iabbre <buffer> mian main

我们发现它只在当前缓冲区中启用了。

到现在我们似乎可以结合缩写的这个特性完成代码片段的功能呢。但是别着急,要得到这个功能,还得接着往下学习。

如何形成记忆

跟快捷键类似,我们一时兴起,根据自己的习惯定义了一堆缩写,例如 定义 fncfunction,定义 retreturn 结果自己之前养成了把这些关键字都输全的习惯。后面怎么也改不过来,这些都白定义了,该如何解决这个问题呢?

与我们当初禁用快捷键类似,我们也可以禁用某些内容,只是iabbrev 并没有提供类似 <nop> 的指令已达到禁用的目的,但是我们我们可以将对应的字符串映射成为某些无效的字符。例如我们使用如下两个命令

:iabbrev return <space>
:iabbrev ret return

为了养成习惯我们将 return 映射为空格,一旦我们习惯输入 return 就会意识到我们已经用简写 ret 代替了。当我们养成肌肉记忆之后这条映射的作用也就显得可有可无了。

从零开始配置 vim(6)——缩写的更多相关文章

  1. Mac 配置 vim

    Mac 配置 vim 安装 vim 7.4 cd ~ hg clone https://code.google.com/p/vim/ cd vim ./configure --with-feature ...

  2. mac配置vim-go

    基本的设置信息(参考网址:http://hessian.cn/p/1026.html): "还是配置/.vimrc文件. syn on "语法支持 set laststatus=2 ...

  3. 从零开始配置TypeScript + React + React-Router + Redux + Webpack开发环境

    转载请注明出处! 说在前面的话: 1.为什么不使用现成的脚手架?脚手架配置的东西太多太重了,一股脑全塞给你,我只想先用一些我能懂的库和插件,然后慢慢的添加其他的.而且自己从零开始配置也能学到更多的东西 ...

  4. AI应用开发实战 - 从零开始配置环境

    AI应用开发实战 - 从零开始配置环境 与本篇配套的视频教程请访问:https://www.bilibili.com/video/av24421492/ 建议和反馈,请发送到 https://gith ...

  5. Centos7下安装和配置vim

    Centos7 最新版本默认已经安装vim,可以使用命令查看是否安装 rpm -qa|grep vim 输出结果如下,如无以下输出结果,则安装vim: vim-filesystem-7.4.160-4 ...

  6. linux 配置vim(vimrc)

    打开终端:ctrl+alt+t 进入vim文件:cd /etc/vim 打开vimrc文件:sudo gedit vimrc 然后在行末if语句前加上下面的内容,"  这个符号为注释,后面内 ...

  7. linux、centos下安装配置vim

    ---恢复内容开始--- 1.一般情况下安装上centos后,会有vi,没有vim(以后可能会有吧) 如果不确定自己有没有vim,使用命令 rpm -qa|grep vim 查看,如果有的话,会显示三 ...

  8. CentOS7系列--1.5CentOS7配置vim

    CentOS7配置vim 1. 安装vim [root@centos7 ~]# yum -y install vim-enhanced Loaded plugins: fastestmirror ba ...

  9. 从零开始配置Ubuntu 14.04&SSH&curl&Git&MongoDB&Node.js

    从零开始配置Ubuntu 14.04 从零开始配置Ubuntu 14.04,记录配置服务的过程,安装组件如下: SSH curl Git MongoDB Node.js ... ​ Ubuntu 安装 ...

  10. 配置vim插件遇到youcompleteme插件问题解决方案

    今天在Opensuse下配置vim 遇到两个问题 配置插件找到一个很好的博客.学到一些有用技巧 http://hahaya.github.io/2013/07/26/use-vundle.html 但 ...

随机推荐

  1. 用 three.js 绘制三维带箭头线

    需求:这个需求是个刚需啊!在一个地铁场景里展示逃生路线,这个路线肯定是要有指示箭头的,为了画这个箭头,我花了不少于十几个小时,总算做出来了,但始终有点问题.我对这个箭头的要求是,无论场景拉近还是拉远, ...

  2. <vue 基础知识 2、插值语法> v-once,v-html,v-text,v-pre,v-cloak

    代码结构 一.     Mustache 1.效果 展示如何将数据展示在页面上 2.代码 01-Mustache.html <!DOCTYPE html> <html lang=&q ...

  3. shell脚本(13)-shell函数

    一.函数介绍 将相同功能的代码模块化,使得代码逻辑上比较简单,代码量少,排错容易 函数的优点: 1.代码模块化,调用方便,节省内存 2.代码模块化,代码量少,排错简单 3.代码模块化,可以改变代码的执 ...

  4. nginx.conf 配置解析及常用配置

    本文为博主原创,未经允许不得转载: nginx.conf 配置文件配置解析 #定义 Nginx 运行的用户和用户组.默认nginx的安装用户为 nobody user www www: #启动进程,通 ...

  5. Nacos源码 (1) 源码编译及idea环境

    本文介绍从gitee下载nacos源码,在本地编译,并导入idea进行本地调试. 从gitee下载源码 由于github访问速度慢,所以我选择使用gitee的镜像仓库: git clone https ...

  6. 【ThreadX-USBX】Azure RTOS USBX概述

    Azure RTOS USBX是高性能USB主机,设备和移动(OTG)嵌入式堆栈.Azure RTOS USBX与Azure RTOS ThreadX完全集成,并且可用于所有ThreadX支持的处理器 ...

  7. css - 隐藏body滚动条

    body::-webkit-scrollbar{ display: none; }

  8. [转帖]Unicode标准中定义的3个私有使用区域-一个基本区域+两个补充区域

    Unicode私有使用区域 目录 1.概述 2.Unicode标准中的描述 2.1.基本多语言平面的私有区域 2.2.补充私有区域 2.3.私有区域位置 3.实际测试 3.1.测试代码 3.2.测试结 ...

  9. ARMv8.0下duckdb的安装与编译过程-解决 Failed to allocate block of 2048 bytes

    ARMv8.0下duckdb的安装与编译过程-解决 Failed to allocate block of 2048 bytes 背景 duckdb 是一个很流行的单机版数据库引擎 同事下载了相关的预 ...

  10. [转帖]005、体系结构之TiKV_Raft日志

    Raft日志 1.Raft与Multi Raft 2.Raft 日志复制 2.1.复制流程总览 2.2.Propose 2.3.Append 2.3.Replicate(Append) 2.4 Com ...