蚂蚁、字节、滴滴面试经历总结

简介: vim 被誉为『编辑器之神』,与之同时代的 emacs 被誉为『神之编辑器』。可以看得出 vim 在编辑器的地位是很高的,得益于 vim 的指法,敲起代码来如行云流水。特别膜拜创始人创始出这么方便的敲代码的指法,这篇文章就是来带你入坑 vim 指法操作。
个人站点: 桃园

0. 前言

0.1 简介

vim 被誉为『编辑器之神』,与之同时代的 emacs 被誉为『神之编辑器』。可以看得出 vim 在编辑器的地位是很高的,得益于 vim 的指法,敲起代码来如行云流水。特别膜拜创始人创始出这么方便的敲代码的指法,这篇文章就是来带你入坑 vim 指法操作。

0.2 前端的我为什么要学习 vim

在当今前端开发工具百花齐放的时代(VS Code、Sublime、Atom 以及 IDE Webstorm),我为什么还要介绍 20 多年前开发的一个老古董呢?在这里我想说的是出身虽然老,但是所带来的价值并没有减,一旦习惯了 vim 的指法之后,你会觉得不用 vim 操作写代码会觉得很不习惯,甚至不知道怎么操作。然而用在支持 vim 指法的编辑上写代码你会觉得如行云流水,如果再配个机械键盘,简直是享受,特别符合极客的风格。

一旦学会了 vim 的指法,会让你终身受益,至少在你敲代码的年代会收益,毫无夸张, 它会让你摆脱烦人的,在敲代码的时候频繁的移动鼠标,这也是 vim 的设计理念之一 -- 脱离鼠标。

0.3 文章适用读者

本篇文章比较适合前端开发者,因为我也只是用 vim 在前端领域做过一些开发,其他领域我没有发言权。

0.4 Q&A

Q:你推荐 vim 是要我们完全放弃以前的编辑器而投入 vim 的怀抱吗?

A:当然不是。首先 vim 的学习成本还是很高的,因为他跟平时我们用的编辑器敲代码的方式根本不同,因为它是不用鼠标的,纯键盘操作。你想想如果你在你的 vs code 上不用鼠标操作,你上下左右全靠方向键,那敲代码的速度得有多慢。而且初学者想把 vim 打造成一个自己的 IDE 还是很有难度的。所以我这里推荐的是,不管是你的 vs code、sublime等,装一个 vim 插件。我在 vs code 上试过,很爽,只不过现在投身到 emacs 的怀抱了。

虽然我用 emacs 了,我还是会装 vim 插件(Evil)。如果有兴趣,下次可以推荐一下 spacemacs 。

开题说了这么多,就是想吸引一下大家,觉得 vim 的指法是值得去学习的,接下来进入正题。

1 助记符

vim 上的所有定义的快捷键都是有一定的意义的,在这里我先把常用的一些列出来。

1.1 正则表达式相关

  • $ : 移动光标到行尾
  • ^ : 移动光标到当前行的第一个字母位置。

1.2 移动类(motion)

h(左)、l(右)、j(上)、k(下)、f(front)、b(back)、u(up)

1.3 操作类(operator)

d(delete)、i(insert)、a(append)、c(change)、y(copy)、p(paste)

1.4 一般的缩写

w(word)、s(sentence)

2 理解 vim 中三种常用模式

vim 里面有好几种模式,但是因为我这里介绍的是在目前的编辑器里面装 插件,所以像命令模式这种用来保存文件、退出文件的就不介绍了。

  1. Nomal mode(默认模式,因为使用该模式场景最多,所有定为默认模式)。
  2. Insert mode (插入模式--少用,用了它 vim 就成 「哑巴」了)。
  3. Visual mode(可视模式,取名叫光标模式或者选择模式可能还比较好理解)

2.1 三种模式之间的转换关系

图片来源参考文章

3 教程篇

当我们记住上面的助记符之后,我们就可以像写英文短语一样操作了。

