[ 经验分享 ] 初识 Emacs

种种原因从 Vim 转移到了 Emacs,把最近学习的经验给大家分享一下,希望对
同样想尝试 Eamcs 的同学有帮助。

在网络上对 Emacs 的教程多如牛毛为何还要在这里多此一举呢?Emacs被
「传说」成一种非常神奇复杂的软件。其实复杂到是不复杂,但是 Emacs确实是
非常的多变,不同 Emacs 用户手中的 Emacs 可能有完全不同的表现。同样的,
不同的 Emacs 教程也会体现出大家对 Emacs 完全不同的理解。多此一举也是希
望给大家一个参照,顺便给大家梳理一些资料。我的建议是多看一些入门的教程,
因为我发现很多入门的教程也非常的不同。各有不同的侧重。在这里我尽量写一
些我觉得其他的一些作者没有涉及到的内容。我自己也是新手,我希望我的经
验也可以更加贴近新手。

Emacs 是一个可定制的、可扩展的、自带文档的、高级的编辑器。可定制可扩展
就不多说了,这是一篇初级教程也不会设计太多这方面的内容。主要凸显在自带
文档和高级上面。

自带文档意味着你只要会查看文档你就可以自己摸索使用 Emacs,而高级则说明
Emacs 可以做的事情不止是添加删除编辑文件那么简单。他可以通过调用外部程
和插件完成复杂工作。

在这篇文章里我用 C-h 表示按下 Ctrl 同时按下 h 健。注意 C-h C-h 和 C-h h 的区
别,后者只有在按下第一个 h 时才按 Ctrl。我分五个部分来讲:
1.使用帮助。通过学习如何使用 Eamcs 中的帮助让你可以自己探索 Eamcs。
2.Emacs 的基本概念和逻辑。通过梳理一些概念和逻辑帮助理解记忆 Eamcs 的快捷键
3.讲如何提高编辑效率的一点想法,针对 Eamcs 但不止适用 Eamcs
4.通过介绍 org-mode 和 git-emacs 希望让新手可以尽快使用 Eamcs 工作,从做中学。
5.总结,补充,和一些资料。(Eamcs 要不要改键怎么该、和 KDE 快捷键冲突、进一步学习)

本文是入门初级。基本上不会太动 .emacs 文件,添加代码非常少而且你基本看字面就能懂。

好了话不多讲让我们开始。

1.使用帮助
之前说过 Emacs 是自带文档的, Emacs 的文档非常丰富(涉及各种模式、各种
命令甚至是 elisp 的参数)而且非常方便查询。我们要学的第一件事情就是学
者使用帮助。

除去学会 C-x C-c 来关闭 Emacs 和用 C-x C-s 来保存文件,用 C-x C-f 来打
开文件外,理论上你只要再学会这一个命令就可以自己探索 Emacs 了。那就是
C-h C-h,他是关于 Emacs 帮助的帮助。他会告诉你在按下 C-h t 以后你可以开
始一个入门的教程(有中文版,大家尽量多做几次这个联系)。按下 C-h f 后可
以输入你需要查询的函数来查询功能,而按下 C-h k 后你可以输入组合键来查询
组合键的功能。

其他的大家可以自己探索。比如 C-h b 可以列出所有定义好的快捷键,包括你
自己后来定义的。给你自己定义的快捷键加上适当的注释这些注释就会出现在帮
助说明里。

特殊的提一下 C-h 还可以添加在命令的后面。比如你按下 C-x C-h 就会出现所
有以 C-x 开头的命令的简短说明。

有人会说 Emacs 的快捷键实在太多了无法记忆,其实不用记,忘记了可以查看文
档,在使用中记忆。 而且 Emacs 的快捷键是有一定逻辑的。以 C-h 为例,不是
说 C-h 可以添加命令后面么?而 C-h C-h 不就是 C-h 添加在一个命令(C-h)
的后面从而获得一个以 C-h 开头的命令的帮助么?更多的逻辑可以在使用中慢
慢总结,我也会在下面总结一些。

