松本行弘(Ruby发明者):Emacs怎样改变了我的人生

原文(英文版本)见这里.

以下是我的翻译兼一些技术方面的背景资料:

1980年,我开始编程.

Basic,400 steps (此句不知如何翻译)

1988年,我遇到了Emacs,在学校的Sun-3上,和200多个学生共用.

Emacs实际上是被禁止使用的,因为消耗太多内存.所以我只是尝试了一下了.

我可以自由下载Emacs并阅读其源代码.

Emacs是我的第一个Lisp解释器.

从Emacs我学到了很多关于语言实现的知识.

例如,emacs的整数实现(Embedding integer in pointers)

参考LispObject定义,在Emacs源代码的lisp.h中,LispObject是一个既可以作为指针使用又可以作为整数使用的类型 具体代码见下,注意LispInt为0,使得非负整数可以直接转换为对应的ListObject类型:

#define VALBITS 29
#define GCTYPEBITS 3

enum Lisp_Type { Lisp_Int = 0,

<span style="color: #969896; font-style: italic;">/* </span><span style="color: #969896; font-style: italic;">Symbol.  XSYMBOL (object) points to a struct Lisp_Symbol.  </span><span style="color: #969896; font-style: italic;">*/</span>
<span style="color: #e7c547;">Lisp_Symbol</span> = 2,

<span style="color: #969896; font-style: italic;">/* </span><span style="color: #969896; font-style: italic;">Miscellaneous.  XMISC (object) points to a union Lisp_Misc,</span>

whose first member indicates the subtype. */ Lisp_Misc = 3,

<span style="color: #969896; font-style: italic;">/* </span><span style="color: #969896; font-style: italic;">String.  XSTRING (object) points to a struct Lisp_String.</span>

The length of the string, and its contents, are stored therein. */ Lisp_String = LISP_STRING_TAG,

<span style="color: #969896; font-style: italic;">/* </span><span style="color: #969896; font-style: italic;">Vector of Lisp objects, or something resembling it.</span>

XVECTOR (object) points to a struct Lisp_Vector, which contains

the size and contents. The size field also contains the type

information, if it's not a real vector object. */ Lisp_Vectorlike = 5,

<span style="color: #969896; font-style: italic;">/* </span><span style="color: #969896; font-style: italic;">Cons.  XCONS (object) points to a struct Lisp_Cons.  </span><span style="color: #969896; font-style: italic;">*/</span>
<span style="color: #e7c547;">Lisp_Cons</span> = 6,

<span style="color: #e7c547;">Lisp_Float</span> = 7,

};

typedef union Lisp_Object { / Used for comparing two Lisp_Objects; also, positive integers can be accessed fast this way. / EMACS_UINT i;

<span style="color: #b9ca4a;">struct</span>
  {
<span style="color: #e78c45;">EMACS_INT</span> <span style="color: #e7c547;">val</span>  : VALBITS;
<span style="color: #b9ca4a;">enum</span> <span style="color: #e78c45;">Lisp_Type</span> <span style="color: #e7c547;">type</span> : GCTYPEBITS;
  } <span style="color: #e7c547;">s</span>;
<span style="color: #b9ca4a;">struct</span>
  {
<span style="color: #e78c45;">EMACS_UINT</span> <span style="color: #e7c547;">val</span> : VALBITS;
<span style="color: #b9ca4a;">enum</span> <span style="color: #e78c45;">Lisp_Type</span> <span style="color: #e7c547;">type</span> : GCTYPEBITS;
  } <span style="color: #e7c547;">u</span>;

} Lisp_OLisp_Stringbject;

又例如Emacs的内存自动回收机制(Mark and sweep garbage collection)

具体细节参考这里的讨论.

C和Lisp的Calling conventions(不好翻,基本上就是函数如何调用,函数参数的内存模型之类…)

我完全理解Lisp怎么工作的

我被Lisp Objects迷住了

当我得到Sparc工作站时我开始使用Emacs

我完全被迷住了,Emacs成为我的一部分

而且Emacs任何我不喜欢的部分我都可以改,Emacs完全可配置.

Emacs使我明白了任何东西都可以被程序员改变

完全的自由

编辑时可以无视键位设置

我想用Emacs做所有的事,编程,文档,邮件…

所以我写了"cmail",我的第一个严肃的Lisp程序,我每天用它

1993年,我开始搞我的Ruby

Ruby的设计受到Emacs实现的影响,例如整数和tagged pointer合用,相似的GC,和Lisp类似的Object Model

tagged pointer的细节请参考上文的C代码,高地址的3bit用作判别数据类型,低地址的29bit用作指针或者整数(取决于数据类型)

接下来我把Smalltalk的OO系统加上去

语法我用Algol/Ada/Eiffel

但是我是Emacs狂,所以在Emacs中支持auto-indent是必须的

