零秒精通Emacs:上帝之眼与上帝之手

项目 步步为营,零秒精通Emacs 的第三章“03.God’s-Eyes-and-Hands-by-Dired-and-Bookmarks” 宕延半年多,迟迟写出来。因为始终没有思路,怎样写好司空见惯简单,而往往不见其革命性突破的Dired。
我希望别人从这篇文章的视角审视dired的时候,会第一时间发出“哇!”的一声。就如每时每刻的呼吸,在幼儿园的某一天,我们突然知道“哇,原来空气存在”。

Take everything for granted 的朋友请务必忍耐不要留言。

亘古以来,有机世界与无机世界之间有一道无法跨越的鸿沟。上帝吹入生命而成有机,而矿物则是没有“活力”的无机物。因此,无机物与有机物毫不相干,无机物只能制造无机物,似乎正如石头原料只能制造出更加精美的石头,却万万不能生产出“天价猪肉”。

然而,公元1828年,上帝改变了主意,人类跨越天堑。

1.跨越鸿沟

2赞

个人考虑,不考虑仅仅是个人建议的建议。(脾气不好,也没有耐心,不要再留言)

1.跨越鸿沟

1828年数九寒冬的腊月里,德国的青年化学家维勒兴奋地告知老师,他从无机物中制得了有机物尿素的消息。这一刻,横亘千年的传说就此打破,人类大步一跃跨过“生命体”与“非生命体”之间的鸿沟,“连石头都要欢呼起来了(路加福音 19:40 )”。

第一节将要讲述发生在“古老”的编辑器Emacs的Dired身上,同样的一个“惊心动魄”的迈过天堑的故事。

在Emacs里按键C-x d就能调用dired函数打开的界面:


呈现出来的是我们熟悉的“ls”命令的输出。

Linux系统继承的哲学理念,一切皆为文件,文件为万物接口。

Write programs to handle text streams, because that is a universal interface.

一切皆为文件,文本数据流(而非二进制数据流)为通用接口是grep,ripgrep等全局搜索工具起作用的基础。

同时计算机中的每个零部件都可触可摸,可视可见,调用ls命令查看所有设备的属性:

image

将输入到stdout的信息redirect到其他地方:

report error to null 2> /dev/null

在展开下文的论述之前,此处引出一个很有意思的问题,我们如何用查看stdout或者stdin的属性?

$ ls 0  1 2
ls: cannot access '0': No such file or directory
ls: cannot access '1': No such file or directory
ls: cannot access '2': No such file or directory

倘若用ls命令,则当场报错给人脸色看。

查阅stdin与stdout的属性,须回到/dev目录下:

$ ls -al /dev/fd/*
ls: cannot access '/dev/fd/255': No such file or directory
ls: cannot access '/dev/fd/3': No such file or directory
lrwx------ 1 gaowei gaowei 64 Sep  9 06:21 /dev/fd/0 -> /dev/pts/0
lrwx------ 1 gaowei gaowei 64 Sep  9 06:21 /dev/fd/1 -> /dev/pts/0
lrwx------ 1 gaowei gaowei 64 Sep  9 06:21 /dev/fd/2 -> /dev/pts/0

从结果可知,三者全有读写权限。然而写入其中的内容却无法存储。比如从命令行中下面的输出:

image

打印到屏幕上之后,stdout文件并不保存任何内容,如果要把用户名“gaowei”修改为”me“,只能将上面的输出复制粘贴到编辑器中,或者用其他命令行工具重新输出一遍,stdout文件本身并不保存任何信息。

原因何在呢?

$ less /dev/fd/1
/dev/fd/1 is not a regular file (use -f to see it)

如报错所言, /dev/fd/1 非功能完整的 regular file。

linux的理念,一切皆为文件。然而,所有文件并非生而平等,” All files are equal, but some files are more equal than others“。这是本文的第一道鸿沟。需求仅仅是简单地对输出的内容直接做编辑。

虽然任务简单,仅仅将“ls”输出的结果替换用户名发出去。 但是stdout的固有属性,并不保存信息,因而尚不能直接编辑。

换言之,不能将“ls”命令输出的结果本身,作为自己的文本内容。这之间隔着屏幕似乎有一道鸿沟。就如只能从透过屏幕看到“林志玲”,却不能哪怕伸手进屏幕跟她握握手,“可远观而不可亵玩”。

简单的需求能够用简单的命令解决,比如用sed修改输出结果:

PS C:\Users\gaowei\.emacs.d> ls.exe -al | head.exe | sed.exe "s/gaowei/me/g"
total 77
drwxr-xr-x 15 me Administrators  4096 Sep  4 16:54 .
drwxr-xr-x 49 me Administrators 12288 Sep  9 13:54 ..
drwxr-xr-x  2 me Administrators     0 Sep  4 16:54 .cache
drwxr-xr-x  7 me Administrators  4096 Sep  4 21:26 .git
drwxr-xr-x  5 me Administrators  4096 Aug 26 12:22 .github
-rw-r--r--  1 me Administrators   478 Aug 26 12:22 .gitignore
drwxr-xr-x  6 me Administrators  4096 Sep  9 10:49 .local
-rw-r--r--  1 me Administrators  1109 Aug 26 12:22 LICENSE
-rw-r--r--  1 me Administrators 13554 Aug 26 12:22 README.md

sed命令变更了输出结果,也仅止步于此,并不变更文件的真实用户属性。

这容易理解,sed对输出的变更,是"表面文章“。就如,用力搅动海面的波涛,怎么可能引致海底的地震呢?

想一下,日常变更用户属性,变更文件名的工作流。

仅仅握握手?

:rofl: :rofl:
憧憬一番,真见了面,即使独处一室,人家的气场,可能也只会愣愣地握握手。
倒是,隔着屏幕,什么都干得出来。

你的文章真的是徜徉恣肆,每次读都感觉挺棒的。现在都还能想起来之前引用曹操。哇!

哇!感谢鼓励 :smiling_face_with_three_hearts: :heart_eyes: :kissing_heart:

标题中的“上帝之手”并非另有他指(比如作弊),就是表达真实的鬼斧神工的造化之力含义。

就如维勒首次合成尿素,“生命体”与“非生命体”的界限就此打破。第一节的论述也进入到最高潮,见证emacs的dired于电光火石之间打破文件固有属性的藩篱,穿透只可眼见的屏幕而进入你我的手中掌中。