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. django框架代码基础

    urls.py 导入相对应的模块from django.conf.urls import url,includefrom django.contrib import adminfrom son1.vi ...

  2. Jquery实现账单全部选中和部分选中管理

    在做购物车系统是我们往往会遇到这样一个需求,在点击全选框时我们要将全部的单个账单都选中;在单个选中账单时,如果账单全部被选中则需要全选框处于选中状态,若没有全部被选中则全选框处于没选中状态; 以下是在 ...

  3. gdb 常用内容

    gdb exegdb exe coregdb -p info m TAB ^関数の先頭 info b ^list the breakpoint set args -a test ^引数設定 show ...

  4. 关于offsetWidth,offsetHeight,offsetTop,offsetLeft和二维数组的声明

    offsetWidth,offsetHeight,offsetTop,offsetLeft 为只读状态,返回的值是int形式 只读形式即不能通过修改其值的大小. 想要修改某元素的这些值的大小(widt ...

  5. android 使用httpclient访问网络

    在主活动类中,调用一个线程访问网络(android4.0以上耗时的操作不能放在主线程中):       //声明两个Button对象,与一个TextView对象private TextView mTe ...

  6. LINUX磁盘分区、格式化、挂载、卸载全程详解

    1.一切皆文件 Linux系统有一个理念:“一切皆文件”,所以计算机的硬件在linux中也是以“文件”的形式存在于/dev目录中.   图为CentOS 6.5系统中/dev目录的部分内容.不同的计算 ...

  7. html/css小练习3

    效果图:

  8. 转载C#下RSA算法的实现(适用于支付宝和易宝支付)

    RSA算法代码: using System; using System.Collections.Generic; using System.Text; using System.IO; using S ...

  9. HTML <div> 标签

    定义和用法: <div> 可定义文档中的分区或节(division/section). <div> 标签可以把文档分割为独立的.不同的部分.它可以用作严格的组织工具,并且不使用 ...

  10. 简单学会.net remoting

    简介 •.net remoting是.net在RPC分布式应用的技术.首先,客户端通过 remoting访问通道以获得服务端对象,再通过代理解析为客户端对象,通过通道来实现远程对象的调用. 原理 •远 ...