除了 C-h 还有一个快捷键需要掌握那就是 C-g。这是一个刹车,当你不小心输
入错误的时候可以通过它来中止命令。

2.理解 Emacs 的基本概念和内在逻辑

Emacs 一个重要的概念是缓冲区,缓冲区就是你编辑文件的区域。Emacs 会把文
件的内容拷贝到缓冲区进行编辑,保存则是把缓冲区的内容保存到文件。Emacs
可以编辑多个缓冲区。那么如何在多个缓冲区中切换呢?可以用 C-x b,然后输
入缓冲区的名字。

注意,在这里你不用完整的输入名字可以通过 Tab 键补全。这是 Emacs 的一个
大杀器,也被移植到了很多其他软件上比如各种 sh。Emacs 还有一点非常不错
的就是你在「命令的输入区域」(其实也是一个缓冲区)同样可以使用 Emacs
的快捷键,这和 Vim 不同。在 Vim 中你如果输入命令就不能在通过 hjkl 导航,
但是在 Emacs 中你依然可以使用比如 C-t(交换两个字母)来纠正输入错误。

关于缓冲区还有一个命令就是 C-x C-b,他会给出一个缓冲区的列表。从而让你
在这个列表中批量的处理缓冲区。这个列表位于一个缓冲区内,而这时屏幕会被
分成两个「窗格」来显示这个缓冲区。这时你可以通过 C-x o 来移动到另一个
窗格。或者 C-1 来关闭另一个窗格或 C-0 来关闭当前窗格。窗格被关闭但是缓
冲区还是在的,你可以通过 C-x b 重新打开他。

这里又带出 Emacs 的另两个重要概念,一个就是「窗格」,有的地方翻译成「窗
口」,为了和习惯统一我们还是叫窗格好了,就是一个窗口内分成好几个区域显
示文件。

另一个就是「模式」。「模式」以为着 Emacs 会在不同的模式下有不同的行为。而
Emacs 会根据不同的文件类型自动载入一种模式,比如你编辑一个 C 文件
Emacs 就会进入c-mode。模式是对缓冲区而言的,不同的缓冲区会有不同的模式。
而显示缓冲区列表的缓冲区也会处于一种特殊的模式之下。他提供一些特殊的行
为。比如你不能再进行编辑了(当然,这是多余的)。这时 Emacs 变得有点像
Vim,按键变成了命令。按 d 或者 k 会标记一个缓冲区删除,按 s 会标记一个
缓冲区储存。按 x 会执行你标记的命令。而 v 则会打开一个缓冲区。

通过熟悉一些基本操作大家也对 Emacs 的命令有了初步的了解了。 Emacs 命令
是非常有规律的。

最常见的就是 C-n(这里的 n 代表各种不同的键),重点掌
握,比如 C-p C-f C-b 移动,C-s 搜索等等。另外注意,Emacs 把 C-1 绑定为
关闭其他窗格可以看出 Emacs 对窗格控制的重视。

第二类就是 Alt-x,一些没有绑定快捷键的函数就要靠他执行。

第三类是 C-x,这是一个前缀,以 C-x 开头的命令多余文本编辑有关。比如你
直接 C-q 是引用,而在 C-q 前加一个 C-x 变成 C-x C-q 则是把文本变成只读
模式。多举一个例子吧,不多见的,比如 C-x + 回车 + f 可以改变文件编码。
C-x + 回车 + r 则改变显示文件所用的编码。这个编码的提示就是在那个状态
行的最左边。一般显示是 U ,就是指 UTF-8。

第四类是 C-c,这多于一些特殊模式有关,大多不是全局快捷键,只有在一定模
式下才可以用,比如 org-mode 中用 C-c C-l 插入链接。

主要就是这四类。在这里加一类 Alt-n。Alt 命令多与文本结构有关,比如
Alt-f 前移一个词。Alt-q 文本模式下重排段落。

