【90 天挑战 HCIE Cloud】第 3 天 编辑器之神 VI

举报
齐月太白 发表于 2021/08/21 09:56:27 2021/08/21
【摘要】 VI,对文字工作者来说,是一个比肩盲打的神器,和盲打一样,也有着一定门槛,一旦熟练使用,渐入佳境,就能体会“以思维的速度码子 (shreds text at the speed of thought) ” 所带来的沉浸式体验与乐趣

编辑器之神 VI

VI_001 再见 Word!

在数字时代的今天,盲打已经是一项基础技能(不看键盘打字)。多年前,笔者开始学习盲打,在一个打地鼠软件上,类似于下图这种,学会了基本指法。盲打技巧真正的突飞猛进,是在 QQ 开始流行的那段时间 —— 伴随着“滴滴声”,手指在键盘飞舞,沉迷于全国网友的通宵码子聊天,打下了 IT 从业人员的坚实基础…

image.png

VI,对文字工作者来说,是一个比肩盲打的神器,和盲打一样,也有着一定门槛,一旦熟练使用,渐入佳境,就能体会“以思维的速度码子 (shreds text at the speed of thought) ” 所带来的沉浸式体验与乐趣

笔者强烈安利使用 VI 提升文字工作者的效率,不仅仅适合写代码,也非常适合写博客、写文章比较多的朋友。是时候和微软的 Word 说再见了,使用 VI + Markdown + Git 的组合,在码字、排版、多人协同等方面,有着无可比拟的优势,VSCode (哈哈又是微软)是这个组合的集大成者,一旦用上,就再也回不去了

是的,您猜的没错,“90 天挑战 HCIE Cloud” 系列文章使用的就是安装了 VI 和 Markdown 插件的 VSCode,这是在繁忙工作下,依然能做到每天一更的重要原因

作为一款超过 40 年历史的编辑器,VI 在 IT 领域绝对是古化石般的存在,但奇迹的是,在今天依然拥有大量的忠实用户,常年占据 Top 5 最受开发者欢迎的编辑器行列。VI 到底拥有什么样的魔力,在最最喜新厌旧的行业,做到了长盛不衰,下面我们一起来了解下 VI 的前世今生

VI 诞生于 1976 年,比第一只光学机械鼠标出现的时间还要早 4 年,一开始是为 Unix 系统开发的,主要结合 QWERTY 键盘使用。VIM (VI IMproved) 是 VI 的改进版本,兼容了 VI 特性,同时添加了很多新的功能,如多窗口、宏、视图模式等,目前 Linux 使用的基本都是 VIM 版本,本文介绍的也是针对的 VIM 版本

VI 最初定位是给终端用户远程登录 Unix 服务器做文本编辑得,这个定位决定了 VI 的几项关键特性:轻便快捷、纯文本、完全依赖键盘、适合 Terminal 终端使用,这些特性延续至今,一直没变。VI 的终极使命就是怎么样在 26 个字母的基础上,榨取最佳的文本编辑和输入效率,在这一点上,无人能出其右

VI 是几乎所有 Linux 发行版本默认内置的编辑器,也是最受 Linux 用户欢迎的一款编辑器。Linux 的管理和 Unix 一样,通过 Terminal 命令行终端完成管理操作,所有的图形化编辑器没了用武之地,VI 也就成了 Linux 文件编辑的必然选择

除了适合 Terminal 纯命令行的交互方式外,VI 还有很多的优点,受到开发者普遍认可:

  • 跨平台:服务器和桌面操作系统生态(不考虑移动端,VI 全键盘操作不适合移动触屏交互),微软、苹果、Linux 三分天下,微软在桌面和服务器领域都有很强的统治力,默认是不自带 VI 编辑器的,但有一众软件支持 VI 编辑器,最知名的是 gvim,vscode 通过内嵌插件的方式也支持 vim。苹果在桌面操作系统有着最佳的用户体验和口碑,自带的 MacVim 是公认的最好用的 VI 软件。Linux 就更不用说了,原生就提供对 VI 的支持。VI 的软件自定义配置 vimrc 支持跨平台共享,确保了用户在不同平台上一致的工作体验
  • 插件:数量众多且质量上乘的各种类型插件扩充了 VI 的能力,这是开源软件的独特优势,能吸引到诸多软件大拿共建生态
  • 性能:快人一步永远重要,VI 小巧的身躯拥有巨大的能量,不需要消耗多少硬件资源,能快速响应用户操作,完成诸多复杂文字编辑功能,基本上是指哪打哪,不带停留
  • 可玩性:使用 VI 不是简单的用一个编辑软件,里面有很多有趣且实用的特性可以挖掘,体验 VI 的过程有点像寻宝,可能一步留神又发现一个有意思的玩法
  • 效率:这是 VI 的核心要素,用户一旦迈过瓶颈期,熟悉 VI 的操作模式、语法,文本编辑效率会得到大幅提升,最高效的快捷键(最少的手指位移)、组合式语法、精确位移、重复性操作支持、register 文本寄存、命令模式、视图模式、宏等众多特性,让码字变成一种创造性的工作体验,有时会让人欲罢不能~

