(翻译)Emacs Hooks
Table of Contents
51.2.2 Hooks
Hooks(钩子或挂钩,为了保持文章的纯正性,这种专有名词不做翻译,后续以hooks为主),是定制化Emacs非常重要的一种机制。
一个Hook就是一个Lisp变量,其中包含了一系列在某个特定场景下调用的函数,列表中每个函数叫做hook function。比如kill-emacs-hook
会在Emacs推出前运行。
大部分hook都是Normal HOOK,这意味着每当EMACS运行这个Hook,Hook里面的函数会不带参数依次运行。我们努力维持使大多数HOOK都是normal
hook,以便在使用时保持统一的格式。每一个以‘-hook’结尾的Elisp变量都是normal hook.
少部分hooks是abnormal hooks,他们的名字以‘-functions’结尾,使这些hooks成为abnormal hooks的是其中包含的函数的调用方式。
他们或许需要参数或者他们的返回值会被使用。例如,find-file-not-found-functions 就是一个abnoral hooks,因为只要其中一个函数返回
non-nil,剩余的函数就不会继续被调用了。每一个abnormal hook 变量的文档揭示了其中每个函数的用法。
你可以像设置其他lisp 变量一样使用setq来设置hook变量,但推荐的方式是使用add-hook函数来增加函数到hook里,如下例所示。
大部分Major mode,会在initialization的最后一步调用一个或多个mode hooks,mode hooks是一种便捷的方式去定制每一个modes的行为,
mode hooks都是normal的,例如,这里这里设置一个hook在text mode及其他基于text mode 的模式里开始自动填充模式(minor mode).
(add-hook 'text-mode-hook 'auto-fill-mode)
这是通过调用auto-fill-mode函数并且不加参数,来开启minor mode
接下来,如果你不想在Latex mode中开启auto-fill-mode(Latex mode是基于text mode的),你可以如下设置。
(add-hook 'latex-mode-hook (lambda () (auto-fill-mode -1)))
这里我们使用了特殊宏lambda构造了一个anonymous函数,调用auto-fill-mode ,并赋予参数-1,关闭minor-mode,因为LaTex会在text-mode-hook后
运行latex-mode-hook.
这里给出一个更加复杂的例子,如何使用一个hook去定制C代码的缩进
(setq my-c-style
'((c-comment-only-line-offset . 4)
(c-cleanup-list . (scope-operator
empty-defun-braces
defun-close-semi))))
(add-hook 'c-mode-common-hook
(lambda () (c-add-style "my-style" my-c-style t)))
Major mode hooks(主模式hooks)也会在其他继承于该主模式的其他主模式生效,比如HTML模式继承于text mode,当HTML mode开启的时候,
会先运行text-mode-hook,再运行html-mode-hook,这是一种通过一个hook影响多个相关模式的方式。特别的是,如果你想通过一个hook影响所有
编程语言模式(programing language mode),将函数加入到prog-mode-hook;
在设计hook的时候最好让其中的函数执行顺序不影响结果,任何依赖于函数执行顺序都可能带来麻烦。但函数执行顺序是可预测的,他们会以在hook
中呈现的顺序来执行。
你可以使用remove-hook来清除函数,也可以使用 setq hook-variable nil来清除整个hook
如果hook变量是一个buffer-local,那么buffer-local变量会被使用而不是全局变量,如果buffer-local变量包含元素t,那么全局hook
也会运行。
(翻译)Emacs Hooks的更多相关文章
- Emacs 相关资料翻译
Table of Contents 1. 37 Document Viewing 2. EmacsrelatedTranslation 2.1. Spacemacs 配置层(Configuration ...
- Emacs 快速指南(中文翻译)
Emacs 快速指南 目录 1. 小结(SUMMARY) 2. 基本的光标控制(BASIC CURSOR CONTROL) 3. 如果 EMACS 失去响应(IF EMACS STOPS RESP ...
- 【翻译】Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么?
0.前言 虽然很早就知道R被微软收购,也很早知道R在统计分析处理方面很强大,开始一直没有行动过...直到 直到12月初在微软技术大会,看到我软的工程师演示R的使用,我就震惊了,然后最近在网上到处了解和 ...
- emacs最简单入门,只要10分钟
macs最简单入门,只要10分钟 windwiny @2013 无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...
- Hooks——钩子概览
(资料源于MSDN,本文仅对其进行翻译.批注.其链接为:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959%28v=vs. ...
- 学习Emacs系列教程
emacs最简单入门,只要10分钟 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 ...
- 【程序猿助手】Emacs,最强的编辑器,之间的不
wx_fmt=png" alt="" style="max-width:100%; height:auto!important"> 内容简单 ...
- 【程序员小助手】Emacs,最强编辑器,没有之一
内容简介 1.Emacs简介 2.Emacs三个平台的安装与配置 3.自动补全插件 4.小编的Emacs配置文件 5.常用快捷方式 6.和版本控制系统的配合(以SVN为例) [程序员小助手]系列 在这 ...
- 我的Emacs折腾经验谈(一) 一些给新人的建议
这几天都没有动力写mongodb的东西,我果然还是太懒了么~ 主要是没有一个系统的东西整理出来,加上我令人拙计的语言表达能力,这个坑只能慢慢再补了. 最近在折腾emacs这个东西,首先说我曾经算是个极 ...
随机推荐
- 【转】 XDC介绍
转:http://blog.sina.com.cn/s/blog_693301190100sitz.html XDC是TI公司为嵌入式实时系统可重用软件组件(在XDC里被成为packages,以下成为 ...
- 使用automake等命令自动生成Makefile文件 (转载)
使用automake等命令自动生成Makefile文件 Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...
- SPSS数据分析—基于最优尺度变换的典型相关分析
传统的典型相关分析只能考虑变量之间的线性相关情况,且必须为连续变量,而我们依然可以使用最优尺度变换来拓展其应用范围,使其可以分析非线性相关.数据为分类数据等情况,并且不再仅限于两个变量间的分析, 虽然 ...
- linux哲学思想
linux哲学思想 1.一切皆为文件 linux将所有的对象几乎都抽象为文件,无论是硬件设备.还是通讯接口都当做文件处理,这样可以设计统一的访问控制操作(read();write();delete() ...
- 改善C#程序,提高程序运行效率的50种方法
改善C#程序,提高程序运行效率的50种方法 转自:http://blog.sina.com.cn/s/blog_6f7a7fb501017p8a.html 一.用属性代替可访问的字段 1..NET ...
- 反斜杠在JSP中的两种不同的含义
/ 在不同条件下的不同含义 / 代表WEB应用的根路径的情况:/ 交给 Servlet容器来处理 请求转发时: request.getRequestDispatcher("/xxxx&quo ...
- JAVA类与对象
Employee类: public class EmployeeTest { public static void main(String[] args) { // fill the staff ar ...
- hexo 本地local4000打不开解决方法
错误:Cannot GET /spadesq.github.io/ (注:spadesq.github.io是原来放hexo文件夹的名字) 由于我后来把hexo文件夹搬迁到别处,但我发现打开本地,地址 ...
- 关于maven
主要涉及的配置文件是setting.xml与pom.xml 其中setting配置文件主要负责加载jar包路径设置, pom.xml文件主要负责jar包配置. 包含jar包的版本. maven打包:之 ...
- opencv 小任务1 图片的缩放
#include <opencv2/opencv.hpp> using namespace std; int main() { double fScale = 0.2; //缩放倍数 Cv ...