主要说一个很多教程里没有提到了 Alt-g,在使用 Vim 中
最爽的莫过于用 gg 直接跳到某一行了。比如看到文件提示说哪行出错可以快速
到达。很多 Emacs 的参考书都是用 Alt-x 加命令 goto-line 来跳行的。这太
慢了,有了自动补全也慢。其实现在的 Emacs 中已经有了这个快捷键(貌似新
加入的),可以用 Alt-g g 后者 Alt-g Alt-g 完了输入行号还快速到达某一
行,随不比 Vim 但也还可以。

3.如何提高工作效率?

在开始使用 Emacs 的时候我们会想:Emacs 在移动方面不如 Vim 那么如何在
Emacs 中提高效率呢?

当然 Vim 用户的目标比较明确,更多的是苦练肌肉。而 Emacs 用户则更多靠思考。
这里就是我总结的如何思考。当然,这一节并不止是针对 Emacs 来说的。

a 从弱处着手
移动、快速定位。Emacs 要比 Vim 更多需要技巧。因为这点 Emacs 不如 Vim。
用 Ctrl-v 来翻页而不要用 Ctrl-p,混合使用各种移动方式,多使用 Alt-f 而
不是 Ctrl-f。按照词为单位前移不但速度快更有逻辑。先定位页再定位段落再
定位句子、行最后是词语单词。交叉使用还能很好的缓解小拇指压力。Vim 用户
也是,好要更好,通过交叉使用定位更加高效。

b 从强处着手
Emacs 强在工具的整合,在组织多个文件(其实这点并不比 Vim 强只是 Eamcs
比较强调)。编辑总的来说是思考的活,不是编辑速度有多快,而是要帮你更加
舒服愉快的编辑,让你思绪更加流畅。通过合理的组织文件,利用工具来处理掉
一些重复劳动来使使编辑变得愉快。

比如在使用 org-mode 写文章的时候,你要插入一个链接,如果你老是输入
[www.google.com]谷歌]]那就繁琐死了。特别中文标点打不出 「 ]」 来,你要
用中文描述链接还要来回切换输入法。这时 Emacs 就发挥出优势了。你可以通
过 C-c C-l 自动插入一个链接,他会提示你写入链接的地址和描述。

Emacs 的各种模式下有很多这样快捷键。你也可以自己定制。挖掘出一些编辑时
经常要用到的重复的动作来通过一些快捷键自动化处理掉他们。

当然 Vim 用户也可以通过 vimscript 来做到这点。但是 Emacs 还有一个大杀器
就是「宏」。Emacs 翻译过来就是「宏编辑器」。宏有两个含义,一个是elisp
中的宏,一个是编辑器中的「宏」录制。你可以通过 C-x ( 开始一个宏录制
C-x ) 结束一个宏录制。把需要反复执行的操作录制成一个临时的宏,用C-x e
反复调用执行。这不需要你掌握 elisp,宏还可以保存,命名。相当于自己写了
一个 elisp 函数。你可能会觉得用不上宏,但是相信我。你会在很多地方用上宏,
当然这需要你自己挖掘编辑中的重复功能,这是非常有趣的过程。比如我要给每
一段话前边加空格,就可以通过录制宏来完成。

4.使用 Emacs 开始工作(org-mode 和 git-emacs)

Emacs 功能众多,拿 Emacs 干什么可以快速入手呢?推荐两个东东,以哦
org-mode 一个 git-emacs。一个自带一个需要安装。

org-mode 声名远扬就不多说了。连 Vim 都有一个很简单的 org-mode 移植。
org-mode 比起其他标记语言比如 markdown 来说一是功能更强大(也更复杂),
二是和 Emacs 绑定,更便捷。再也不用记忆是 ]() 插入链接还是 ]]] 插
入链接了。一些特定功能都可以用快捷键来搞定。

语法就不多说了。我用 org-mode 有两个主要功能,一是时间管理。二是管理个
人知识,用来取代 vimwiki 的。前者说的很多。简单提一下,时间管理主要就
是要有全局快捷键。可以随时查看修改 TODO list,只要在 .emacs 中添加如下
代码即可。