在1993年,类似的语法要支持auto-indent很难

所以我就写了自己的ruby-mode.el,试图用elisp和正则表达式(regex)解决这个问题.

一个礼拜后,我在给Ruby加上end关键字后终于成功了

如果我不能让我的emacs下的ruby-mode成功,那么Ruby的语法会更像C

这样就和其他脚本语言差不多,Ruby也不会那么受欢迎

小结

  • Emacs教我什么是软件自由(freedom for software)
  • Emacs教我如何读代码
  • Emacs让我认识到Lisp的威力
  • Emacs教我如何实现语言核心
  • Emacs教我如何进行内存自动回收(Garbage Collector)
  • Emacs有助于我写代码和调试
  • 我用Emacs写j文档邮件
  • Emacs让我成为高效程序员
  • Emacs让我成为黑客
  • Emacs永远改变了我的人生

IT创业的悲惨故事《IT创业疯魔史》以及我的八卦

IT创业疯魔史一书讲述了一个研发手写电脑的公司惨败收场的悲剧。

我个人觉得这本书不错,有志于创业的程序员可以学到很多东西。没有兴趣创业的看完后也会心理平衡一下。

我这里秀一些和原书相关的八卦:

  • 《IT创业疯魔史》老早就引进国内了,这次只是重新包装了个新标题。原书叫《硅谷传奇》,上海的图书馆都有借的,我一个月前刚看过,我建议你省下买书的大洋。哈哈,出版社要不高兴了。
  • 该书主人公后来去搞电子商务去了,我胡猜大概是吃到软硬通吃的苦头了。毕竟乔布斯东山再起还是小概率事件。
  • 书中所提手写电脑GO当时锋头很健,把微软吓的半死。于是微软使出惯用伎俩,到处搜罗搞手写识别软件的小公司。就在这时候,有个天才的中国工程师搞了个世界最牛逼的手写识别软件,跑到美国来推销。可是他英文不好,人生地不熟。他结识了两个当地的文科生,一个做他的CEO,一个做他的CFO。微软的人找到了这个三人帮,虽对软件很欣赏,但是鄙视那两个文科生。于是假意冷淡把三人帮打发走,然后给那个中国工程师单独打电话约出来谈,”那两个文科生就是骗子,我们就买你的代码,连你人也要了,怎么样?“那个中国工程师也不傻,就答应了。微软拿到该手写软件后就到处宣扬,说用户需要的不是全新的手写电脑,而是带手写功能的Windows。再加上其他一些卑鄙手段(《IT创业疯魔史》中有介绍),把GO打得落花流水。
  • 上面的八卦我在微软前员工的回忆录里读到过,书名手头没有,回去查一下。
  • 资助GO的牛人Mitchell David Kapor我印象中办公自动化方面的失败尝试至少有三次,
  • 一次是找了两个程序员要写个巨牛无比的办公自动化的软件,结果惨败,只是给我读过的一本关于软件项目失败案例的书增加了一个条目.该书书名为<软件开发的滑铁卢: 重大失控项目的经验与教训>.
  • 一次是做开源个人信息管理软件Chandler默默收摊,事后总结失败原因,我所热爱的跨平台C++GUI框架wxWidgets的不成熟对其失败也有贡献。
  • 一次就是资助手写识别电脑。不再复述。
  • 我感觉自从搞出了Lotus-1-2-3后,Mitchell就盯着这个方向上了。过去的成功经验和domain knowledge也不一定能保证未来的成功。

`fasd` make me 10x more productive under shell

I will show you my typical workflow with fasd.

Quick visit my work folder named "NeonSite":

$ z neon
4       1.701      /home/chenbi/work/raas/current/webapp/NeonSite/css/src/page

3 22.995 /home/chenbi/work/raas/current/webapp/NeonSite/css

2 40.005 /home/chenbi/work/raas/current/webapp/NeonSite/js

1 5292 /home/chenbi/work/raas/current/webapp/NeonSite

I press '1' and go into the folder "/home/chenbi/work/raas/current/webapp/NeonSite". Awesome, eh?

Copy file 'hello.c' to a folder named "NeonSite":

$ cp ~/hello.c s neon

5 1.701 /home/chenbi/work/raas/current/webapp/NeonSite/css/src/page

4 4.41 /home/chenbi/work/raas/current/webapp/NeonSite/js/gallery2.js

3 22.995 /home/chenbi/work/raas/current/webapp/NeonSite/css

2 40.005 /home/chenbi/work/raas/current/webapp/NeonSite/js

1 5292 /home/chenbi/work/raas/current/webapp/NeonSite

I press '1' and 'hello.c' is copied into the corresponding folder.

In order to install and setup fasd, you need only put fasd under some folder in $PATH and add the below code into you $HOME/.bashrc.

eval "$(fasd --init auto)"

alias z='fasd_cd -di'

