挑战一晚上从零入门lua语言,直接对标Python快速上手(lua语言和python)
670
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
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小时内删除侵权内容。