您好, 访客   登录/注册

Emacs配置与扩展技术

来源:用户上传      作者:

  摘  要:Emacs是高扩展性的编辑器,可通过配置支持多种复杂编辑模式。不同于其它编辑器的简单配置脚本,Emacs的配置和扩展是通过 Emacs-lisp语言完成的,Emacs配置普遍被认为是较为复杂的和难以掌握的。文章着重探讨并分析了Emacs配置与扩展的相关技术。
  关键词:Emacs;Lisp;配置;扩展
  中图分类号:TP391 文献标志码:A 文章编号:2095-2945(2019)16-0134-03
  Abstract: Emacs is a highly extensible editor that can be configured to support a variety of complex editing modes. Unlike the simple configuration scripts of other editors, the configuration and extension of Emacs is done through the Emacs-lisp language. Emacs configuration is generally considered to be more complex and difficult to master. This paper mainly discusses and analyzes the related technologies of Emacs configuration and extension.
  Keywords: Emacs; Lisp; configuration; extension
  1 Emacs简介
  Emacs是著名的文本编辑器,最初是在上世纪70年代完成。Emacs是“Editing MACros”的缩写,意为宏编辑器。不同于一般的编辑器,Emacs具有极强的可扩展性。在文本编辑之外,Emacs通过与其他工具结合起来能够支持各种语言程序开发,上网和新闻组,文件和系统管理,撰写文章等一系列功能,成为一个具有强大功能且高度集成的生产力工具。
  2 Emacs与常见文本编辑器配置方式比较
  2.1 Emacs和Vi比较
  Emacs和Vi是深受程序员喜爱的两大编辑器,各有特点。Vi是著名的轻量级文本编辑器,在完成轻量级任务时有很大优势,比如简单调整系统配置,远程终端的简单访问和操作。Vi的强大之处在于其编辑快捷键易用,和终端无缝结合。相比之下,Emacs复杂度要高很多,但在处理复杂任务,大量不同类型的文件时,Emacs将更有优势。值得注意的是,Vi也需要通过一定配置才能发挥较强的功能,比如大部分程序员为了方便开发,还是结合多个较复杂插件将Vi配置为集成开发环境。在这个角度上,Vi扩展的编写不如Emacs用Lisp语言开发那么方便,虽然理论上Vi也是可以用通用语言Python去扩展的,但毕竟不是原生的扩展语言。事实上通过合理配置,Emacs其实是可以模拟大部分Vi的特性的,这也是目前比较流行的模式,不使用原生的Vi,而是把Vi的特性結合进入Emacs中,两者兼用。这个思路是目前大多数流行的Emacs配置采用的。
  2.2 Emacs和Sublime Text,VS Code比较
  近些年也有一些新的可扩展文本编辑器,比较有名的有Sublime Text,微软写的VS Code,这些工具也都意在提供高可扩展性的编辑工具,尤其是多种语言程序的开发工具。这些编辑器优势在于易于上手,其扩展性更多的是通过官方丰富的插件来完成的,对于新手更加友好。用户也可以通过简单脚本文件定制编辑器特性,不过其所支持的定制语言不够强大,定制复杂配置是不容易的。相比而言,Emacs的可扩展性更强,定制方式更加灵活,所以很多人依然选择使用Emacs而不是转入新的文本编辑工具。对于经验丰富的编程人员来讲,Emacs更容易按照自己的工作习惯加以配置和扩展,在众多工具中依然是最佳的选择。Emacs的另一个优势之处是可以和系统结合,不仅仅限制在集成开发环境这样一个功能,而是可以扩展为可以替代Office,图片浏览器,网页浏览器等软件的多功能集成工具。这是目前任何一款可扩展文本工具都是无法做到的,这也是Emacs作为一个古老软件至今依然保持开发活跃的原因。当然,Emacs开源和社区高度开放的特性也是其优势之处和更容易扩展的原因之一。
  3 Emacs配置与扩展技术
  3.1 Emacs-lisp扩展编程
  Emacs配置与扩展可以通过Emacs-lisp语言开发。Emacs-lisp语言是Lisp语言的一种方言。Lisp是早期的程序设计语言之一,其语言设计源于lambda计算理论,语言简洁并能够优雅的支持目前主流的程序设计范式。Emacs-lisp包含完整的Lisp语言特性,这是由于Emacs底层用C语言实现了Lisp的解释器和基本的内置编辑函数。因此Emacs的大部分功能是由Emacs-lisp实现的,同样也可以用Emacs-lisp语言方便的进行扩展,进一步Emacs-lisp语言也可直接访问Emacs的内置功能函数接口。这样的特性使得使用Emacs-lisp进行程序设计和Emacs配置开发非常方便。
  3.2 Emacs配置加载
  Emacs的入口文件可以是~/.emacs或者~/.emacs.d/init.el。常见的方式是使用后者,因为后者有利于模块化配置程序。Emacs配置一般是有一定规模的复杂程序,模块化设计可以使配置程序易读易改。Emacs-lisp语言的每一个模块对应一个文件,在文件尾部使用provide使模块可被其它程序引用,引用方式是通过require指定,从而加载模块中的所有变量和函数,使其对当前程序可见。为了模块能被Emacs发现并正确加载,通常需要在init.el文件开始部分使用load-path指定所需所有模块的路径,作为加载配置的起始点。Emacs加载模块并非只有这一种方式,事实上,为了加快Emacs的启动速度,不是所有模块都在init.el初始化时加载。最好的加载实践是在Emacs启动时仅加载基本模块,其它功能模块时在被使用时动态加载,比如启动时不加载Python开发相关模块,而且在打开Python文件进行编辑时才加载。有两种方式可以实现动态模块加载,不使用第三方工具的情况下,可以用autoload设置动态加载的函数,结合宏with-eval-after-load指定动态加载配置代码,实现模块函数当调用时才加载,相关函数在模块加载后才执行。目前比较流行的方式是使用第三方工具use-package,该工具包定义了use-package宏,能够以简洁的方式指定模块中需要动态加载的函数和变量,以及指定配置代码与模块加载的相对顺序。   3.3 Emacs功能配置
  使用Emacs-lisp语言可以扩展Emacs功能,但是功能实现的方法与一般的程序设计并不完全相同。Emacs作为一个软件项目,功能实现是遵循一定结构的,这个结构的基础就是Major-mode和Minor-mode。Major-mode是Emacs支持多种类型文件编辑的基础,每一种文件类型就对应一个Major-mode的设计。不同的文件类型可以是各种程序设计语言,如python-mode,c-mode等,也可以是各種标记语言,如用于文档写作的auctex-mode和用于绘制图结构的dot-mode等,也可是其它多种工具缓冲区,比如终端,图片浏览器等。Minor-mode是对Major-mode功能的补充,通常是多个类型文件共有的某种功能,比如linum-mode设置文件的行号显示,company-mode用于文件编辑的自动补全,这个补全既可以是编程变量名和函数名的补全,也可以是文档写作的英文单词和汉字短语的补全。因此,对Emacs功能的扩展就是建立在对Major-mode和Minor-mode的个性化定制基础上的。对于Major-mode可以通过add-hook来添加配置,配置代码写在其参数函数的内部。对于没有可用的Major-mode,也可以自己定义一个Major-mode,定义时的代码要遵循Emacs-lisp Major-mode 结构规范来完成。Minor-mode的定制可以通过直接设置参数变量来完成,有时也需要在特定的Major-mode的配置中分别对Minor-mode进行设置。
  3.4 使用Python扩展Emacs
  在大多数情况下,使用Emacs-lisp语言扩展Emacs是比较容易和方便的。但对于有些个性化定制比较独特的情况,Emacs-lisp会缺乏相应的功能包,使得定制编程比较复杂,这就需要有一种通用语言来支持。通用语言往往具备更丰富的生态环境,比如要使Emacs成为一个论文管理器,需要对bibtex进行解析,这个在Emacs-lisp中并没有相关的工具,但在通用语言中一般都有相应的支持,比如Python。Pymacs是一个可以使Python与Emacs-lisp混合编程的工具,使用Pymacs可以用Python语言扩展Emacs-lisp的程序。Pymacs包含两个部分:pymacs.el是一个Emacs的模块,需要放置在可加载的路径下,并在配置文件中显示加载;pymacs.py是Python模块,需要安装到系统Python的第三方库中。在配置好Pymacs后,就可以用python-load来加载自定义Python模块中的函数了,函数名在Emacs-lisp中被加上参数指定的前缀。另外pymacs还提供更多功能函数如python-call,python-exec等,使混合开发更为灵活。
  3.5 使用系统功能扩展Emacs
  Emacs本身是一个编辑前端,在多种支持复杂编辑模式的时候大量用到了操作系统提供的工具,比如用于文本检索的grep,用于版本控制管理的git,用于文档写作的latex等等。为了使Emacs基于后端操作系统工具提供界面,实际上需要Emacs能够方便访问到操作系统可执行命令。最直接的一种方式是通过内置功能函数shell-command直接调用shell命令,比如为打开网页文件或者打开pdf文件指定可执行程序就可以直接用这种方式在配置文件中设置,通过键映射可以把定制的命令映射为编辑快捷键,实现一键调用。另一种方式是第三方模块中用到某些内置功能函数,比如拼写检查用到ispell,文档写作用到xelatex,这需要Emacs与操作系统共享其环境变量,有许多这方面的插件提供了把系统环境变量导出到Emacs的功能。Emacs作为一个文本编辑器,其文本编辑和导航的功能因为操作系统的支持而变得强大。借助系统拼写工具可以用拼写工具自动检查拼写,借助系统文本检索工具,可以支持递归目录下多文件内、多缓冲区内、项目多文件内正则文本检索。结合多文件检索和helm可以生成多条目录形式的切换选项,形成方便的导航功能。结合多文件检索和iedit,可以实现递归目录下多文件编辑替换,其原理是把检索到的文件以条目形式整合到一个缓冲区内,在该缓冲区内可以使用各种编辑工具同时替换多个文件的内容,甚至可以用vi命令做基于正则表达式的复杂替换。有了操作系统工具的强力支持,Emacs就拥有了多文件编辑和检索,latex文档书写,图片循环查看,pdf文件阅读,甚至上网浏览网页,网络即时通信等功能,如果配置足够丰富,可以在日常计算机使用中几乎不必打开任何其它图形用户界面软件。Emacs还以多种方式支持终端,也就是说终端也不必单独打开,而是在Emacs中开一个缓冲区使用即可。eshell是用Emacs自带的终端模拟,能够模拟终端的大部分功能,除了可以执行shell命令外还可以执行Emacs-lisp命令,用起来十分方便。eshell另一个非常有用的功能就是对于远程机器和虚拟容器的远程目录访问提供了强大支持,cd命令可以直接进入到远程目录里,只需要指定远程机器或者虚拟容器的用户和访问路径。
  参考文献:
  [1]Debra Cameron, James Elliott, Marc Loy. Learning GNU Emacs, 3rd Edition. O'Reilly, 2004.
  [2]Eric S. Raymond. Unix 编程艺术[M].电子工业出版社,2006.
转载注明来源:https://www.xzbu.com/1/view-14871994.htm