To sum up,VI shreds words at the speed of thoughts,让码字也能进入心流 (Flow) 的状态,这真的是一种奇妙的体验,副作用是最近博客和邮件里越来越喜欢长篇大论。然而,依然强烈推荐 VSCode VI + Markdown + Git 的组合,say goodbye to Word !

小测验:VI 入门也没有想象中那么难,VimTutor 是一个非常棒的学习教程,请登录网站openvim.com,按照指令进行学习,熟悉 VI 的基本操作,完成所有练习预计在 20 分钟左右

VI_002 停下来思考 Normal-mode

画师制作一幅画,画笔有超过一半的时间不在画布上,画师可能提笔悬空构思,也可能将画笔放在支架上琢磨布局,真正执笔创作的时间并不会很长(引用自 Practical Vim)

写一篇文章也是一样,写字是一个输出的过程,占的时间比重往往不超过 50%,大量的时间用于构思、浏览、检查和对文章进行修改,像王勃提笔一气呵成“落霞与孤鹜齐飞,秋水共长天一色”这样的神作,少之又少;大多数人写文章,还是像曹公批阅十载、增删五次写红楼梦一样,反复修改才得终稿

image.png

所有“码字类”工作,包括写文章、写博客、写小说、写代码,和画画这种艺术创作一样,重要的不是疯狂的码字输出,而是码字间隙思考的过程。VI 的设计理念就是这样的,大多数时间,请 Esc 退出插入模式下的码字状态,停下来思考,决定下一步往哪去

VI 支持 3 种编辑状态,包括正常模式 Normal-mode、插入模式 Insert-mode 和可视模式 Visual-mode。默认打开 VI,进入的就是正常模式 Normal-mode,就是针对浏览、修改文章的时间占比过半场景设计的。正如其名称所展示的,用户只要不是在打字输入文本,默认就应该处于 Normal-mode。这点是和其他编辑器最大的不同,也是新手刚开始使用 VI,最容易困惑的地方:怎么键盘按了半天,没什么反应~

Normal-mode 的好处显而易见:此时不是输入状态,键盘上的所有按键,都可以作为功能键,用户可以通过最少的手指位移,完成想要的编辑动作,操作指令简单快捷,下面介绍 Normal 模式下的相关操作,内容包括位移(移动光标)、操作符以及两者之间的组合

位移
VI 是完全基于键盘操作的编辑器,核心理念是保持手的位置,不要离开键盘核心区域,像下图展示的:

image.png

VI Normal-mode 是基于这个理念设计的,用 Word 和其他编辑器时,位移用的最多的就是鼠标和方向键,而 VI 倡导的实践经验,要求完全不一样

  1. 首先,远离鼠标
  2. 禁用方向键,使用 hjkl 代替,不要把手指挪到离键盘核心区那么远的地方~
  3. 少用 hjkl,逐个字符位移太慢,要一个字符串或者一段一段的移动光标
  4. 尽可能用 1~2 个键将光标移到目标位置,实在不行,也应该在 3 个键内完成(绝对不要超过 5 个键)

想象一下,将手从键盘拿开,找到鼠标,将光标移动到指定的位置,再将手指放回键盘,相比按 3 下键盘,肯定要慢很多,这是 VI 高效率完成文字编辑的重要原因之一

VI 支持的位移指令参考下表

