Emacs, Vi, Lisp, Logo, 小众语言集中营

http://antkillerfarm.github.io/

emacs学习心得

emacs是大名鼎鼎的Richard Stallman的作品,我闻名已久。但作为早期一直在Windows操作系统下打拼的程序员,很少有机会用到emacs。用的最多的还是Notepad和UltraEdit。

后来,在STE工作期间,由于代码需要上传Linux服务器,那个服务器上的Vi又是个命令行程序,用起来很别扭。还好那上面有个GUI式的emacs,总算帮了大忙。但是emacs更深入的功能却没有研究,只是知道里面有了LISP语言的解释器而已。

现将我最近用的比较多的功能罗列如下:

M-x使用技巧:M-x下输入的命令过长的时候,可以输入开头的字符串,然后按TAB,emacs会显示所有满足输入前缀的命令。

复制、剪切——M-w、C-w,或者用M-x cua-mode切换到CUA模式,就可以用C-c和C-v来复制粘贴了

粘贴——C-y

搜索——C-s,如果要利用剪切板的内容来进行搜索的话,使用Esc-y

搜索下一个——继续按C-s

向前搜索——C-r

正则式搜索和普通搜索的快捷键类似——C-M-s和C-M-r //在ubuntu里由于C-M-s和系统快捷键冲突,因此可以用Esc C-s的方式启动向前的正则式搜索。

替换——M-%

保存缓冲区——C-x C-s

十六进制模式——M-x hexl-mode

十六进制模式下跳转到某个十六进制地址——M-g

十六进制模式退出——C-c C-c

多窗口的时候切换窗口——C-x o //”o”,not zero

关闭当前的窗口——C-x 0

只保留当前的窗口——C-x 1

新建一个上下式的窗口——C-x 2

新建一个左右式的窗口——C-x 3

打开shell——M-x shell //shell模式下,如果需要按C-c,终止程序的话,可以按两下C-c

关闭缓冲区——C-x k

比较两个已经打开的缓冲区——M-x ediff-buffers

比较两个文件夹——M-x edirs

缓冲区被外部程序改变之后,重新刷新缓冲区——M-x revert-buffer

Undo——C-x u

Redo——用C-f中断Undo执行序列,然后再Undo,就可以Undo之前做的“Undo”操作,也就是Redo操作了。

打开文件——C-x C-f//这个命令不仅可用于打开文件,还可用于确定emacs默认的操作目录,.emacs配置文件就放在这个目录下,这一点对Windows用户来说十分重要。

空格变TAB——M-x tabify

在emacs中去除^M——M-x replace-string C-q C-m RET

选择整个缓冲区——C-x h

在windows下使用ediff——windows版的emacs没有自带diff工具,可以用cygwin中的diff代替之,具体的办法是将cygwin的bin文件夹加到PATH环境变量中。

高亮显示——C-x w h//后面需要跟正则表达式,如果是要全字匹配才高亮显示的话,可以用\的方式给出相应的正则表达式。

取消高亮显示——C-x w r

M-x list-matching-lines 或 M-x occur——另开一个buffer列出当前buffer中所有匹配正则表达式的那些行。这个功能我找了好半天才查到,之前还以为只有UltraEdit里才有呢。。。

M-x find-grep-dired——列出文件夹下所有匹配字符串的文件的名字。这个命令只能列出文件名,而不能列出在该文件中出现的匹配字符串的位置,有的时候仍然不太好用。

M-x rgrep——这个命令可以解决上面的问题,列出匹配字符串在文件夹中所有出现的位置。

C代码相关的内容:

选择缩进的版式——C-c . //然后会提问使用什么风格,默认的gnu风格是缩进两个空格,我比较喜欢bsd风格的——缩进一个TAB

代码排版——TAB//可支持块操作

输入TAB——C-q TAB

块小写——C-x C-l

块大写——C-x C-u

显示行号——(global-linum-mode t)

跳到第N行——M-g g

