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
2
3
4
5
6
#define CONST_A 1 
#define CONST_B 2
#define CONST_C 3
#define CONST_D 4
#define CONST_E 5
...

现在想替换成const常量的形式

1
2
3
4
5
6
const int CONST_A = 1;
const int CONST_B = 2;
const int CONST_C = 3;
const int CONST_D = 4;
const int CONST_E = 5;
...

可以录制这样的一个宏:

  • 按 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)的更多相关文章

  1. Linux 下三种提高工作效率的文件处理技巧

    Linux 下三种提高工作效率的文件处理技巧 在 Linux 下工作,打交道最多的就是文件了,毕竟 Linux 下工作一切皆文件嘛.Linux 也为大家提供了多种用于处理文件的命令,合理使用这些命令可 ...

  2. Windows 下有什么软件能够极大地提高工作效率

    Windows 下有什么软件能够极大地提高工作效率?修改 可以推荐一些好的应用或者有趣的程序,能提升工作效率或者能让人眼前一亮的.修改 举报1 条评论 分享 • 邀请回答   按票数排序按时间排序 2 ...

  3. 倍数提高工作效率的 Android Studio 奇技

    来源:JeremyHe 链接:http://zlv.me/posts/2015/07/13/14_android-studio-tips/ 这是从Philippe Breault的系列文章<An ...

  4. [转]倍数提高工作效率的 Android Studio 奇技

    转自:http://android.jobbole.com/81687/ 倍数提高工作效率的 Android Studio 奇技 2015/10/08 · 技术分享 · 4 评论· Android S ...

  5. 线上操作使用tmux提高工作效率

    对于常常在线上操作的人来说有一种烦恼,就是在操作过程中,有事离开了一下,电脑自己主动睡眠了.然后网络断开连接.这时候任务就要又一次跑.非常烦恼. tmux能够解决问题. tmux能够看成虚拟屏幕,不受 ...

  6. Vin码识别(车架号识别)技术,摆脱手动录入提高工作效率

    本文主题:Vin码识别(车架号识别)技术,摆脱手动录入提高工作效率 本文关键词:Vin码识别,汽车Vin码识别,车架号识别,汽车车架号识别,车代码识别,车代号识别 本文主旨:一.Vin码(车架号)在什 ...

  7. 程序员如何巧用Excel提高工作效率 第二篇

    之前写了一篇博客程序员如何巧用Excel提高工作效率,讲解了程序员在日常工作中如何利用Excel来提高工作效率,没想到收到很好的反馈,点赞量,评论量以及阅读量一度飙升为我的博客中Top 1,看来大家平 ...

  8. 使用ant优化android项目编译速度,提高工作效率

    1.Android项目编译周期长,编译项目命令取消困难 2.在进行Android项目的编译的同时,Eclipse锁定工作区不能进行修改操作 3.在只进行资源文件的修改时,Eclipse对资源文件的修改 ...

  9. 巧用Excel提高工作效率

    程序员如何巧用Excel提高工作效率 主要讲解下Excel中VLOOKUP函数的使用,相比于上一篇中的内容,个人觉得这个相对高级一些. 1.使用背景 为什么会使用到这个函数呢,背景是这样的,有两个系统 ...

随机推荐

  1. python ddt 传多个参数值示例

    import unittest from ddt import ddt,data,file_data,unpack @ddt class TestDDT(unittest.TestCase): lis ...

  2. Apache Spark 2.3.0 重要特性介绍

    文章标题 Introducing Apache Spark 2.3 Apache Spark 2.3 介绍 Now Available on Databricks Runtime 4.0 现在可以在D ...

  3. Mysql依赖库Boost的源码安装,linux下boost库的安装

      boost‘准标准库’安装过程.安装的是boost_1_60_0. (1)首先去下载最新的boost代码包,网址www.boost.org. (2)进入到自己的目录,解压: bzip2 -d bo ...

  4. Atitit easyui翻页组件与vue的集成解决方案attilax总结

    Atitit easyui翻页组件与vue的集成解决方案attilax总结 ===============使用1 ===========\paggingUtil_easyui_vue.js2 C:\U ...

  5. linux每日命令(15):tail命令

    tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不断刷新, ...

  6. 【iCore4 双核心板_FPGA】例程四:Signal Tapll 实验——逻辑分析仪

    实验现象: 三色led轮流闪烁,具体的逻辑分析仪使用教程请参考iCore3逻辑分析仪例程 核心代码: module signal_ctrl( input clk_25m, input rst_n, o ...

  7. Jenkins这种构建工具,一般都是内部使用,所以外部基本上不能访问

    类似于Jenkins这种构建工具,一般都是内部使用,所以外部基本上不能访问,也可以隔绝外部黑客的入侵等.直接暴露外部是非常不安全的,特别是没有什么安全验证,容易被别人入侵做一些非法的事情! 所以,希望 ...

  8. .net core实现跨域

    什么是跨域在前面已经讲解过了,这里便不再讲解,直接上代码. 一.后台API接口 用.net core创建一个Web API项目负责给前端界面提供数据. 二.前端界面 建立两个MVC项目,模拟不同的ip ...

  9. mysql解除死锁状态

    方案一: 1.查看是否有锁表 show OPEN TABLES ; 2.查询进程(如果你有SUPER权限,你可以看到所有线程.否则,只能看到你自己的线程) show processlist; 3.杀死 ...

  10. Inside The C++ Object Model(一)

    ============================================================================1-1. 关键字struct和class的一点区 ...