vim 快捷键语法:operator[motion],例如 删两个单词就是
d2w,operator 和 motion 我已经在前面给出来一些了。

3.1 移动光标

3.1.1 最基本的 h、j、k、l

最基本的上下左右移动(跟键盘上下左右的键盘效果相同,但是往往方向键在键盘的右下方,离主键盘区较远,这个也相对比较有优势):

  • h:光标向左移动
  • j:光标向下移动
  • k:光标向上移动
  • l:光标向右移动

移动属于 motion,所以在前面加上「count」就可以移动多行了,比如向上移动 10 行,就可以 10k。往往编辑器会有行号,定位需要做个加减法,如果采用的是相对行号,用这个就比较方便。不懂相对行号的同学看下图就懂了。
相对行号

3.1.2 快速移动

w:光标往前移动一个词
b:光标向后移动一个词
0:移动光标到当前行首
^:移动光标到当前行的第一个字母位置(注意与 0 的区别)
$:移动光标到行尾
fx:移动光标到当前行的下一个 x 处(x为任意字母)
tx:和上面一个命令类似,移动到 x 的左边一个位置
):移动光标到下一个句子
( :移动光标到上一个句子
{:移动光标到上一段
}:移动光标到下一段

3.1.3 快速定位

在刚才介绍了通过相对行号来进行移动到行的光标,还有采用绝对定位来移动的。那就是 gg。
语法: [num]gg

  • 2gg : 光标移动到第 2 行
  • gg: 光标移动到文件首部
  • G:移动到文件胃部
  • H:移动到屏幕上面
  • M:移动到屏幕中间
  • L:移动到屏幕下面

书签功能:这个功能也是很方便,很少有编辑器有的功能,单独列出来讲,强烈推荐。

  • m:给当前行加入书签,x 为任意字母(m 是 mark )
  • ` : 单引号加上刚才 m 之后的字母,就会调整到刚才标记的那一行

3.1.3 屏幕滚动

  • Ctrl + b:向上移动一屏(Foward首字母小写)
  • Ctrl + f:向下移动一屏(Backward首字母小写)
  • Ctrl + d:向下滚动半屏内容(Down首字母小写)
  • Ctrl + u:向上滚动半屏内容(Up首字母小写)

3.2 剪切、复制、粘贴

  • d[n]w:剪切后面 n 个单词的内容,dw 是剪切当前单词
  • [n]dd:剪切n行的内容, dd 为剪切当前行
  • D:剪切光标后到行尾的内容
  • yy/Y:复制当前行的内容
  • p:粘贴到光标后
  • P:粘贴到光标前

在 normal 模式下是没有删除操作的,d 这种删除也是剪切。

以上全是 normal 模式

3.3 编辑模式

在前面也说了,进入编辑模式也就变成了「哑巴」vim 了,就跟一般的编辑器没什么区别了。很多人就知道用 i 可以进入,还有很多命令可以让你聪明的进入。

  • i:在光标处插入(insert首字母小写)
  • I:在行首插入(insert首字母大写)
  • a:在光标处后一个字符插入(append首字母小写)
  • A:在行尾插入(append首字母大写)
  • o:在上一行插入
  • O:在下一行插入
  • s:清除当前字符并进入插入模式
  • cc/S:清除当前行并进入插入模式
  • cw: 清除当前单词并进入插入模式

3.4 可视模式

要是前面都学会了,可视模式就比较简单了,而且你将会经常用到这个模式。我会把这个模式称做「选择模式」,接下来我们就来探索一下是如果选择的。

其实也就两个关键的点:v(字符选择)、V(行选择)

3.4.1 v(小写 v)

在 normal 模式下,按一下 v,然后可以按 l,重复按 l,你会发现右边的在一直被选中(高亮的部分)。同样的操作,按了 v,然后再练习一下按 h、j、k。

选中的目的是什么呢?就是为了进行一些编辑操作,比如删除 d (实质是剪切)、复制 y。

小提示,常常选中之后用 c 也是比较好的选择哦,剪切并进入插入模式。

3.4.2 V(大写 V)

V 就是选中行,也很简单。按了 V 之后,然后按 j、k,就可以上下选择行了,然后一次性删除 d、复制 y,就比较方便。

3.5 组合操作

这个功能就比较强悍了,很适用,强烈推荐。
先来记公式:operator + i|a + scope

operator 就是我们前面提到的插入(c)、剪切(d)、复制(y)以及选择(v),i 表示 scope 范围内,a 表示包含 scope 标签,scope 就是操作的范围了。

实例:
以下如果将 i 换成 a,则会将符号也包含进去

  • vib(选中小括号内的内容)
  • viB(选中大括号内的内容)
  • vi"(选中双引号内的内容)
  • vi'(选中单引号内的内容)
  • vi<(选中尖括号内的内容)

3.6 撤回、查找、替换

  • u: 撤回上次操作(效果跟 command + z 效果一样)
  • /|?xxx:表示在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示向上查找.其中xxx可以是正规表达式。查找到以后, 再输入 n 查找下一个匹配处, 输入 N 反方向查找.
  • :%s/original/replacement:检索第一个 “original” 字符串并将其替换成 “replacement”
  • :%s/original/replacement/g: 检索并将所有的 “original” 替换为 “replacement”
  • :%s/original/replacement/gc:检索出所有的 “original” 字符串,但在替换成 “replacement” 前,先询问是否替换

这些操作一般编辑器都自带有很好的快捷键,记不住也没啥。

4 结束语

我写这篇文章的目的不是为了总结什么知识点(其实当你 vim 用熟了,这些命令完全形成肌肉记忆了,根本不用记下来),或者说想发篇文章之类的,仅仅是想给 vim 做一个宣传,让更多的人接触 vim,让更多的开发者在开发上效率更高。如果你觉得这篇文章对你有帮助,请转发给更多的人让他们都了解了解。

最后想提醒的就是,对于这些快捷键,死记是很难记完的,根据我总结的一些语义话的方式去记,有公式的记公式,可能要快一点,然后就是多实践,敲多了自己就记住了。我刚开始学的时候,还不知道有那些助记符,基本完全靠死记硬背,我就是用一张纸,然后把命令手写抄到纸上,放在我的电脑旁,忘了就马上拿来看看,别说,效果还挺好的。

祝你们好运!

大家好,我是桃翁,我为自己代言!

参考文章:
VIM 百度百科
如何用Vim提高开发效率

目录
相关文章
|
24天前
|
NoSQL 中间件 Java
字节面试:聊聊 CAP 定理?哪些中间件是AP? 哪些是CP? 说说 为什么?
45岁老架构师尼恩在其读者交流群中分享了关于CAP定理的重要面试题及其解析,包括CAP定理的基本概念、CAP三要素之间的关系,以及如何在分布式系统设计中权衡一致性和可用性。文章还详细分析了几种常见中间件(如Redis Cluster、Zookeeper、MongoDB、Cassandra、Eureka、Nacos)的CAP特性,并提供了高端面试技巧,帮助读者在面试中脱颖而出。尼恩还推荐了其团队编写的《尼恩Java面试宝典PDF》等资料,助力求职者准备面试,提升技术水平。
|
2月前
|
Arthas Kubernetes Java
字节面试:CPU被打满了,CPU100%,如何处理?
尼恩,一位拥有20多年经验的老架构师,针对近期读者在一线互联网企业面试中遇到的CPU 100%和红包架构等问题,进行了系统化梳理。文章详细解析了CPU 100%的三大类型问题(业务类、并发类、内存类)及其九种常见场景,提供了使用jstack和arthas两大工具定位问题的具体步骤,并分享了解决死锁问题的实战案例。尼恩还强调了面试时应先考虑回滚版本,再使用工具定位问题的重要性。此外,尼恩提供了丰富的技术资料,如《尼恩Java面试宝典》等,帮助读者提升技术水平,轻松应对面试挑战。
字节面试:CPU被打满了,CPU100%,如何处理?
|
2月前
|
存储 缓存 关系型数据库
滴滴面试:单表可以存200亿数据吗?单表真的只能存2000W,为什么?
40岁老架构师尼恩在其读者交流群中分享了一系列关于InnoDB B+树索引的面试题及解答。这些问题包括B+树的高度、存储容量、千万级大表的优化、单表数据量限制等。尼恩详细解释了InnoDB的存储结构、B+树的磁盘文件格式、索引数据结构、磁盘I/O次数和耗时,以及Buffer Pool缓存机制对性能的影响。他还提供了实际操作步骤,帮助读者通过元数据找到B+树的高度。尼恩强调,通过系统化的学习和准备,可以大幅提升面试表现,实现“offer直提”。相关资料和PDF可在其公众号【技术自由圈】获取。
|
2月前
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
|
2月前
|
关系型数据库 MySQL Java
DDD面试题:DDD聚合和表的对应关系是什么 ?(来自蚂蚁面试)
尼恩,一位40岁的资深架构师,分享了其读者群中关于DDD(领域驱动设计)的面试题及解答,涵盖DDD架构落地、微服务拆分、聚合与MySQL表的对应关系等内容。尼恩通过系统化的梳理,帮助读者在面试中展现强大的技术实力,让面试官印象深刻。此外,他还提供了《尼恩Java面试宝典》等多本技术圣经PDF,助力读者提升架构、设计和开发水平。关注【技术自由圈】公众号,获取更多资源。
DDD面试题:DDD聚合和表的对应关系是什么 ?(来自蚂蚁面试)
|
2月前
|
Java API 对象存储
JVM进阶调优系列(2)字节面试:JVM内存区域怎么划分,分别有什么用?
本文详细解析了JVM类加载过程的关键步骤,包括加载验证、准备、解析和初始化等阶段,并介绍了元数据区、程序计数器、虚拟机栈、堆内存及本地方法栈的作用。通过本文,读者可以深入了解JVM的工作原理,理解类加载器的类型及其机制,并掌握类加载过程中各阶段的具体操作。
|
6月前
|
SQL 关系型数据库 MySQL
字节面试:MySQL自增ID用完会怎样?
字节面试:MySQL自增ID用完会怎样?
73 0
字节面试:MySQL自增ID用完会怎样?
|
6月前
|
存储 Java 容器
研二学妹面试字节,竟倒在了ThreadLocal上,这是不要应届生还是不要女生啊?
【6月更文挑战第1天】研二学妹面试字节,竟倒在了ThreadLocal上,这是不要应届生还是不要女生啊?
50 5
|
5月前
|
前端开发 数据挖掘
字节面试:领域、子域、核心域、通用域和支撑域怎么划分?
领域驱动设计(DDD)通过划分业务领域和子域简化复杂性。领域是业务问题的范围,子域是更小的专业部分。核心域代表业务的核心竞争力,如电商中的商品、订单和支付;通用域提供跨领域服务,如用户管理;支撑域支持核心功能,如物流、客服和数据分析。这种划分帮助团队专注关键业务,提高开发效率和软件对业务需求的契合度。
255 0
|
7月前
|
消息中间件 监控 Java
滴滴面试:谈谈你对Netty线程模型的理解?
Netty 线程模型是指 Netty 框架为了提供高性能、高并发的网络通信,而设计的管理和利用线程的策略和机制。 **Netty 线程模型被称为 Reactor(响应式)模型/模式,它是基于 NIO 多路复用模型的一种升级,它的核心思想是将 IO 事件和业务处理进行分离,使用一个或多个线程来执行任务的一种机制。** ## 1.**Reactor三大组件** Reactor 包含以下三大组件: ![image.png](https://cdn.nlark.com/yuque/0/2024/png/92791/1717079218890-89000a00-48bc-4a1a-b87e-e1b6
72 2
下一篇
DataWorks