(翻译)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这个东西,首先说我曾经算是个极 ...
随机推荐
- X.509,RSA,PKCS 普及
X.509 X.509是一种非常通用的证书格式.所有的证书都符合ITU-T X.509国际标准,因此(理论上)为一种应用创建的证书可以用于任何其他符合X.509标准的应用. 在一份证书中,必须证明公钥 ...
- WPS 认证机制
WPS 认证机制 WPS(Wi-Fi Protected Setup,Wi-Fi保护设置)(有的叫做AOSS.有的叫做QSS,不过功能都一致.)是由Wi-Fi联盟组织实施的认证项目,主要致力于简化无线 ...
- OCP笔记001
2. View the Exhibit to examine the description for the SALES table. Which views can have all DML ope ...
- windows下安装python模块
如何在windows下安装python模块 1. 官网下载安装包,比如(pip : https://pypi.python.org/pypi/pip#downloads) pip-9.0.1.tar. ...
- unity平台的预处理
unity平台的预处理 在开发中,特别是unity的跨平台中,我们经常会在各个平台游走,如安卓版,苹果版,PC版.......在此不同的平台上,有可能我们需要做不同的操作.然而我们就可以用un ...
- Python之路 day2 字符串/元组/列表/字典互转
#-*-coding:utf-8-*- #1.字典 dict = {'name': 'Zara', 'age': 7, 'class': 'First'} #字典转为字符串,返回:<type ' ...
- 【xsy1629】可持久化序列 - 可持久化平衡树
题意 你现在要用数据结构维护一个长度为n的序列. 这个序列支持三种操作: 1 l r:将序列中的第l项到第r项这一段翻转. 2 l r:查询序列中[l,r]这一段的和. 3 p:回到第p个历史版本. ...
- 关于启用 HTTPS 的一些经验分享(一)
转载: 关于启用 HTTPS 的一些经验分享(一) 随着国内网络环境的持续恶化,各种篡改和劫持层出不穷,越来越多的网站选择了全站 HTTPS.就在今天,免费提供证书服务的 Let's Encrypt ...
- java selenium验证元素是否存在
public boolean ElementExist(WebDriver driver,By locator) { try { driver.findEle ...
- setWinldowRgn
CRgn(HRGN) SetWindowRgn setRgn{ CRgn rgnRect; CRgn rgnHole; //获取窗口大小 CRect rcWnd; GetWindowRect(& ...