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的更多相关文章

  1. Emacs 相关资料翻译

    Table of Contents 1. 37 Document Viewing 2. EmacsrelatedTranslation 2.1. Spacemacs 配置层(Configuration ...

  2. Emacs 快速指南(中文翻译)

      Emacs 快速指南 目录 1. 小结(SUMMARY) 2. 基本的光标控制(BASIC CURSOR CONTROL) 3. 如果 EMACS 失去响应(IF EMACS STOPS RESP ...

  3. 【翻译】Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么?

    0.前言 虽然很早就知道R被微软收购,也很早知道R在统计分析处理方面很强大,开始一直没有行动过...直到 直到12月初在微软技术大会,看到我软的工程师演示R的使用,我就震惊了,然后最近在网上到处了解和 ...

  4. emacs最简单入门,只要10分钟

    macs最简单入门,只要10分钟  windwiny @2013    无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...

  5. Hooks——钩子概览

    (资料源于MSDN,本文仅对其进行翻译.批注.其链接为:http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959%28v=vs. ...

  6. 学习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 ...

  7. 【程序猿助手】Emacs,最强的编辑器,之间的不

     wx_fmt=png" alt="" style="max-width:100%; height:auto!important"> 内容简单 ...

  8. 【程序员小助手】Emacs,最强编辑器,没有之一

    内容简介 1.Emacs简介 2.Emacs三个平台的安装与配置 3.自动补全插件 4.小编的Emacs配置文件 5.常用快捷方式 6.和版本控制系统的配合(以SVN为例) [程序员小助手]系列 在这 ...

  9. 我的Emacs折腾经验谈(一) 一些给新人的建议

    这几天都没有动力写mongodb的东西,我果然还是太懒了么~ 主要是没有一个系统的东西整理出来,加上我令人拙计的语言表达能力,这个坑只能慢慢再补了. 最近在折腾emacs这个东西,首先说我曾经算是个极 ...

随机推荐

  1. mybatis入门_mybatis基本原理以及入门程序

    一.传统jdbc存在的问题 1.创建数据库的连接存在大量的硬编码, 2.执行statement时存在硬编码. 3.频繁的开启和关闭数据库连接,会严重影响数据库的性能,浪费数据库的资源. 4.存在大量的 ...

  2. 转:如何实现一个malloc

    如何实现一个malloc 转载后排版效果很差,看原文!   任何一个用过或学过C的人对malloc都不会陌生.大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉. ...

  3. oracle笔记一

    一.Oracle简介 1.Oracle属于关系型数据库,是一款可以在Client/Server模式下运行的RDBMS产品.2009年,Oracle公司收购SUN. 2.Oracle是对象关系型数据库管 ...

  4. 通过form表单获取值

    <!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...

  5. 即时聊天IM之四 Android客户端IM帮助类编写

    图文无关一起娱乐: 这一篇我们开始写Android端的Smack版主类,后面Android的IM功能都是通过这个帮助类实现的 引用类库: 因为我用的是IDE是Android Studio,所以我通过g ...

  6. VC界面最前端显示

    //显示在最前端 m_pMainWnd->SetWindowPos(&CWnd::wndTopMost, 0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); if (m_pM ...

  7. oracle 中数据库完全导入导出:cmd命令行模式(转载)

    http://www.3lian.com/edu/2012/12-01/47252.html Oracle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库 ...

  8. MySQL之远程登录配置

    1.注释掉mysql配置文件中的这一行:#bind-address  = 127.0.0.1 2.给指定服务器的用户授权:GRANT ALL PRIVILEGES ON *.* TO root@&qu ...

  9. MySQL ERROR 1005: Can't create table (errno: 150)的错误解决办法

    在mysql 中建立引用约束的时候会出现MySQL ERROR 1005: Can't create table (errno: 150)的错误信息结果是不能建立 引用约束. 出现问题的大致情况 1. ...

  10. 在input中实现点点点与当鼠标移上去时显示剩余的字

    项目中经常会遇到这个问题,在一个内容框中,由于框的宽度是固定的,但是里面的内容却有很多,那么这个时候需求里就要求第一,多余的字要以点点点的形式隐藏,第二,当鼠标移上去的时候要以title提示的方式显示 ...