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

网友投稿 646 2022-05-28

编辑器之神 VI

VI_001 再见 Word!

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

是的,您猜的没错,“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%,大量的时间用于构思、浏览、检查和对文章进行修改,像王勃提笔一气呵成“落霞与孤鹜齐飞,秋水共长天一色”这样的神作,少之又少;大多数人写文章,还是像曹公批阅十载、增删五次写红楼梦一样,反复修改才得终稿

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

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

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

位移

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

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

首先,远离鼠标

禁用方向键,使用 hjkl 代替,不要把手指挪到离键盘核心区那么远的地方~

少用 hjkl,逐个字符位移太慢,要一个字符串或者一段一段的移动光标

尽可能用 1~2 个键将光标移到目标位置,实在不行,也应该在 3 个键内完成(绝对不要超过 5 个键)

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

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

注: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 属性,用户可以将自己最常用到的一些操作,自定义成为操作符

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

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

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

叠词:如 yy dd cc g~~ guu gUU,对当前行执行复制、删除和大小写变换操作

大写: 如 Y D C,对光标当前位置到行尾内容,执行复制、删除操作

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

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

操作符与位移

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

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

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

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

注:

a( 和 ab 的效果一样

a{ 和 aB 的效果一样

at 指 html 的 tag 标签如 包含的内容

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 第七次是当她唱一首颂歌的时候,自己相信这是一种美德

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

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

Tips 2. 可控制的 undo redo

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

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 等编辑器用的是系统剪贴板,保存的内容只有一份,遇到大量复制黏贴内容,用起来会很繁琐,参考下面的场景

复制内容 a

将内容 a 黏贴到 x 处

复制内容 b

将内容 b 黏贴到 y 处

复制内容 a

将内容 a 黏贴到 z 处

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

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

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

Tips 4.全局定位

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

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 可选编辑器种类多样,称之为编辑百宝箱也不为过,可任选最适合的一种完成文本编辑工作,下面分别举例说明

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 # 将本地目录复制到远端文件夹

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

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

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

Linux 弹性云服务器 ECS

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【删库跑路】—Linux系统自杀实验 rm -rf /* 及如何抢救和预防
下一篇:拉我室友打了一把英雄联盟搞会了IntelliJ IDEA的安装与配置
相关文章