使用cscope+emacs在Ubuntu 12.04下的注意事项

1)除了安装cscope还需要安装cscope-el,不然找不到xcscope.el

sudo apt-get install cscope-el cscope

2)xcscope.el的默认路径:/usr/share/emacs/site-lisp。安装好之后,还需要在配置文件~/.emacs(如果当前没有这个配置文件的话,直接创建一个即可)里面加上(require 'xcscope)。或者,如果希望在打开c或者c++文件的时候才加载xcsope,可以这样写:

(add-hook 'c-mode-common-hook
'(lambda ()
(require 'xcscope)))

注:Windows下创建配置文件的步骤:

1.HKEY_CURRENT_USER\Software\GNU\Emacs,注意GNU\Emacs是需要新建的。接下来在Emacs里新建一个HOME项,值是你的emacs路径,比如我的:D:\emacs-23.1\bin。

2.把.emacs文件在这个bin目录下。.emacs文件不能用Windows Explorer创建,但可以用Emacs保存功能来创建。

3)进入源代码的根目录,然后

cscope-indexer -r

即可建立索引文件。

4)添加cscope查询的历史功能

http://sourceforge.net/p/cscope/patches/65/

5)csope中的initial directory表示全局的搜索目录。如果在同一个emacs实例中,打开多个工程的代码时,不要设置这个initial directory,否则所有工程代码都将在这个路径下搜索,而不是在各自的路径下搜索了。

scratch缓冲区

这是每次启动Emacs时,默认打开的几个缓冲区之一。正如缓冲区最上面的说明所说的,它的目的有两个:

1.提供一个草稿缓冲区。

2.提供一个执行Emacs Lisp的缓冲区。需要执行命令的时候,将光标落在相应的Lisp命令右括号的后面,执行C-x C-e即可。

例如,计算器功能:

(+ (* 33 4) 2)

计算33*4+2,可以看出这是一个典型的逆波兰表达式。

快速打开最近打开过的文件

在配置文件~/.emacs中添加:

(require 'recentf)
(setq recentf-max-saved-items 100)
(recentf-mode 1)

Vi

dd 删除整行

Lisp & GUI

客观的说,目前开源领域并没有很好用的和Lisp配套的GUI工具集,几个开源实现要么完工度不高,要么过于古老,好几个的样式都是90年代中期的风格。

更有人指出,GUI基本上是OO语言的天下了,Lisp根本不适合干这个事。

不过事实的真相是:

1.最早的交互式GUI生成工具是用Lisp写的。没错,就是苹果乔教主旗下的Interface Builder,时间是1986年。

2.PTC公司的CAD系统是用Lisp和C++写的。

3.苹果公司早期使用MCL作为GUI开发语言(from 1984),因此那个时代有大量的程序是用Lisp写的。包括Mac上最早的MS Word。Objective-C是乔教主到NextStep之后的事,最初和苹果并无交集。

4.由于Mac在艺术家群体的流行。很多音乐软件是用Lisp写的,包括Open Music, PWGL, ScoreCleaner, Igor Engraver和Symbolic Composer等。

5.有家叫做LispWorks(From 1989)的公司提供对Lisp GUI的商业支持,而且提供的界面并不逊色于GTK、Qt等当代GUI工具集。上面提到的音乐软件基本上都是基于LispWorks的。

综上可见,Lisp开发GUI不是可能性的问题,而是一个有待重新发掘的问题。

Logo语言的安装

Logo语言是我学习计算机时的启蒙语言。那是初一、初二的时候,当时的电脑还是运行Dos的386系统,我们在原始的命令行下,津津有味的编着代码。那时候电脑可是稀罕物,为了节约上机时间,程序都是事先写到小本本上的,我至今还保留着当时的作业本。

话归正传,说说Linux下Logo语言的安装。

1)到Berkeley的官网下载Logo语言的源代码

http://www.cs.berkeley.edu/~bh/logo.html

2)按照源代码包里面readme的提示,编译之。提示缺少libbsd和libtermcap。