(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-ca" 'org-agenda)
(global-set-key "\C-cb" 'org-iswitchb)

当然你还需要有一些文件来写 TODO list 啦,然后让 org-mode 可以通过快捷
键跨俗查找。添加如下代码。

(setq org-agenda-files (list "文件位置1"
			     "文件位置2"
			     "文件位置3"
			     "..."))

C-c a a 可以查看日程,C-c a t 查看所有 TODO,在全局文件里的。 你输入完
C-c a 会看到一个提示的。

下面讲怎么建立一个个人 wiki 系统。在 .emacs 中添加如下代码。

(setq org-publish-project-alist
      '(("你的wiki的名字"
	 :base-directory "wiki 文件存放的位置"
	 :publishing-directory "导出 HTML 文件储存的位置")))

然后你在 base-directory 下建立 org 文件编辑就可以了。你可以用快捷键导
出所有在一个项目里的 org 文件。

这里有一个问题。wiki 都有主页。那么 org-mode 如何打开主页呢?每次输入
文件路径多繁琐。这点确实没有 vimwiki 来的便捷。org-mode 没有快捷键打开
某个特定文件。也许因为 vimwiki 本来就是用来做个人 wiki 更加有针对性。
但是我们可以通过 Emacs 的书签功能来弥补。书签也是提高编辑效率的一大武
器。编辑一个文件时通过 C-x r m 就可以把当前文件加入书签。他会提示给书
签命名。然后 C-x r b 输入一个书签名就可以快速打开那个文件。有了书签甚
至你很少会用 C-x C-f 了。

下面将 git-eamcs,虽然 Eamcs 本身就有 VC 模式也支持 git,但是一直无法
用他来建立分支。功能也比较简单。有了 git-emacs 就可以通过 Alt-x 输入几
乎所有 git 命令了。更重要的是,你不用记 git 命令而直接用快捷键!更有,
Emacs 会在状态栏显示文件状态。最左边有红点说明文件修改没有提交,绿点则
说明已经提交。Emacs 同样也已操作一个目录来管理里面的 git 仓库。用法大
家可以用 C-h 来查看(当然是在安装好以后了),这里只是简单的讲安装。

把 git-emacs 下载后移动到 .emacs.d 文件中然后添加如下代码即可。

