热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用聪明的方式学习Vim

来自量子位Vim难学难用?但事实是,它依旧受许多程序员的欢迎。或许,只是你的「打开方式」不对。最近,在GitHub上便出现了

来自量子位

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

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

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

那么,如此学习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 的可组合性的真正威力就显现出来了。

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

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

现在需要将这些文字转换成为表格形式,若是用 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


推荐阅读
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • Java程序员必会的40个Linux命令!
    你知道的越多,不知道的就越多,业余的像一棵小草!你来,我们一起精进!你不来,我和你的竞争对手一起 ... [详细]
  • BashShell作为Linux的指定合作伙伴我们已经再熟悉不过了,使用Bash可以快速编写简单的脚本方便我们的日常比如善用vim,awk和sed三剑客,也可以创建十分复杂的逻辑, ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 文章目录一、awk简介二、awk的两种形式语法格式1options:2command:三、awk工作原理四、记录与字段相关内部变量:五、格式化输出:printf函数六、awk模式和 ... [详细]
  • nginx使用内置模块配置限速限流的方法实例_nginx
    Nginx现在已经是最火的负载均衡之一,在流量陡增的互联网面前,接口限流也是很有必要的,尤其是针对高并发的场景,下面这篇文章主要给大家介绍了关于nginx使用内置模块配置限速限流的 ... [详细]
  • Scarp框架需求获取网页的url下载网页内容(Downloader下载器)定位元素位置,获取特定的信息(Spiders蜘蛛)存储信息(ItemPipeline,一条一条从管里走) ... [详细]
  •  1.在将一个表unload时,出现:244:Couldnotdoaphysical-orderreadtofetchnextrow107:ISAMerror:recordislocked在不重启动数据库 ... [详细]
author-avatar
我们的北京宫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有