3)sudo apt-get install libbsd-dev libncurses5-dev

重新编译即可。

再一次看到熟悉的命令行界面和海龟了:)

小众语言集中营

前言

自从John Warner Backus创立计算机语义学以来,人们发明的计算机语言已不下千种。基本上没有人能够对所有的语言都精通,实际上也没有这个必要。

但我同样不赞成只会一种语言的工程师。因为每种语言之所以存在,必然有其合理之处,只会一种语言会严重局限程序员的眼界。

比如说这篇文章中提到的:

http://imgtec.eetrend.com/blog/5317

“他的单位有一位写Ruby的老员工,一个庞大的工程,代码里面居然只有一个上帝类,就搞定了所有的问题。”

上面这句话,在文中被作者引用来作为不会设计的典范。但是看看作者的知识背景就会发现,这个作者的眼界实际上局限在了面向对象的笼子里,他以为所有的东西都要组成对象才是合理的,反而忽视了设计的目的。

我对这件事的解读是:如果那个老员工的代码能够只用一个类搞定所有的问题,且代码运行、功能扩展都没有大问题的话,那这个老员工就是一个优秀的设计者。即使他的设计思想不是面向对象的。

Linus Torvalds在批评C++的时候,曾说过“好的设计才是第一位的,糟糕的设计用什么语言写出来都是垃圾。”

反过来理解这句话,那就是:语言和设计思想都只是设计的外皮,而不是灵魂。

面向过程的语言

1.编译型

首推C语言,没有之一。其次可以学学Pascal。其他的诸如Basic、Fortran、COBOL,基本上已经成为了历史,如果没有工作上的需要,就不要理会了。

2.解释型

一般用的比较多的是bash、Tcl、perl。随便学一个即可,这三个的使用都挺广泛的。

面向对象的语言

1.编译型

首推C++。C++支持的编程泛型非常多,从某种意义上说,不是个纯粹的面向对象的语言。如果需要开发Mac和iPhone程序的,可以学学Objective-C。

2.虚拟机型

C#和Java,随便学一个。VB.NET、Groovy、Scala都属备选,各有各的好处,尤其后两者属于现在的热点,学学没准就用上了。

3.解释性

Python、Ruby,随便学一个。

科学计算

首推Matlab。这是一种面向矩阵的语言,它的所有数据类型都被理解为矩阵,而不是对象。

函数式语言

1.Haskell

这种语言认为所有的数据类型都是函数。

2.Lisp

这种语言认为所有的数据和函数都是列表,也就是“数据结构”课程上所说的广义表。

标记语言

1.Tex

这是《The Art of Computer Programming》一书的作者Donald Knuth的杰作。从中可以看到后来的HTML、JavaScript、CSS等的影子。MS Office中的格式刷也是参考了Tex的设计。

Tex最为称道的是数学公式的排版。MS Office直到2007才有了类似的效果。

Tex广泛应用于欧美国家科学论文的排版领域,成为顶级科学期刊事实上的格式标准,可说是科研狗的必备技能。

2.数据描述类

INI和Json。这两个比较简单,也非常好用,不多说了。备选有BSON、YAML、

3.网页类

XML、HTML、JavaScript必修。PHP、ASP、JSP,选修其中之一。Nodejs近来比较流行,值得投资。

嵌入式语言

首推Lua。它首先在游戏领域得到广泛使用,现在在其他领域用的也比较多了。我一直在想,如果Lua早发明30年,Emacs会不会使用Lua,而不是Lisp做为内置语言呢?

形式语言

并非所有的编程语言都具有实用性,有些语言的创制,另有其目的。

比如Brainfuck语言。这个语言以出名难用著称,在网上,一般被归为奇技淫巧类语言。然而从语义学的角度,这个语言证明了在冯·诺依曼模型上,最多使用8个符号,就可以构建一个图灵完备语言。

更多这类语言的知识参见:

http://www.15yan.com/story/5Y8BZqIGwjg/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值