Please note you can use any POSIX shell (zsh, for example) with fasd. Check fasd's documentation for details.

At last, I want to thank clvv (Wei Dai) for designing such a elegant and beautiful tool.

你是我的大救星(you're my lifesaver),Wei Dai!

Best wordpress theme for geeks

I love the Wordpress theme Sixhours 1.5 designed the by Caroline Moore.

It is purely simple text theme with dark background and elegant fonts.

But for geeks there are two shortcomings:

  1. The font color of the hyperlinks is almost same to the plain text.
  2. The code block in <pre> element is not highlighted with solid border.

So here is my patch of style.css to fix these problems:

--- style.css   2012-03-08 23:56:31.000000000 +0800
+++ style.css   2012-03-08 23:55:53.000000000 +0800

@@ -25,7 +25,7 @@

a:visited {

text-decoration: none;

font-weight: bold;

- color: #f3f3f3;

+ color: #888;

}

a:hover,

a:active {

@@ -440,4 +440,17 @@

font-style: italic;

}

+/ source code block/

+pre.src {

+ border:solid 1px;

+ -moz-box-shadow: 5px 5px 5px #000; / Firefox /

+ -webkit-box-shadow: 5px 5px 5px #000; / Safari, Chrome /

+ box-shadow: 5px 5px 5px #000; / CSS3 /

+ clear: none;

+ float: none;

+ font-family: "Courier New",monospace,Monaco,Lucida Console !important;

+ margin:5px;

+ overflow:auto;

+ white-space: pre;

+}

/ End Comments /

初学者使用Emacs的难点

作者: 陈斌(redguardtoo)

原创时间: 2012-03-06 二

配置成神一样的编辑器要花很多时间

抄高手的配置,不要抱着玩玩的心态在低水平上创新.

Steve Purcell的配置 https://github.com/purcell/emacs.d
Matt Briggs的配置 https://github.com/mbriggs/.emacs.d
我的配置(抄Steve Purcell的,加中文和C++支持) https://github.com/redguardtoo/emacs.d

太难看

安装emacs24,然后看这:http://www.emacswiki.org/emacs/ColorTheme

记不住那么多命令,打字太烦

安装Smex,记住你最常用的命令,只要打命令中的关键字就可以匹配.使用Smex后我基本不再设置快捷键.

没有非用不可的功能,总能找到替代品

Org Mode是非常优秀的软件,可以用来做笔记,做GTD,写文档.我没有找到替代品.

对Vi用户来说快捷键陌生且低效

安装Evil,emacs版的vim(注意,不是vi),结合Vi的高效和Emacs的强大的编辑器,完美了.

对普通用户来说快捷键陌生

试着适应吧,Emacs比Notepad出生的早,所以你不能怪Emacs.

Ctrl键太难按

交换Caps Lock和左Ctrl.

不知道怎么看帮助

快捷键 说明
C-h v 按变量名查找
C-h f 按函数名查找
C-h k 按快捷键查找

恩,有时候我要用代理(Emacs很多功能需网络)

在bash下:

export http_proxy=http://127.0.0.1:8000; emacs

使用socks server和tsocks:

tsocks emacs

正确的头部保健

  • 抬头挺胸缩下巴(拉直颈椎)
  • 轮流头部向左右侧弯低头俯视
  • 耸肩
  • 不可以头转圈
  • 不可以仰头

台湾医师的建议,见http://mypaper.pchome.com.tw/herbert0937/post/1322716827

Notes for js3-mode in emacs

Mark: 3 => cool, 2 => useful, 1 => rarely used

Function Hotkey Comment Mark
js3-mode-toggle-hide-functions C-c C-f show/hide ALL functions 2
js3-narrow-to-defun C-x n d (C-x n w to wide) 3
js3-mode-display-warnings-and-errors 1
js-toggle-element C-c C-o show/hide code snippet between {} 3
js3-next-error M-g M-n or C-x ` 1
js3-beginning-of-defun jump to the beginning of function 2
js3-end-of-defun jump to the end of function 2
js3-mark-defun C-M-h Select the function body 2
js3-enter-mirror-mode Automatically insert [],()… 2

How to debug GTK warning

My code (based on wxWidgets) will produce some annoying gtk warnings when debugged in gdb. The best way to debug it is run –g-fatal-warnings in gdb.

Tips for debug C++ code in emacs

  • M-x gdb then M-x gdb-many-windows
  • display/call/s(tep)/n(ext)/watch in gud-mode
  • assert, use frame #num to located the failed assertion
  • windmove-down/up/left/right to move between many windows
  • winnner-mode to redo/undo windows layout
  • C-x r w to save widnows layout, C-x r j to load windows layout

一年成为Emacs高手(像神一样使用编辑器)

本页面停止更新,最新版本在GitHub上 (https://github.com/redguardtoo/mastering-emacs-in-one-year-guide)