Unix 方式...或者为什么你实际上想要使用 Vim
我喜欢Dev.to上的所有 Vim教程。它们太棒了!它们 都是很好的入门指南。请务必全部阅读!
但...
我想告诉你们 Vim 的秘诀。有点跑题了。你知道的,就是那种在少林三十六房之类的地方学到的东西,因为不知为什么,我们喜欢把软件开发的比喻和武术或者禅宗混在一起。1
让我告诉你有关 Unix 的方式......
Unix 哲学
不,我不会解释 Unix 是什么。你可以用 Google 来解释。这里有一个维基百科“Unix 哲学”页面的链接,内容很长,所以我们还是直奔主题吧,好吗?
用古代大师道格拉斯·麦克罗伊的话来说:
编写只做一件事的程序,并把它做好。
说起来容易做起来难。如果你想做多件事怎么办?
管道
管道是 Unix 系统中的瑰宝。对我来说,它是它至高无上的荣耀。你可以将一个程序的输出作为另一个程序的输入——就像把几根水管连接在一起,让水流通过一样。
假设我想在某个地方随机找到一个包含“bob”的单词。在类 Unix 机器上,你会找到一个包含大量单词的文件——一个词典。Mac 和 BSD 系统上的词典位于/usr/share/dict/words
。
我们可以使用该程序cat
在终端中显示它:2
cat /usr/share/dict/words
但现在我们需要找到所有包含“bob”的单词...好吧,我们可以用以下方式打开文件grep
grep bob /usr/share/dict/words
但我发现使用管道将输出传递到更直观cat
,我们用管道符号来写:3grep
|
cat /usr/share/dict/words | grep bob
好了,这样我就得到了所有包含“bob”的单词——我怎么才能随机得到一个呢?有几种方法可以做到,但这里有一种方法:我shuf
的电脑上有一个程序,它会随机打乱你输入的单词顺序:
cat /usr/share/dict/words | grep bob | shuf
现在我只想要其中一行——具体哪一行无所谓。那为什么不直接取第一行呢?head
就可以了——它可以直接返回输入的第一行:
cat /usr/share/dict/words | grep bob | shuf | head -1
瞧
> cat /usr/share/dict/words | grep bob | shuf | head -1
bobolink
> cat /usr/share/dict/words | grep bob | shuf | head -1
nabobish
这是什么意思?我可以用其他程序来帮忙——open
至少在 OSX 上,我可以找到一个包含该单词的 URL,用一个叫以下程序的便捷程序parallel
:
cat /usr/share/dict/words | grep bob | shuf | head -1 | parallel open https://en.wiktionary.org/w/index.php?title={}
然后...然后...然后...
重要的教训是:我们没有编写一个新程序。我们没有下载一个新的随机词生成器。我们所做的是使用一系列只做一件事(并且只做好一件事)的程序,然后将它们组合在一起,得到了我们想要的结果。
但是你答应过我们 Vim!
是的,没错。Vim。我从开始开发就一直在用 Vim——我以前用它来写营销邮件,让写营销邮件的过程更有趣一些(这样也更容易忍受)。我们总是喋喋不休地谈论 Vim 的快捷键——它的神奇之处hjkl
——但现在几乎任何文本编辑器都可以添加这些快捷键了。
那么我认为 Vim 的优点是什么?
这:
:%!
对于我们这些 Vim 新手来说::
表示我们正在输入一个命令。%
表示当前缓冲区中所有行的引用。!
表示我们将在 shell 中运行一个命令。
上述代码将通过 shell 命令将当前缓冲区的内容替换掉。试试看!
:%! shuf
嗯,这很有趣,虽然破坏性很强。但它可以更有用。想要重新格式化缓冲区中的所有 JSON 吗?jq
你的朋友是:
:%! jq '.'
或者您可能希望 Python 做同样的事情:
:%! python -m json.tool
想将 Markdown 内容以 HTML 格式查看?试试pandoc吧:
:%! pandoc
您可以使用一系列行或视觉选择来完成此操作 - 与 Vim 一样,可以获得帮助:
:h !
现在,您可以利用其他人的程序来扩展您的编辑器,而无需像使用 VSCode、Atom 或 Sublime 那样安装额外的修改或插件,也无需使用新的编辑器。如果您发现了一些有用的东西,并且反复使用它,您可以编写一些 VimL 代码,使命令更易于运行。
另一个优点 - 通过学习 Unix 环境中的一些简单的、面向一件事的程序,您将能够在编写的越来越多的程序中反复使用它们。
交给你
当你遇到一个没有工具可以解决的问题时,这一点就变得非常真实。对我来说,当我需要将一些大型 JavaScript 对象转换为 JSON 时,情况就是这样。我找不到在编辑器4中轻松解决的办法。
所以我写了一个比较短的 NodeJS 脚本,它接受 JavaScript 流并输出 JSON 流。虽然不太美观,但很有效。
我已经使用管道友好接口编写过一次了,现在我可以对 Vim 缓冲区中的 JavaScript 对象执行此操作:
:%! js2json
或者在 shell 中:
cat some.js | js2json | curl -X POST -d @- http://gimme-json.com
或者我可能永远不会再使用它。
但它就在那里。我利用它与我编写的程序集成的功能扩展了我的编辑器。感谢 Vim!感谢 Unix!
Vi 的本质是 Unix 的本质
Vim 之所以伟大,并非因为它能让你的朋友对你那些深奥的按键技巧印象深刻,5或者因为你那精湛的盲打技术让你双手不离开键盘就能每秒打出数十亿个字符。这些虽然有趣,但却很肤浅。我们不应该沉迷于它们,也不应该沾沾自喜于了解它们。
Vim 很棒,因为它无处不在——如果你了解 Vim/vi,那么你在大多数 Unix 系统上都能找到可用的编辑器。它很棒,因为你能够将它集成到 Unix 工具中——更棒的是,你可以自己编写这些工具,因为它们并不复杂,而且你就是程序员!
你也会在其他编辑器中看到同样的想法。用Master Wq的话来说:
Vim 并非永久不变。nvi 并非永久不变。vi 本身并非永久不变,只有 vi 的本质。Emacs 有 vi 的本质,nano 有 vi 的本质,甚至 Notepad 也有 vi 的本质。你眼界变窄,变得执着……。你必须离开。等你掌握了 Emacs 再回来。6
您可以使用简单的 Emacs 命令执行相同的操作:
C-x h C-u M-| js2json
祝您黑客愉快!
-
这都是忍者和公案,或者木工和“工艺” 。↩
-
一个比较难的解决方法是写一个宏。那样既浪费时间,又可能同样耗时 。↩
-
你们
ggg?G
现在都必须尝试一下。↩ -
只缺少两个编辑器,你应该尝试一下:
ed
和acme
。↩