[No0000191]7种提高工作效率的Vim操作-Vim使用技巧(6)
Vim一直被认为是一种非常高效的文本编辑器,但是对于普通用户来说,很难在入门的时候就体会到Vim的所谓高效性。
本文介绍7种提高你工作效率和生产力的Vim使用技巧,主要集中在对某个文件范围内的特定目标执行相同的重复性操作。抛砖引玉,作为你体验使用Vim进行高效操作的入门级教程。
1. Vim重复操作命令.
在vim重复操作命令. (英文句点)介绍过,.
命令可以用于重复上次修改。在《Vim实用技巧》一书中花了大量篇幅介绍” .
范式”:一次按键移动,一次按键执行。
假设想在以下的JavaScript代码里的 + 前后加上空格以使代码更加美观,可以执行以下Vim操作:f+s␣+␣<Esc>;.;.;.
1 |
var foo = "method("+argument1+","+argument2+")"; |
在上面的Vim操作中,首先使用字符查找命令 f
查找到第一个出现 + 的位置,然后使用 s
命令删除光标下的字符后再进入插入模式,在输入完 ␣+␣
后退出插入模式,完成了第一个 + 前后增加空格的操作。
使用Vim命令 ;
会在当前行重复查找上次 f
命令所查找的目标字符,而 .
命令则重复上次的修改。因此,可以连续输入 3 次 ;.
来完成全部修改操作。
注:Vim命令 s
是 cl
的复合命令形式,表示删除一个字符并进入插入模式,更多内容可参考Vim删除并进入插入模式命令c。
2. Vim宏
使用Vim .
命令重复执行一些比较简单的任务时非常高效,但是当需要执行的操作比较复杂时,Vim宏
是更理想的选择。
Vim宏很适合针对一系列相似的行、段落,甚至是文件,进行重复性的修改。用宏把任意数目的按键操作录制到寄存器,用于之后的回放,可以非常高效地实现重复操作。
假如有很多宏定义的常量
1 |
#define CONST_A 1 |
现在想替换成const常量的形式
1 |
const int CONST_A = 1; |
可以录制这样的一个宏:
- 按
qa
键开始录制宏,将宏存到 a 寄存器 - 按
0
将光标移到行首,按ce
删除 #define 并进入插入模式,输入 const int 并按ESC回到普通模式 - 按
e
来到变量名的最后一个字母,按a
进入插入模式,输入 = ,按ESC回到普通模式 - 按
A
将光标移动到最后并进入插入模式,输入 ; 并按ESC回到普通模式 - 按
j
将光标移到下一行,按q
结束宏录制
录完这个宏之后,就可以按 @a
回放录制的宏操作。每执行一次宏就会把当前行替换成const的形式并自动将光标移到下一行。
因此,只需要按9次 @a
或者一次性执行 9@a
就可以替换完所有要编辑的行。
3. Vim可视化模式
Vim可视化模式下可以选择一块编辑区域,然后对选中的文件内容执行插入、删除、替换、改变大小写等操作。
可视化模式能高效地对一块目标区域执行相同的操作,是在Vim场景下执行重复操作的一种高效方法。
比如,如果想一次性注释多行文本,可以如下操作:
(1) 普通模式下按 Ctrl + v
进入块选择模式
(2) 向上或向下移动光标选择多行
(3) 移动光标到行的起始位置
(4) 然后按大写的I
进入行首插入模式
(5) 插入注释符
(6) 按Esc回到命令模式
需要注意的是:Vim同时编辑多行时,只有在当前的插入动作 结束后 (按 Esc
退为命令模式),之前选中的其它行才会显示执行后的结果。
4. Vim normal命令
Vim normal
命令可以在命令行模式执行普通模式下的命令,当normal命令与Vim可视化模式结合时,只需很少的操作就能完成大量重复性工作。
比如在编辑Markdown文件时想在某些行前面都加上 -
让普通文本行变成无序列表,可以先用 V
选中这些行,然后按 :'<,'>normal I-
并回车即可实现。
5. Vim替换命令s
Vim命令行模式下使用 :substitute
命令 (缩写形式 s
) 可以将指定范围内的字符替换成其他目标字符,实现同时处理多个目标行的操作效果。
例如,假设希望将Vim当前打开文件的所有行尾多余的空格删除,可以使用Vim命令 :%s= *$==
。
其中,%
表示整个文件范围,*$
表示以0个或多个 *
结尾的文本行,更多关于 :substitute
命令的使用,可以参考Vim替换命令substitute小结。
6. Vim寄存器
Vim中很多东西都是通过寄存器来传递,比如复制剪切一段文本、访问系统的剪贴板,录制的宏等,都是将对应的操作结果保存在寄存器内。使用 :reg 寄存器名
命令可以查看对应寄存器中的内容。
关于Vim寄存器的更多内容可以参考Vim教程网上的内容:Vim寄存器介绍、Vim剪切、复制、粘贴和删除操作与Vim无名寄存器。
在插入模式下或者命令行模式下,使用 <C-r>+寄存器名
可以输入寄存器里的内容。例如,在插入模式下,可以通过输入 <C-r>"
来插入无名寄存器的内容,或输入 <C-r>0
来插入复制专用寄存器中的内容。
举个例子,想使用 :s
命令替换一个很长的单词而又不想手动输入它,可以先在普通模模式下使用命令 piw
或 piW
将其复制下来,默认会包存到无名寄存器 "
里,然后使用 <C-r>"
就可以将复制的单词输入到 :s
命令中。
7. Vim光标快速移动
关于Vim光标移动的内容,可以查看Vim光标移动命令汇总,在此先不做赘述。
[No0000191]7种提高工作效率的Vim操作-Vim使用技巧(6)的更多相关文章
- Linux 下三种提高工作效率的文件处理技巧
Linux 下三种提高工作效率的文件处理技巧 在 Linux 下工作,打交道最多的就是文件了,毕竟 Linux 下工作一切皆文件嘛.Linux 也为大家提供了多种用于处理文件的命令,合理使用这些命令可 ...
- Windows 下有什么软件能够极大地提高工作效率
Windows 下有什么软件能够极大地提高工作效率?修改 可以推荐一些好的应用或者有趣的程序,能提升工作效率或者能让人眼前一亮的.修改 举报1 条评论 分享 • 邀请回答 按票数排序按时间排序 2 ...
- 倍数提高工作效率的 Android Studio 奇技
来源:JeremyHe 链接:http://zlv.me/posts/2015/07/13/14_android-studio-tips/ 这是从Philippe Breault的系列文章<An ...
- [转]倍数提高工作效率的 Android Studio 奇技
转自:http://android.jobbole.com/81687/ 倍数提高工作效率的 Android Studio 奇技 2015/10/08 · 技术分享 · 4 评论· Android S ...
- 线上操作使用tmux提高工作效率
对于常常在线上操作的人来说有一种烦恼,就是在操作过程中,有事离开了一下,电脑自己主动睡眠了.然后网络断开连接.这时候任务就要又一次跑.非常烦恼. tmux能够解决问题. tmux能够看成虚拟屏幕,不受 ...
- Vin码识别(车架号识别)技术,摆脱手动录入提高工作效率
本文主题:Vin码识别(车架号识别)技术,摆脱手动录入提高工作效率 本文关键词:Vin码识别,汽车Vin码识别,车架号识别,汽车车架号识别,车代码识别,车代号识别 本文主旨:一.Vin码(车架号)在什 ...
- 程序员如何巧用Excel提高工作效率 第二篇
之前写了一篇博客程序员如何巧用Excel提高工作效率,讲解了程序员在日常工作中如何利用Excel来提高工作效率,没想到收到很好的反馈,点赞量,评论量以及阅读量一度飙升为我的博客中Top 1,看来大家平 ...
- 使用ant优化android项目编译速度,提高工作效率
1.Android项目编译周期长,编译项目命令取消困难 2.在进行Android项目的编译的同时,Eclipse锁定工作区不能进行修改操作 3.在只进行资源文件的修改时,Eclipse对资源文件的修改 ...
- 巧用Excel提高工作效率
程序员如何巧用Excel提高工作效率 主要讲解下Excel中VLOOKUP函数的使用,相比于上一篇中的内容,个人觉得这个相对高级一些. 1.使用背景 为什么会使用到这个函数呢,背景是这样的,有两个系统 ...
随机推荐
- 基于CentOS搭建基于 ZIPKIN 的数据追踪系统
系统要求:CentOS 7.2 64 位操作系统 配置 Java 环境 安装 JDK Zipkin 使用 Java8 -openjdk* -y 安装完成后,查看是否安装成功: java -versio ...
- 【Android】详解Android Activity
目录结构: contents structure [+] 创建Activity 如何创建Activity 如何创建快捷图标 如何设置应用程序的名称.图标与Activity的名称.图标不相同 Activ ...
- [ci]jenkins server启动,通过jnlp的方式启动slave(容器模式)
jenkins server启动,通过jnlp的方式启动slave. java -jar jenkins.jar 配置jnlp端口--全局安全 配置云 配置项目 执行成功
- 《Essential C++》读书笔记 之 泛型编程风格
<Essential C++>读书笔记 之 泛型编程风格 2014-07-07 3.1 指针的算术运算(The Arithmetic of Pointer) 新需求1 新需求2 新需求3 ...
- 解决Redis之MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist o...
解决Redis之MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist o... ...
- Oracle 创建分区表
--查看数据库中所有用户的分区表 SELECT * FROM DBA_TABLES WHERE PARTITIONED='YES' AND OWNER NOT IN ('SYSTEM','SYS') ...
- 【iCore1S 双核心板_FPGA】例程十二:基于单口RAM的ARM+FPGA数据存取实验
实验现象: 核心代码: module single_port_ram( input CLK_12M, input WR, input RD, input CS0, inout [:]DB, input ...
- 【Unity】序列化字典Dictionary的问题
问题:在C#脚本定义了public Dictionary字典,然而在编辑器检视面板Editor Inspector中看不到(即无法序列化字典).即不能在编辑器中拖拽给字典赋值. 目标:检视面板Insp ...
- 【Python】socket模块应用
[Socket] 本文记录了一些socket模块的简单应用,对于具体原理还没来得及深究. ■ 利用socket模块进行端口连接验证和扫描 在linux中常用nc命令来进行远端端口是否开放的验证.但是这 ...
- Java知多少(53)使用Java创建自己的异常子类
尽管Java的内置异常处理大多数常见错误,你也许希望建立你自己的异常类型来处理你所应用的特殊情况.这是非常简单的:只要定义Exception的一个子类就可以了(Exception当然是Throwabl ...