类别 键位 用途
字符 h 向左 1 个字符
j 向下 1 个字符
k 向上 1 个字符
l 向右 1 个字符
单词 w word 到下一个单词首字符
b back 到上一个单词的首字符
e end 到下一个单词的末字符
ge 到上一个单词的末字符
行移 0 到行首
^ 到行首非空字符
$ 到行尾
g_ 到行尾首个非空字符
( 到下一行行首
) 到上一行行首
段落 { 到上一个段落
} 到下一个段落
Ctrl-d 向下翻半页
Ctrl-u 向上翻半页
Ctrl-f 向下翻页
Ctrl-b 向上翻页
H High 到屏幕首行
M Medium 到屏幕中间
L Low 到屏幕末行
查找 f find 向后段内查找单个字符
F Find 向前段内查找单个字符
t to 向后句内查找单个字符的上一个字符
T To 向前句内查找单个字符的下一个字符
/ 向下查找某个单词
? 向上查找某个单词
% 到 () [] {} 括弧另一边
跳转 gg go 到首行
G Go 到尾行
10gg 或 10G 到第 10 行

注:Ctrl-d 指同时按下 Ctrl 和 d 按键

单词类的位移命令 w b e,有对应的大写的版本 W B E,主要区别是大写版本的位移距离要更远一点,如 W 相比 w,会跨越单词间的标点符号,这个多试几次就能体会到差别;建议只用小写版本,位移距离不够可以叠加数字(参考下面描述)

