Privacy Policy Cookie Policy Terms and Conditions Emacs - Wikipedia

Emacs

维基百科,自由的百科全书

Emacs
  • Emacs
  • GNU Emacs
  • XEmacs
  • Emacs Lisp
  • 其他著名的Emacs变种
    • MicroEMACS
    • mg
    • Freemacs
    • Zile (editor)
编辑

Emacs是一种强大的文本编辑器,在程序员和其他以技术工作为主的计算机用户中广受欢迎。EMACS,即Editor MACroS编辑器)的缩写,最初由Richard Stallman1975年MIT协同Guy Steele共同完成。这一创意的灵感来源于TECMAC和TMACS,它们是由Guy Steele、Dave Moon、Richard Greenblatt、Charles Frankston等人编写的宏文本编辑器。自诞生以来,Emacs演化出了众多分支,其中使用最广泛的两种分别是:1984年由Richard Stallman发起并由他维护至今的GNU Emacs,以及1991年发起的XEmacs。XEmacs是GNU Emacs的分支,至今仍保持着相当的兼容性。它们都使用了Emacs Lisp这种有着极强扩展性的编程语言,从而实现了包括编程编译乃至网络浏览等等功能的扩展。

Unix文化裡,Emacs是黑客们关于编辑器优劣之争的两大主角之一,它的对手是vi

目录

[编辑] 历史

Emacs在1970年代诞生于MIT人工智能实验室(MIT AI Lab)。在此之前,人工智能实验室的ITS上运行的操作系统PDP-6和PDP-10的默认编辑器是一个叫TECO(Text Editor and Corrector)的行编辑器。与现代的文本编辑器不同,TECO将击键、编辑和文本显示按照不同的模式进行处理,稍晚出现的vi与它有些类似。在TECO上击键并不会直接将这些字符插入到文档裡去,必须先输入一系列相应的TECO指令,而被编辑的文本在输入命令的时候是不会显示在屏幕上的。在如今还在使用的UNIX编辑器ed(ed)上,我们还能看到类似的工作方式。

1970年代初,Richard Stallman访问Stanford AI Lab时见到了那里的"E" editor。这种编辑器有着所见即所得的直观特点,深深打动了Stallman。后来Stallman回到MIT,那时候MIT AI lab的黑客Carl Mikkelsen 已经给TECO加上了称作“Control-R”的编辑显示模式,使得屏幕能跟随用户的每次击键刷新显示。Stallman重写了这一模式,使它运行得更有效率,后来又加入了,允许用户重新定义运行TECO程序的键位。

这一新版的TECO立刻在AI实验室流行开来,并且很快积累起了大量自定义的宏,这些宏的名字通常就以“MAC”或者“MACS”结尾,意为“宏”(macro)。两年后,Guy Steele承担起统一当时存在的各种键盘命令集的工作。Steele和Stallman经过一夜奋战,最终由Stallman完成了这一任务,包括一套扩展和注释新的宏包的工具。这个完成的系统被称作EMACS,代表“Editing MACroS”。根据Stallman的说法,他采用这个名字是“因为当时<E>在ITS裡还没有被当作缩写用过。”("because <E> was not in use as an abbreviation on ITS at the time." )也有说法指出,当时波士顿在MIT附近有家名为“Emack & Bolio's”的商店出售的冰激凌很受欢迎,Dave Moon是那里的老主顾,他就将ITS上一个给文本排版的程序命名为BOLIO,然而Stallman并不喜欢甚或根本不知道那种冰激凌,此事后来成了黑客界的一桩公案。

Stallman意识到过多的定制、在开发过程中事实上的分支以及针对特殊用途的限制,威胁着Emacs的发展。后来他写道:

Emacs的发布基于社群共享,这意味着所有的发展都要反馈给我,由我进行整合和发布。("EMACS was distributed on a basis of communal sharing, which means all improvements must be given back to me to be incorporated and distributed."

最初的Emacs,例如TECO,只能运行于PDP-10系统。随后的几年里,开发出了许多针对其他操作系统的类Emacs的编辑器,包括由Michael McMahon和Daniel Weinreb编写的SINE(Sine is not EMACS)、EINE("EINE Is Not EMACS)以及ZWEI(“ZWEI Was EINE Initially”,工作于Lisp机器),它们的名字在德语中分别是“一”和“二”的意思。1978年,Honeywell的Cambridge Information Systems Lab的Bernard Greenberg用Maclisp(Lisp语言的一种)编写出Multics Emacs,用户扩展的程序也用lisp实现。Lisp语言提供了前所未有的灵活性,因此被后来的Emacs开发者沿用。

Emacs虽然是在TECO的基础上发展起来的,不过它已经足以被认为是一个新的文本编辑器了。很快,Emacs就成为ITS上的标准编辑程序,接着由Michael McMahon移植到Tenex和TOPS-20系统上。最早在Unix上运行的Emacs类编辑器是1981年James Gosling编写的Gosling Emacs(Gosling后来发明了Java编程语言)。Gosling Emacs以C语言编写,使用Mocklisp作为扩展语言,Mocklisp有着类似Lisp语言的语法。

图形环境下的GNU Emacs界面。
图形环境下的GNU Emacs界面。

1984年,Gosling Emacs成了专有软件(Proprietary software)。Stallman于是开始致力于GNU Emacs,这将是一个自由软件,以代替Gosling Emacs。最初GNU Emacs是在Gosling Emacs的基础上开发的,不过Stallman后来用一个真正的Lisp解释器代替了原来的Mocklisp解释器,由于Lisp解释器在此软件中的核心地位,这意味着实际上重写了几乎全部代码。GNU Emacs是GNU计划的第一个项目,以C语言编写,将Emacs Lisp(其解释器由C实现)作为扩展语言。GNU Emacs最早广泛发布的版本是15.34,出现于1985年。实际上版本2到12并不存在,GNU Emacs的早期版本都是以“1.x.x”的形式编号,直到1.12版时开发人员放弃了这一记法,因为他们认为主版本号是不应该改动的。因此,Version 13是第一个public release,它发布于1985年3月20日。

GNU Emacs和Gosling Emacs一样运行在Unix系统上。不过GNU Emacs的功能更多,特别是它有一个真正的lisp作为扩展。因此,GNU Emacs很快就取代了Gosling Emacs,成为Unix系统上事实的Emacs编辑器。

1991年,Lucid公司的Jamie Zawinski等人以GNU Emacs 19的一个早期alpha版为基础,添加了一些新的特性,开发出Lucid Emacs。很快,Lucid Emacs的开发与GNU Emacs渐行渐远,最终双方的团队放弃了将两者合并的努力。Lucid Emacs被重新命名为XEmacs,它不像GNU Emacs那样要求严格的代码授权,因此能够吸纳大量的优秀扩展,在很多方面比GNU Emacs更为优秀。到目前为止,两者都是众多Emacs类编辑器中最受欢迎的选择。


[编辑] 功能特点

Emacs不仅仅是一个编辑器,他是一个整合环境,或可称它为集成开发环境,这些功能如让使用者置身于全功能的操作系统中,在基于编辑器的功能基础上,Emacs自行开发了一个“bourne-shell-like”的shell: EShell。Emacs还可以:

  • 收发电子邮件
  • 通过FTP/TRAMP编辑远程档案
  • 通过Telnet登录主机
  • 新闻组
  • 登陆IRC和朋友交流
  • 查看日历
  • 撰写文章大纲
  • 对多种编程语言编辑
  • 调试程序,结合GDB,EDebug等。支持C/C++,PerlPythonLisp等等
  • 玩游戏
  • 计算器
  • 记日记
  • 煮咖啡
  • 管理日程,Task,ToDo,约会等
  • 个人信息管理
  • 目录管理
  • 文件比较
  • 阅读info和man文档
  • 浏览网站
  • 为各种程序(TeX等)提供统一的操作界面
  • ……

此外Emacs还有如下特点:

  1. display editor
  2. 实时编辑器
  3. 高级编辑器
  4. Self-documenting
  5. 可定制性
  6. 可扩展性(集成Lisp语言)
  7. 支持X Window环境


[编辑] 各平台上的Emacs

Emacs是目前世界上最具可移植性的重要软件之一,能够在当前大多数操作系统上运行,包括类Unix系统(GNU/Linux、各种BSDSolarisAIXIRIXMac OS X等等)、MS-DOSMicrosoft Windows以及OpenVMS等。

Emacs既可以在文本终端也可以在图形用户界面(GUI)环境下运行。在类Unix系统上,Emacs使用X Windows产生GUI,或者直接使用“框架”(widget toolkit),例如Motif、LessTif或GTK+等等。Emacs也能够利用Mac OS X和Microsoft Windows的本地图形系统产生GUI。用GUI环境下的Emacs能提供菜单(Menubar)、工具栏(toolbar)、scrollbar以及context menu等交互方式。

[编辑] 编辑模式

Emacs采取的编辑方式是对不同类型的文本进入相应的编辑模式,即“主模式”(major mode)。Emacs针对多种文档定义了不同的主模式,包括普通文本文件、各种编程语言的源文件、HTML文档、TEX与LaTex文档,以及其他类型的文本文件等等。

每种主模式都有特殊的Emacs Lisp变量和函数,使用户在这种模式下能更方便的处理这一特定类型的文本。例如,各种编程的主模式会对源文件文本中的关键字、注释以不同的字体和颜色加以语法高亮。主模式还提供诸如跳转到函数的开头或者结尾这样特地定义的命令。

Emacs还能进一步定义“次模式”(minor mode)。每一个缓冲区(buffer)只能关联于一种主模式,却能同时关联多个次模式。比如,编写C语言的主模式可以同时定义多个次模式,每个次模式有着不同的缩进风格(indent style)。

[编辑] 定制

Emacs用户可以根据自身的需要和偏好对编辑器进行定制。强大而自由的个人定制功能是Emacs受到广泛欢迎的重要原因之一。定制Emacs主要有三种方法。

第一种方法是使用Emacs的交互式定制功能。Emacs提供了图形化的交互界面,使用户能够对可定制的公共变量进行设置。这种方法使Emacs的初学者不需要接触Emacs Lisp代码即可完成定制。

第二种方法是将一系列按键记录为宏,调用这一宏可以重复进行已经记录的一系列复杂操作。宏可以保存并命名,以便按名调用,不过同一时刻只能存在一个匿名的宏。

第三种方法是通过使用Emasc Lisp完成Emacs的定制。这种方法最为复杂,但是也提供了更多的灵活性和更强大的功能。用户通常将个人定制的Emacs Lisp代码保存在一个名为.emacs的配置文件中,Emacs程序运行之初便读取这一文件,完成用户要求的配置。用户可以通过.emacs文件重设变量、重新定义按键的绑定(key bindings)、以及定义新的命令,以方便用户个人的使用。很多高级用户的.emacs文件的个性化配置长达数百行甚至更多,这些个人的定制使他们的Emacs不仅与默认配置的功能不同,每个人的Emacs之间也千差万别。这种差异能很好的满足不同个性的偏好和不同工作的需求。

如果一段Emacs Lisp代码确实有用,它通常会被打包并发布给其他用户。在因特网上能找到很多这样来自第三方的elisp库,例如能用于编辑维基百科条目wikipedia-modeUsenet上的新闻组gnu.emacs.sources专门发布新的elisp库。有些第三方代码最终还成为了Emacs“标准库”的一部分。


[编辑] 文档

[编辑] 国际化

Emacs支持对多种文字的文本编辑,包括UTF-8在内的诸多编码系统,加上对多种字符集、文稿、书写系统,以及不同文化的书写习惯都提供了支持,使得世界上大多数语言的使用者都能通过Emacs进行文本处理。Emacs还能通过调用诸如ispell这样的外部程序,实现多种语言的拼写检查。

[编辑] 版权

[编辑] 使用Emacs

[编辑] 命令

下标给出了一些基本命令。[Ctrl]键以大写C表示,[Meta]键[Alt]键以大写M表示'

Command Keystroke Description
forward-word M-f Move forward past one word.
search-word C-s Search a word in the buffer.
undo C-/ Undo last change, and prior changes if pressed repeatedly.
keyboard-quit C-g Abort the current command.
fill-paragraph M-q Wrap text in ("fill") a paragraph.
find-file C-x C-f Visit a file (you specify the name) in its own editor buffer.
save-buffer C-x C-s Save the current editor buffer in its visited file.
save-with-newname C-x C-w Save the current editor buffer as a file with the name you specify.
save-buffers-kill-emacs C-x C-c Offer to save changes, then exit Emacs.
set-marker C-[space] Set a marker from where you want to cut or copy.
cut C-w Cut all text between the marker and the cursor.
copy M-w Copy all text between the marker and the cursor.
paste C-y Paste text from the emacs clipboard
kill buffer C-x k Kill the current buffer

[编辑] minibuffer

[编辑] 文件管理与显示

[编辑] 参见


[编辑] 外部链接

注:本文第一部分,部分引用自遵守GFDL的Emacs用户指南中译版

THIS WEB:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2006:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu