| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
OPEN编辑
3周前发布

用聪明的方式学习Vim,不再死记硬背,复杂命令一学就会

   Vim 难学难用?但事实是,它依旧受许多程序员的欢迎。

  或许,只是你的「打开方式」不对。

  最近,在 GitHub 上便出现了一个叫做用聪明的方式学习 Vim 的项目,上线短短几天时间,便已经斩获 2200 星。

  那么,如此学习 Vim 的方式,到底有多「聪明」?

  用聪明的方式与 Vim「交流」

  很多人可能会被 Vim 命令的复杂性吓到。

  因此,作者将 Vim 命令的一般结构,分解成了一个简单语法规则

  这也是本教程中最为重要的一个章节——一旦了解了 Vim 命令类似语法的结构,就能跟它「畅谈无阻」。

  按照作者的说法,「只需要知道一个语法规则」,就可以说 Vim 的语言了:

verb + noun

  如果拿英文短句做类比,就例如:

Eat (verb) a donut (noun)

Kick (verb) a ball (noun)

  现在,只需要使用基本的 Vim 动词和名词来增加词汇量。

  Vim 的名词和动词

  这里说到的 Nouns,就是 Vim 中的一些动作,例如:

h:左
j:下
k:上
l:右
w:移动到下个词的开头
}:跳到下一个段
$:移动到本行末尾

  而 Vim 中的 Verbs,就相当于操作符。

  以 h 操作符为例,Vim 中有 16 种,但只需要知道其中 3 种,便可以满足 80% 的需求。

y:复制
d:删除文本,保存到 register
c:删除文本,保存到 register,并开始「插入」模式

  OK,了解了「名词」和「动词」,现在便可以应用到「语法规则」中了:

y$:把当前所有的东西,从当前位置拖拽至行末
dw:从当前位置删除到下一个单词的开头
c}:将当前位置更改为此段末尾

  当然,类似这样的组合,也接受数字作为其中的参数,例如:

y2h:向左拉 2 个字符
d2w:删除接下来的 2 个单词
c2j:改变接下来的 2 行内容

  除此之外,行式操作(linewise operations)是文本编辑中的常见操作,因此,Vim 也允许你通过连续键入 2 次操作符来完成类似这样的操作。

  比如,键入「dd」,删除整行内容;键入「cc」,更改整行内容。

  可组合性和语法

  在讨论 Vim 语法之后,便是 Vim 的可组合性(Composability)。

  可组合性意味着拥有一组通用命令,可以组合起来执行更复杂的命令。当与外部程序集成时,Vim 的可组合性的真正威力就显现出来了。

  举个例子,现在有一段「乱七八糟」的文字,如下所示:

IdNameCuteness
01PuppyVery
02KittenOk
03BunnyOk

  现在需要将这些文字转换成为表格形式,若是用 Vim 命令来实现这点可能会有一些困难,但是可以使用 column terminal 命令快速完成。

  将鼠标指向「ID」,然后运行 !}column -t -s “” ,就可以得到漂亮的表格了:

Id   Name    Cuteness
01  Puppy    Very
02  Kitten    Ok
03  Bunny   Ok

  回过头来看下刚才的命令。

  「!」是过滤操作符,「}」是名词,过滤操作符接收了另一个参数,也就是一个终端命令,「column -t -s “” 」。

  简而言之,经过这样的一番操作后,便完成了文字表格化的任务。

  再例如,除了表格化之外,再筛选带有「OK」的行,可以这样做:

!}column -t -s “” awk ‘NR > 1 && /Ok/ {print $0}’

  得到的结果便是:

02  Kitten  Ok
03  Bunny  Ok

  这就是一种与 Vim「交流」的聪明方式。

  但作者也同时指出,刚开始学习、适应这种「Vim 语法」是需要一定时间,但只要熟练起来后,便可轻松驾驭。

  基于 Vim 语法的更多操作

  在介绍完 Vim 的语法规则后,便可以基于此来完成更多操作和任务。

  例如在本教程中的第五章,便介绍了「如何在文件中移动」。

  刚开始用键盘来完成这项任务,肯定是比较慢的,但作者认为:

只要你把这个方法熟悉起来,要比用鼠标还要快。

  最基本的操作便是向左、向右、向上和向下移动一个字符:

h   Left
j    Down
k   Up
l    Right

  在字符之后,便是以文字为单元的移动。

W:移动到下一个单词的开头处
E:移动到下一个单词的结尾处
B:移动到前一个单词的开头处
gE:移动到前一个单词的结尾处

  接下来是以「行」为单位的移动:

0:移动到当前行的第一个字符处
^:移动到当前行第一个非空字符处
g_:移动到当前行最后一个非空字符处
$:移动到当前行最后一个字符处
n:移动到当前行的第n列

  当然,用类似的 Vim 方式,还可以完成「段」级别、搜索、滚动、标记等一系列移动操作。

  此外,教程中还提供了许多其他操作的教程,例如「Insert Mode」、「Undo」等等。

  目前教程还在更新中,有兴趣的读者可以持续关注这份「聪明的 Vim 教程」。

  传送门:

  https://github.com/iggredible/Learn-Vim