Normal-mode 位移操作可以和数字组合一起,比如跳转到 5 个单词之后,不需要连续按 5 下 w 键,只要连续按下 5w 两个键的组合即可,往前跳 3 个段落,也可以用 3{ 的组合键,熟练使用数字加位移键组合,基本可以实现指哪打哪,这是脱离鼠标后必备的技能

注:使用现代的 vim 编辑器如 vscode,都兼容鼠标和全键盘操作,能最大化的利用两个工具的编辑效率,也不用教条的真把鼠标扔掉了,哪个顺手、哪个快,就可以用哪个,比如鼠标滚轮的用户体验,就是键盘很难替代的

操作符

Normal-mode 支持对文本进行高效编辑,VI 提供丰富操作符,包括复制、删除、大小写转换等,且支持操作符用户自定义,有非常强的 DIY 属性,用户可以将自己最常用到的一些操作,自定义成为操作符

操作符分为两类,包括组合操作符和独立操作符,前者可以结合位移一起使用,后者独立使用,参考下表介绍

类别 操作符 用途
组合 y yank 复制
d delete 删除
c change 删除并进入 Insert-mode
g~ 大小写切换
gu uppercase 转换为小写
gU 转换为大写
> 向右缩进
< 向左缩进
独立 p paste 黏贴
x 删除当前字符
r replace 替换当前字符
s 删除当前字符,进入 Insert-mode
~ 切换当前字符大小写
Ctrl-a 给光标后的下一个数字加 1
Ctrl-x 给光标后的下一个数字减 1

独立操作符用起来比较简单,输入完单条指令即可完成对应操作,且可以组合数字一起用,如 5x 的组合键,可以删除当前字符及其后的共 5 个字符

组合类的操作符有两种特殊用法,效果和独立操作符很像,使用很广泛,一定要掌握:

  • 叠词:如 yy dd cc g~~ guu gUU,对当前行执行复制、删除和大小写变换操作
  • 大写: 如 Y D C,对光标当前位置到行尾内容,执行复制、删除操作

注:独立类操作符 s 也有大写的用法,输入 S 可删除本行内容并进入 Insert-mode,这个命令挺好用的

组合类的操作符和位移的结合,是 VI Normal-mode 下最精髓的内容,下面重点介绍

操作符与位移

组合类的操作符有点像及物动词,后面可以跟操作对象 —— 位移,操作符定义要执行的动作,位移定位动作施加的对象,这两者结合起来,威力巨大,且有着强大的灵活性

列举几个场景,看一下操作符与位移的组合,可以做哪些事情:

场景 组合 命令说明
删除全文 ggdG gg 光标移动首行,d 是动词,G 是名词,指从当前行(首行)到尾行的位移
复制当前 3 行 y3j y 是动词复制,3j 指下移 3 行
删除从光标到后面第 1 个 g 字符 dfg d 是动词删除,fg 是指从当前光标到下一个 g 字符的位移
删除从光标到第一个字符 task d/task d 是动词删除,/task 查找光标起始位置到后面的第一个 task

组合操作符可以配合一种特殊的位移指令,如 aw (a word) iw (inner word),选择的范围是光标下的单词,两者的区别是 aw 的范围要稍微广一些,会包括单词旁边的 1 个空字符,而 iw 只包含单词本身;除了 word 位移外,还可配合其他类型位移指令使用,介绍如下

位移指令 选择范围(橙色区域)
aw This is a testcase
iw This is a test case
ab This is a (block test) case
ib This is a (block test) case
as This is a test case
is This is a test case

aw 此类的位移指令,其本质是选择一段内容,无法单独使用,必须配合操作符一起用,这类指令还有很多,除了上面列出的,还有 a( a[ aB a{ a" a’ a` a< ap 等多种用法,且这些都有对应的 i 版本如 i[

注:

  • a( 和 ab 的效果一样
  • a{ 和 aB 的效果一样
  • at 指 html 的 tag 标签如 <aaa> </aaa> 包含的内容
  • ap 指一个段落的内容

从上面的示例可以看出来,操作符和位移是任意组合关系,彼此之间没有依赖,意味着后面有了更多的组合操作符或者位移指令,都适用这套逻辑,如自定义首行注释的操作符 //,再定义一个选择全文的位移指令 ae,两者组合 //ae 就是对全文进行注释,用起来是不是很酷

操作符与位移的组合,还可以与数字进行再次组合,如 3dw 即删除当前光标下的 3 个单词,3y2j 相当于复制 6 行内容

小测验:请使用 VI 新建一个文档,逐一试验本文中列出的操作符和位移的可能组合

VI_003 有趣的玩法

VI 在开发者群体很受欢迎,是一旦入坑很难爬出来的那种,原因之一是 VI 非常多有趣且有用的玩法,熟练使用形成依赖,就再也离不开了;下面按 Tips 分别介绍部分玩法

Tips 1. Don’t repeat yourself

经常写文章的人都知道,有时需要对不同位置做一样的修改,如替换某个写错的单词等,常规做法是将鼠标分别移动到各个位置,逐个进行修改。VI 的操作符 dot command . 用于重复执行上一次变化内容,被认为是 VI 最强大和最常用的命令

参考下面示例,纪伯伦《沙与沫》中的一个片段,第 2~8 行都缺少句点

1 曾有七次我鄙视了自己的灵魂:
2 第一次是在她可以上升而却谦让的时候
3 第二次是我看见她在瘸者面前跛行的时候
4 第三次是让她选择难易,而她选了易的时候
5 第四次是她做错了事,却安慰自己说别人也同样做错了事
6 第五次是她容忍了软弱,而把她的忍受称为强
7 第六次是当她轻蔑一个丑恶的容颜的时候,却不知道那是她自己的面具中之一
8 第七次是当她唱一首颂歌的时候,自己相信这是一种美德

image.png

假定起始光标位置在第 1 行第 1 个字符 上,如果我们用 Word 来做,只能不停移动鼠标,一个个添加句点,VI 则有 N 种高效率的办法解决问题,我们这里就介绍 dot command 的处理方法

序号 命令 说明
1 j 光标下移一行
2 A 光标移动到行末,进入 Insert-mode,输入句号 。
3 [Esc] 按 Esc 键退出 Insert-mode
4 j 光标下移一行
5 vG 进入视图模式,选择第 3 行 ~ 第 8 行
6 :’<,’>normal . 对选择的所有行,重复上一次动作,在行尾添加句号 。

想象一下,如果有超过 50 行都需要添加句号,上面这种可重复操作的方式,是不是超级强大

Tips 2. 可控制的 undo redo

VI normal 模式下,undo 指令是 u,redo 指令是 Ctrl-r,其他编辑器的 undo redo 的颗粒度,都是由软件自行控制,比如 Word 会把任何一个小的变动,记录到 undo redo 的清单,用于后续回溯

VI 的 undo redo 机制不同,用户每一次从 Normal-mode 进入 Insert-mode,完成编辑操作所做的所有修改,就是 undo 和 redo 可以控制的一个原子状态:也就是说,用户能通过有意识的退出 Insert-mode,主动控制 undo redo 的颗粒度 —— 写代码好处非常明显,能快速回退到某一个编辑状态

Tips 3. 剪贴板万花筒

众所周知,写文章的第一神器是“复制、黏贴”,Word 等编辑器用的是系统剪贴板,保存的内容只有一份,遇到大量复制黏贴内容,用起来会很繁琐,参考下面的场景

  1. 复制内容 a
  2. 将内容 a 黏贴到 x 处
  3. 复制内容 b
  4. 将内容 b 黏贴到 y 处
  5. 复制内容 a
  6. 将内容 a 黏贴到 z 处

上面介绍的操作场景,大家应该会经常遇到,这个时候要将鼠标飞快的从 a -> x -> b -> y -> a -> z,如果涉及更多的复制项,鼠标切换的会更加频繁,遇到特别大的文档时,来回的使用鼠标滚轮切换位置,会占用很多时间

VI 有一个剪贴板万花筒,提供 26 个自定义剪贴板 register a~z,语法用起来非常简单

序号 命令 说明
1 "ayy 复制当前行到寄存器 a,替换原来内容
2 "Ayy 复制当前行,添加到寄存器 a
3 "ap 将寄存器 a 的内容复制到光标位置

复制的内容存储到寄存器 a,后面可以反复使用;建议将经常黏贴的内容放到寄存器里,有需要用的地方,3 个按键 "xp 就能快速完成复制操作

Tips 4.全局定位

写长文章时,经常要大幅度移动光标位置,VI 支持 mark 记号功能,将文本位置存储起来,后面要用的时候,快速跳转对应位置

序号 命令 说明
1 ma 将当前光标位置保存到 mark a
2 `a 光标跳转到 mark a 存储的位置

Tips 5. 全文替换

全文替换是基础能力,VI 这方面的能力非常强大,能够精准选择执行替换操作的范围以及替换内容,参考下面说明:

# 将全文所有的“铜牌”换成“金牌”
:%s/铜牌/金牌/g
# 将第 1~10 行“铜牌”换成“金牌”
:1,10s/铜牌/金牌/g
# 将第 2~8 行的末尾添加句号 。
:2,8s/$/。/g

VI 的替换操作还支持正则表达式,可以对文本进行更精准的筛选,功能非常强大,建议上网查一下了解相关用法

注:VI 有趣用法还有很多,在这里不一一介绍,用户可以在后续使用过程中,逐步揭开 VI 的神秘面纱

小测验:请试用 VI 的剪贴板万花筒和全局定位功能

Linux 编辑百宝箱

笔者在 HCIE Cloud 机试时有一个题目,要求修改 docker 容器下的数据库配置文件 my.cnf,由于容器镜像安装的是精简 Linux,默认不带 VI 编辑器,遇到这种情况,该怎么处理呢?

大可不必慌张,Linux 可选编辑器种类多样,称之为编辑百宝箱也不为过,可任选最适合的一种完成文本编辑工作,下面分别举例说明

image.png

cat

cat 经常用于文件内容显示,如展示系统中已创建的用户名,可以使用指令 cat /etc/passwd 查看

[root@hcie ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

cat 英文全称是 concatenate 连接,连接操作的用法如下

cat file1 file2 >> file3

上面的操作将 file1 和 file2 文件内容拼接在一起,并导入到 file3 中

cat 也可用于向文件中写入新的内容令:

cat << EOF >> /ect/mysql/my.cnf
[mysqld]
log-bin = mysql-bin
server-id = 2
EOF

上面的指令往 my.cnf 文件末尾追加写入键盘输入的内容,直到遇到结束符 EOF 后,停止写入操作;如果使用 > 替换 >>,则新输入的内容将完全覆盖原来文件中的内容

echo

echo 的用法和 cat 类似,也可以显示出文件内容,支持文件内容编辑的方式和 cat 是一样的

echo << EOF >> /ect/mysql/my.cnf

sed

sed 语法和 VI 的命令行指令类似,对读入的文件进行逐行扫描,并根据 sed 语句定义的规则进行处理,参考下面命令

sed 's/old/new/g' file  # 将文件中所有的 old 替换为 new
sed '/old/ d' file  # 将文件中含 old 单词的行删除
sed '/^hello/ d' file  # 删除文件中以 hello 开头的行
sed '/world$/ d' file  # 删除文件中以 world 结尾的行

scp

有时候文档保存在另一个 Linux 服务器上,只需要将文档传过来就行,这时候用 scp 指令最合适,参考下面指令

scp local_file remote_username@remote_ip:remote_folder # 将本地文件复制到远端文件夹
scp local_file remote_username@remote_ip:remote_file # 将本地文件复制到远端文件

scp -r local_folder remote_username@remote_ip:remote_folder # 将本地目录复制到远端文件夹

小测验:将远端文件和目录复制到本地,命令应该怎么执行

实时更新信息,请关注微信公众号和微博 齐月太白

image.png

点击进入微博 齐月太白:https://weibo.com/moontaibai

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。