(add-to-list 'load-path "~/.emacs.d/git-emacs/")
(require 'git-emacs)

下载可以通过

git clone https://github.com/tsgates/git-emacs.git 

,当然你要有 git。

其实 Emacs 还有一个管理插件的插件,可以让你定制你的 Emacs 更加有序。

有了 org-mode 和 git-emacs 你基本可以用 Emacs 干一些小事情了。比如写
日记、做笔记。这基本上也是很多人日常要干的事情。在使用中继续学习。

5.总结、补充和更多的资料
写的有点乱我总结一下。学习 Eamcs 你要掌握的就是
a 会用帮助
b 理解「窗口」「窗格」「缓冲区」「模式」并熟悉常见命令(缓冲区各种切换、
使用书签)
c 会用宏
d 了解如何才能高效编辑,自己探索挖掘。

在这个补充几个内容

Emacs 该不该改键?

这纯粹是我个人的思考。由于我是用 Emacs 写文章而不是写代码并不太注重移动,
在我的本本上 Ctrl 键也可以按到,按照我在第 4 点里说的也不是很费小拇指。
改了反而让你不习惯使用别人的电脑。故不支持。支持改键的观点也有。因为 Eamcs 和
Vim 的历史很早,当时的键盘可不是这样的!那时候 Ctrl 键在 A 的左边。Esc
键在 Q 的左边。可以说改了才是正宗的。如果你确定要改有,推荐两种

  1. 交换 Ctrl 和 CapsLock。Vim 用户可以交换 Esc 和 CapsLock。KDE 可以直
    接在系统设置里改(Gnome 应该也可以,连 Mac 都可以)。这就是早期键盘的布局。
  2. 交换 Ctrl 和 Alt,依据是 Crtl 比 Alt 多用。改 CapsLock 键还是费小拇
    指。

其他方案你不是 Emacs 死忠、骨灰级用户不用考虑了。。。太凶残了,有把 「’」
(Enter 键左边那个键)改成 Ctrl 的,有个干脆放弃了现有的键盘布局,把 E
的位置改成 P 的等等。。。。最后一种据说才是最有效的。还有比如放弃 Alt 键也不太推荐。

Emacs 和 KDE 全局快捷键冲突的问题

比较烦的是 Ctrl+Alt+v,这和剪切板的一个快捷键冲突了。你可以把剪切板的
快捷键改掉。我的方法是设置 Emacs 窗口强制忽视 KDE 全局快捷键。

在 Emacs 窗口顶部右击,更多动作-> 特殊应用程序设置
「在外观和修正」中修改忽略全局快捷键选项。在「布局和访问」中设置一个快
捷键。我是 Win+E。这样当 Emacs 的窗口在前的时候全局快捷键都失效(除了
非 KDE 程序比如输入法)。当你想要使用全局快捷键的时候,可以用 C-z 把
Emacs 最小化,这是一个 Emacs 自身的命令(在终端下是暂时挂起,在 X 下是
最小化)。用 Win+E来找回,这是通过 KDE来设置的。

Eamcs 基本上每个人都会喜欢的简单修改

开启自动换行(写文章不用敲回车了)
去掉无用的滚动条、工具栏、还有讨厌的「比比」的声音。

;; 自动启动自动换行模式(在 text 和 org 模式中)
(add-hook 'text-mode-hook 'turn-on-auto-fill)
(add-hook 'org-mode-hook 'turn-on-auto-fill)

;; 关掉噼里啪啦的声音
(setq visible-bell t)

;; 关闭滚动条菜单栏
(tool-bar-mode 0)
(scroll-bar-mode 0)

最后推荐阅读《学习 Gnu Emacs》 和 《Gnu Eamcs lisp 编程入门》。都有中文
版。

很多发行版 wiki,一些博客都有关于 Emacs 的教程,建议多多涉猎。

如果你真的想要学习一下编程的话(不是做程序员,而是把其当成一种基本
技能,学习一些编程的基本方法),想进一步定制 Emacs 的话我推荐先学《程序
设计方法》(How to Design Programs, HtDP),比著名的 SICP 简单,不是让你
掌握语言而是真的学怎么写程序,函数式可能对学过一些数学的人来说更容易理
解。用的语言是 scheme。也是一种 lisp方言。和 elisp 很像。我推荐人初学语
言学 scheme 原因就在这两本书《HtDP》和《SICP》还有 Eamcs。两本书用的都是 scheme。
少有的专注将方法而不是纠结在语法。scheme 的语法也很简单。学会了 scheme 还可以很
快入手 elisp。而 Emacs 是个大玩具,写 Eamcs 函数和 mode 相对要比写程序简单。
你也可以写个游戏在 Eamcs 里运行。自己定制也很实用。Eamcs 不是码农专用。最普遍的
完全可以定制成一个高效的写作环境。

写的匆忙有什么问题和错误欢迎指出。

附上几篇「吹嘘」 Emacs 的文章。不一定客观,权当激励想尝试 Eamcs 的新手。 Vim 党轻喷。。。。

  1. 貌似国人所做 著名 Emacs 用户列表 ](http://wenshanren.org/?p=386) 。

要追随大师么,但也不要盲目。其中大家包括比较熟悉的
Mark Zuckerberg – Facebook 创始人
Julian Assange – 维基解密的创建者
松本行弘 – 编程语言 Ruby 的作者
Guido van Rossum – 编程语言 Python 的作者
Michael Widenius – MySQL 和 MariaDB 的作者
Linus Torvalds – 内核 Linux 和版本控制软件 Git 的主要作者(不太一样,他用的 uemacs)
Donald Knuth – TeX 和 计算机程序设计艺术 的作者, 图灵奖得主
Eric Raymond – 大教堂与集市, 如何成为一名黑客 等文章的作者(也是《提问的智慧》和 《Unix 编程艺术》的作者)
Richard Stallman – GNU Emacs 作者, 自由软件运动发起人

另有两个作家一个政治家,其一还是雨果奖得主。。。。

其中 Ruby 和 Python 的创始人都自称是 Eamcs 死忠。Ruby 的创始人松本行弘更有力捧 Eamcs 的文章,这就是是这里要附上的第二篇文章

  1. 《Emacs 改变了我的人生 》](http://ruby-china.org/topics/2262)

在这篇 《Emacs 对 Vi》](http://article.yeeyan.org/view/455937/395127) 松本行宏稍微客观一点,但也难以掩饰作者对 Eamcs 的热爱,在此作者把 Eamcs 当作是不用于 Unix 哲学的另一种哲学。很多人也持此观点。

但同样是力挺 Eamcs 的 Eric(《提问的智慧》、《大教堂与集市》、《Unix 编程艺术》的作者,《学习 GNU Eamcs》也有他的参与)却有完全相反的看法。他在 《Unix 编程艺术》中多次提到 Eamcs,大篇幅整节内容讨论 Eamcs ,认为 Eamcs 正是最符合 Unix 哲学的软件。。。。这也是在这里推荐的第三篇文章,可惜这里不能提供链接。大家可以自己找找,单独的文章好像没有,题目叫《Eamcs 是反 Unix 传统的依据么?》。另贴一篇 反对作者观点的文章 ](http://www.360doc.com/content/11/0522/18/6986090_118610945.shtml) 以示公正,其实对于 Eric 在此过于偏袒 Eamcs 大多数人都是反对的。

最后两篇文章也不都是吹嘘,对学习理解 Eamcs 还是有一定意义的。即使第一篇文章也有一点意义。看看大师拿 Eamcs 可以干什么也可以给人启示。至少在我看来写小说绝对是 Eamcs 少被挖掘的大功用之一。。。。。。

emacs 里确实可以动脑筋来增加移动速度。但是在 vim 里也可以动脑筋来增加移动速度啊。你列举的那些动脑筋的方法也同样适用于 vim 吧。。 不过确实有部分 vim 用户很喜欢狂用 j 键翻页。这样的话效率就不是特别高了(但是还是比用鼠标高得多。。)

Emacs 对多个文件的管控能力强于 vim。这个我就不太清楚了。可能吧。但是我很少管理多个文件。 多个文件我就 kate 了。。 但是 kate 的话多个文件还是需要用一些鼠标的。 而且 emacs 的扩展性照样可以自己扩展得比 kate 之流强大。

关于学习编程。

我也借了 HTDP、SICP、POPL 三本书,但是很遗憾一直没有读(效率低啊,今天起减少出现在论坛。。)

不过我个人建议真正想学习编程的人学习 Haskell 和 Agda。 Agda 是基于柯里 - 霍华德同构设计的程序语言。

不过我对 LISP 的偏见在于被 Clojure 折磨得比较烦。。

最后小建议:如果真的中 LISP 系软件的毒,可以考虑 sawfish 窗口管理器。 也是 LISP 系的。

推荐 lisp 不是因为别的。而是因为像 HtDP 这样的说是少见为非码农准备的(作者说人人都应该懂一点编程即使他不从事这个行业甚至以后再也不编程)、不纠结语言而讲方法的。而且口碑很好。HtDP 确实很好,我刚看完一遍,习题刷了一半,讲的深入浅出,对专业的人也许嫌他简单罗嗦。SICP 还没看,书刚定还在路上,有当年的 MIT 的视频(现在人正在把他翻译成中文,虽然画面不太好)。资料好适合新手所以推荐。SICP 没看过,书刚定了书还在路上。

其他的语言怎么样不敢说,但是就教学而言,面向新手小白的资料太少。最早看过一些 C,C 的好书很多,但是人家写的好是语言解释的好、清楚。说实话懂 C 语法不能让对编程有个了解,写写排序什么太无趣了,写点觉得有用的东西又太难。也看过一些 Python 的书,有几本大学的编程入门教材也不错,特别现在 MIT 用 Python,可以在网易找到公开课视频(看书的效率其实是最低的,不如视频,虽然讲的慢的便于理解),也蛮适合什么都不懂的人的,但是资料比起 HtDP 要差不少。Haskell 和 Agda 的资料就更少了,大多数人不把 Haskell 和 Agda 当入门语言,很多教程作者都津津有味的介绍此种语言虽然看上去有点奇怪但其实是如何优雅,但说实话小白一点都不懂。

lisp 当教学语言还是非常适合的。至少 lisp 好的 「意见证据」是很充足的。很多现代语言受 lisp 影响,但是 lisp 依然有些特性是其他语言没有的。python、Ruby、Haskell 都是。很多语言创造者(python 、Ruby、Java)都是 lisp 用户乃至死忠,甚至 Java 都深受 lisp 影响。可能那些人看到 lisp 身上一些东西很好但另一些东西則有点多余才发明了另一种吧。学 lisp 对学后续学习其它语言还是很有好处的。而且 lisp 的语法是很简单。

所以对于业余、新手、把编程当「通识教育」的人,我还是推荐 Lisp(scheme),其次推荐 python。

Haskell 和 Agda 也有很多特性是 LISP 没有的。

Agda 的超强直觉类型系统(比 Haskell 的 HM 类型系统还要强)可以做到只要编译通过,100% 无运行时错误。 LISP 无法做到。
不过长江后浪推前浪,更强大的同伦类型系统正在路上。。。 这些玩意儿都是 Haskell 系的,而不是 LISP 系的。

没有好的教材,我等业余爱好者如何自学?甚至找一个 Haskell/Agda 的入门教材都难。学了干什么?会 lisp 至少可以玩 Emacs 这个大玩具。

《HtDP》 更是有一个 IDE – DrRacket。在这个 IDE 里还特别为初学者定制了出错信息。他把语言分成了几个部分。每个部分都是 scheme 的一个子集。针对不同的学习阶段给出不同的出错信息。而 Racket 作为相对活跃开发的 scheme 实现之一,已经从原先的只是为教学而定制一个解释器发展成可以直接投入生产环境。而且 DrRacket 和 Racket 在 openSUSE 官方源里都有,可以说各大发行版的官方源里都有。可以说 《HtDP》不仅是一本自学的好书,还配套了一个用于学习的环境。这绝对是自学者的福音。另有 《SICP》 作为进阶。而 Haskell 和 Agda 恐怕不能提供如此「周到」的服务。

对于 vim 也可以通过思考提高编辑效率我也同意。我好像也说了。但我觉得没有 Emacs 用户来的「自觉」,Emacs 不但可以通过 elisp 定制,还可以通过 「宏录制」定制,可以说一点不会编程的人可以定制自己的 Emacs,只要你有识别编辑中可自动化步骤的「天赋」,我用 Emacs 经常会注意编辑过程中那些动作可以自动化,就可以简化编辑。vim 通过 vimscript 达到相同效果。但至少在我接触 Eamcs 之前,我不会有这样的想法。我顶多以为 vim 可以自动缩进、调用外部程序一键编译。而且我觉得 vim 也没有 Eamcs 定制来的方便。

个人感觉熟悉 vim/emacs 的都好厉害,我就只会用 vim 编辑配置文件。。。

这也是 Linux 的一大优势。 有一些东西不是其他系统不能这样做,而是 Linux 的机制、社区能够促进你以科学的方式去做。 最典型的就是表层的“包管理”(只谈论安装)。 表层的“包管理”在其他系统也能实现,也能实现按照依赖安装程序,比如 Windows 的 chocolatey。但是在这些系统中你很难养成这种习惯。

当然也有一些地方,其他系统中很难以科学的方式操作。 比如说真正的包管理。 核心是管理的时候,只有 Linux 的包管理机制能够真正有效地执行管理。

说到包管理,Emacs 居然有一个插件是专门用来管理插件的。。。。简直就是一个简化版的包管理器。。。。

还是鼓励多尝试吧,觉得「很厉害」其实你试一试就会发现其实也就这样。我在图书馆借的《学习 GNU Emacs》,前五章加上一章「宏」录制,对了还有 Emacs 自己的入门文档。这点内容一个星期可以刷五六遍。那时掌握基本操作就绝对不是问题了。

话说 Emacs 的一些资料还是不错的。 elisp 也有一个翻译过来入门教材。学习门槛还是比较低的。就是面向普通用户的。

我突然想到,实际上非计算机专业的人学习计算机最好的教材是:

《Algorithm Design》俗称 KT,康奈尔大学的。我本学期的教材,学了快 100 页了,印象好,CLRS 同步翻翻,初步印象 KT 比 CLRS 好一点的感觉
《算法设计与分析》 北京大学屈婉玲。美国买不到,没读。看了屈奶奶的课件,思路清晰,整理提炼到位,感觉水平可能强于 KT 和 CLRS。但是书的水平怎么样,翻了才知道。 只有 200 页,和美国砖头书形成鲜明对比。 我曾经是美国砖头书的追捧者和美国文理教育的支持者。 自从读了龚昇的《微积分五讲》,观点发生了比较大的变化。

算法是计算机的核心。可惜我大二才学,而且数学早就忘记光了(美国计算机专业一般只要求离散一门数学课且难度近似小学组合题,悲哀)。

像图算法,对经济、管理类的人,都是非常有用的。

但这只是表象。htdp 作者说任何人都应该学一点计算机,我赞同,但是我认为学的不应该是它,而是这两个算法书。 算法的背后是计算思维。这种思维是可以和物理的实验思维、数学的理论思维所相提并论的第三大思维。 这种思维对各行各业的人都非常有用。 算法里的分治、贪心、动态规划等,无论学生是什么专业的,学习之后都颇有裨益。

Vim 也有包管理的插件。 但是能够 Zypper 搞定,为何不用 Zypper?

我知道每个程序语言有自己的包管理。但是在可控制范围内,我会坚持使用 Zypper。 因为当你用一个玩意儿管理全部玩意儿的时候,你才能最大限度避免问题。 不过程序语言各有各自的生态,问题也不大。

谈到技巧。我到觉得实际上只要用 vim/emacs 之一即可。 最后编辑速度取决于两点:

1)打字速度,这个是必然的,你如果盲打都做不到,那么就。。。了
2)动脑筋。编辑过程中很多地方动一个小脑筋,速度就快很多。比如说翻页不要使用 j 按键啊。比如说打 asciidoc、restructuredtext 的标题的时候使用数字指令 vim 重复操作 a= 啊,比如说善于使用 gg、G 啊,比如说打列表的时候按 0 建放在最前面然后进入 visual 模式批量添加 "* " 或者 "#. " 啊。 这些东西没什么要背的,就是动一个脑筋,可以提高你很多的速度。

