emacs

Emacs 使用教程

Posted by leone on 2019-04-08

emacs

emacs 是什么?

Emacs,著名的集成开发环境和文本编辑器。Emacs被公认为是最受专业程序员喜爱的代码编辑器之一,(另外一个vim)
EMACS,即Editor MACroS(编辑器宏)的缩写,最初由Richard Stallman(理查德·马修·斯托曼)于1975年在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使用Emacs Lisp,这种有着极强扩展性的编程语言,从而实现了包括编程、编译乃至网络浏览等等功能的扩展。

发展历史

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的说法,他采用这个名字是“因为当时在ITS里还没有被当作缩写用过。”(“because 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虽然是在TECO的基础上发展起来的,不过它已经足以被认为是一个新的文本编辑器了。很快,Emacs就成为ITS上的标准编辑程序,接着由Michael McMahon移植到Tenex和TOPS-20系统上。

Emacs的功能

Emacs不仅仅是一个编辑器,他是一个整合环境,或可称它为集成开发环境,这些功能如让使用者置身于全

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

各平台上的Emacs

Emacs是目前世界上最具可移植性的重要软件之一,能够在当前大多数操作系统上运行,包括类Unix系统(GNU/Linux、各种BSD、Solaris、AIX、IRIX 等等)、MS-DOS、Microsoft Window 以及OpenVMS等,还有移动Android平台以及iOS。
Emacs既可以在文本终端也可以在图形用户界面(GUI)环境下运行。在类Unix系统上,Emacs使用X Window产生GUI,或者直接使用“框架”(widget toolkit),例如Motif、LessTif或GTK+等等。Emacs也能够利用Mac OS X和Microsoft Windows的本地图形系统产生GUI。用GUI环境下的Emacs能提供菜单(Menubar)、工具栏(toolbar)、scrollbar以及context menu等交互方式。

Emacs使用

Quick Start

操作文本文件,无外乎打开文件、编辑文件、保存文件,涉及的核心、最高频命令非常简单,整理如下:

emacs :进入Emacs

C-x C-f [文件路径] :打开一个文件

C-n:将光标向下移动一行

C-p:将光标向上移动一行

C-g:取消之前的按键(将会成为最常用的按键之一)

C-x C-s:保存文件

C-x C-c:退出Emacs

移动操作

C-n:将光标向下移动一行

C-p:将光标向上移动一行

C-b:将光标左移一个字符

C-f:将光标右移一个字符

M-f:将光标右移一个单词

M-b:将光标左移一个单词

C-v:向下移动一屏

M-v:向上移动一屏

C-l:将当前光标所在行移动到屏幕中央(注意:这里是字母L)

C-a:将光标移到行首

C-e:将光标移到行尾

M-S-<:将光标移动到文件开头

M-S->:将光标移动到文件末尾

M-m:将光标移动到行首的第一个非空白字符

查找与替换操作

C-s [查找的内容]:向前查找

C-r [查找的内容]:向后查找

C-M-s [查找的内容]:向前正则查找

C-M-r [查找的内容]:向后正则查找

M-S-%:查找并替换,操作步骤如下:按下M-S-%键启动查找替换,输入要被替换的词,回车,然后输入要替换的词,再回车。被替换的词此时会高亮起来,这时,输入y替换并跳到下一个,输入n忽略并跳到下一个,输入q结束,输入!替换剩下的全部。

文本选择操作

C-S-e:选中从当前位置到行尾的文本

C-S-n:从当前位置开始往下选中一行文本

C-S-p:从当前位置开始往上选中一行文本

C-S-f:从当前位置开始往后选中一个字符

C-S-b:从当前位置开始往前选中一个字符

M-S-f:从当前位置开始往后选中一个单词

M-S-b:从当前位置开始往前选中一个单词

M-S-e:选中从当前位置开始到当前句尾的文本

M-S-a:选中从当前位置开始到当前句首的文本

C-S-@ [其他移动操作]:从一个起始位置,选中连续的字符,比如C-S-@ C-e就表示选中从当前光标位置到行尾的所有字符

C-S-v:向下选择一屏

M-S-v:向上选择一屏

C-S-l:让当前光标所在行居中

C-x h:全选

文本编辑操作

插入文本:只要光标在当前缓冲区,就可以直接输入插入文本。

C-k:删除光标到行尾的所有字符

C-u [N] [操作序列]:重复执行一个操作序列N次

C-/或C-x u:撤销(undo)上次操作,多次按可以撤销之前的多次操作

C-g C-/:重做(redo),用于重做上次的撤销动作(撤销之后后悔了,想恢复重做)

:删除当前光标前的一个字符

C-:删除当前光标前的一个单词

C-d或:删除当前光标后的一个字符

M-:剪切当前光标前的一个字符到剪贴板

M-d:剪切当前光标后的一个字符到剪贴板

C-k:剪切从光标到行尾的字符到剪贴板

C-y:粘贴剪贴板中的文本到当前光标位置

M-w:复制当前选中的字符

C-w:剪切当前选择的字符到剪贴板

C-a C-k:剪切一整行到剪贴板中,其实也可以用于删除一整行

C-e :在当前行下方插入一空行

C-x C-q:让当前buffer在“只读”和“读写”两种编辑模式之间切换

多窗格与多窗口
首先要明确一下Emacs中窗格与窗口的概念的区别:每个窗格其实就是一个缓冲区,一个窗口中可以同时打开多个窗格,而窗口就是像Windows那样的GUI窗口。

C-x 1:仅保留当前窗格,关闭其他窗格

C-x 2:在垂直方向打开2个窗格

C-x 3:在水平方向打开2个窗格

C-x o:在不同窗格之间切换

C-x 0:关闭当前窗格

C-x S-{:减小当前窗格的水平宽度

C-x S-}:缩小当前窗格的水平宽度

C-x S-^:增大当前窗格的垂直高度

C-M-v:在另一个窗格中向下滚动一屏(但光标还保留在当前窗格)

C-M-S-v:在另一个窗格中向上滚动一屏(但光标还保留在当前窗格)

M-x make-frame:打开一个新窗口

M-x delete-frame:关闭当前窗口

C-z:挂起当前的窗口(相当于最小化当前的窗口)

文本编码

M-x describe-coding-system :查看当前缓冲区的编码格式

C-x r :列出当前的所有编码

C-x f utf-8 :改变当前缓冲区的编码为utf-8

命令与函数操作

M-x [函数名] :执行一个函数

M-S-! [命令] :执行一个命令行命令

M-x shell :在一个新窗格中、当前目录位置打开命令行