金磊 发自 凹非寺
量子位 报道 | 公众号 QbitAI

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 的可组合性的真正威力就显现出来了。

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

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

本文系网易新闻•网易号特色内容激励计划签约账号【量子位】原创内容,未经账号授权,禁止随意转载。

每天5分钟,抓住行业发展机遇

如何关注、学习、用好人工智能?

每个工作日,量子位AI内参精选全球科技和研究最新动态,汇总新技术、新产品和新应用,梳理当日最热行业趋势和政策,搜索有价值的论文、教程、研究等。

同时,AI内参群为大家提供了交流和分享的平台,更好地满足大家获取AI资讯、学习AI技术的需求。扫码即可订阅:

加入AI社群,与优秀的人交流

量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态

喜欢就点「在看」吧 !

用聪明的方式学习Vim,不再死记硬背,复杂命令一学就会 | GitHub 2200星相关推荐

  1. Github火爆的项目,用聪明的方式学习Vim!

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 本文转自AI新媒体量子位(公众号 ID: QbitAI) 最近,在 GitHub 上便 ...

  2. 学习编程:能边玩边学的10个游戏编程网站,这样学编程可好玩了

    有很多人说:学习编程是一件非常枯燥无味的事情. 其实,你完全可以换种方法学呀!不想看书?听视频也坚持不下去?那么玩游戏你喜不喜欢呢? 所以,今天就给大家推荐10个可以通过打游戏来学习编程的网站!收藏就 ...

  3. 跟我一起学习VIM - The Life Changing Editor [转载]

    前两天同事让我在小组内部分享一下VIM,于是我花了一点时间写了个简短的教程.虽然准备有限,但分享过程中大家大多带着一种惊叹的表情,原来编辑器可以这样强大,这算是对我多年来使用VIM的最大鼓舞吧.所以分 ...

  4. 跟我一起学习VIM - The Life Changing Editor

    前两天同事让我在小组内部分享一下VIM,于是我花了一点时间写了个简短的教程.虽然准备有限,但分享过程中大家大多带着一种惊叹的表情,原来编辑器可以这样强大,这算是对我多年来使用VIM的最大鼓舞吧.所以分 ...

  5. 学习Vim有什么好处? [关闭]

    作为一名程序员,我在键盘上花了很多时间,而且在过去的12年里,我或多或少都在做. 如果有一些我从未习惯过的东西,那么由于一些最常见的代码编辑任务,我在编码过程中会遇到这些烦人且几乎无意识的持续微中断. ...

  6. 厉害了!寓教于乐,用玩游戏的方式学习 Git!

    作者 | mozlingyu 来源 | 少数派 用游戏的方式来学习,是一种有趣而高效的方式. 从刚接触电脑时的打字练习软件 金山打字通,到程序猿写代码的利器 Vim 都有小游戏(金山打字通游戏.VIM ...

  7. 真香 | 有了这个神器,学习 Vim 终于不难了!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://urlify.cn/fAz67 ...

  8. 初学者如何学习Vim

    译自 http://www.labnol.org/internet/learning-vim-for-beginners/28820/ 初学者如何学习Vim Vim or Vi Improved 是一 ...

  9. 学习VIM之2014

    学习VIM之2014 作为一名开发者,你不应该把时间花费在考虑如何去找你所要编辑的代码上.在我转移到完全使用 VIM 的过程中,感到最痛苦的就是它处理文件的方式.从之前主要使用 Eclipse 和 S ...

最新文章

  1. linux 正则查找email_Linux生产环境上,最常用的一套“Sed“技巧
  2. mysql总结 博客园_mysql总结
  3. 为什么说python是世界上最好的语言-Python是世界上最好的语言 吗?
  4. STM32 之八 在线升级(IAP)超详细图解 及 需要注意的问题解决
  5. C语言用‘%20‘替换字符串中的所有空格的算法(附完整源码)
  6. jsp学习(1)jsp请求过程和生命周期
  7. python tkinter控件_python tkinter 控件与布局 项目实战
  8. Spark学习之RDD的概念
  9. 在Windows下快速搭建SVN服务器 VisualSVN
  10. 网络工程师HCIE-RS-路由回馈问题(通俗易懂!)
  11. 使用数据集(DataSet)、数据表(DataTable)、集合(Collection)传递数据
  12. OpenGL ES着色器语言----------------储存修饰符
  13. Android 系统(44)---多语言
  14. 基于Python的深度神经网络的中文期刊分类系统
  15. 明日之后最新服务器开服时间,明日之后什么时候开服 新服开区详解
  16. gic lpi its
  17. 电脑上怎么打开小米手机的便签?
  18. 主流的6个Go语言Web框架
  19. java 爬取百度云盘,百度网盘资源抓取 爬虫
  20. 优化.NET访问Active Directory的性能

热门文章

  1. 甘超波:目标和目的区别
  2. Bootstrap框架的基本使用
  3. Android多线程之ArrayBlockingQueue源码解析
  4. Unity插件-NGUI使用教程
  5. **Python垃圾回收机制
  6. NestIn VS插件 visual studio 中将同类CS文件放在一起显示
  7. 批量管理服务器,批量分发文件
  8. 开源跳板机(堡垒机)Jumpserver v0.2.0 使用说明
  9. Unity3D之主菜单
  10. [转] MongoDB 入门