补充:用 fctix 的 hint 功能拼英文单词,可以提高英文单词的准确率,减少拼写错误。但是不要依赖这个东西。 因为你需要按 Alt+ 数字键来选单词的,有时候单词比较短,还是自己打完比较快,有时候单词比较长,使用 Alt+ 数字选就快,这个就要临时应变,选择最快的方法了。我一般根据情况来选择是否开启 Hint 模式。

最后说一个题外话,做笔记什么的,能用纸张,不要用电脑。为什么? 因为电脑打字的速度太快了,超过了人的思考速度,所以看起来快,反而会打断人的思维。 在纸张上写字人更容易连续得思维。 在纸张上写好笔记,需要整理的时候,再提炼成电子文本。

哈哈,果然变成推广 Lisp 了,喜闻乐见

其实我不是很粉 Lisp,也不是码农。。。。。。只是业余兴趣。。。。。
我粉 openSUSE’ 。。。。。。。

好吧,Emacs 确实和 lisp 关系密切。。。。。。我也粉 Emacs。。。。。。

然后我就想起了 Elisp,然后我就觉得有些纠结……然后我有想起那个 Lisper 互掐的笑话了。

哈哈哈哈

宗教意味太重了一些。 但其实也没这么严重吧? 很多 LISP 用户也就是一般用用而已。

函数式里面我 Racket、Clojure、Haskell、OCaml 都会用一点点,但是现在基本不写代码了。 我当时想学编程无非就是想给开源做点贡献,但是自己真不是这方面的天才。