emacs 中的键盘宏
宏定义是emacs比较强大的功能,自定义宏然后绑定快捷键之后就更加爽了。
vim 当然也有宏功能,而且用法简单,例如录制宏到a寄存器:qa...q, 执行宏a: @a
世界就是由循环和递归构成的. 宏定义就是一个执行体,为了以后的循环做准备的
开启宏记录 C-x ( 或者 f3
关闭宏记录 C-x ) 或者 f4
执行刚刚录制的宏 C-x e 或者 f4
循环执行n次刚刚录制的宏 C-u n C-x e, 哈哈,录了半天就是为了这一下爽! 是啊,我们不愿做重复劳动!
给刚刚记录的宏记录编辑一个名字 M-x name-last-kbd-marco  然后输入名字, 例如macro1

把刚刚起名字的宏记录写入到文件里面 , 以便将来我们可以重复使用它
先建立一个记录宏记录的文件,例如建立了~/.emacs.d/my_macro.el文件, 若只是实验则可随便起个名字,例如1.txt
M-x insert-kbd-marco 然后输入宏的名字,例如macro1
把宏记录写入到里面。C-x C-s

以后加载这个宏记录文件的方式:
在init.el中添加 (load-file "~/.emacs.d/my_macro.el")就能加载了.
再用(global-set-key (kbd "...." ) '....)就能用绑定快捷键到一个相应名字的宏操作了。

----------------------------------------
现在我们研究一下这个宏记录的是什么.
----------------------------------------
(fset 'bookmark
   [return ?\C-p ?B ?o ?o ?k ?m ?a ?r ?k ?B ?e ?g ?i ?n ?\C-n ?\C-a])
fset 是一个函数, 定义一个符号的功能 (fset SYMBOL Definition)
'bookmark 是一个引用
[] 是什么? 它括住的是一个vector
vector使用的是方括号来进行区间界定。[1 "two" (three)]
vector 是一维数组.不同于lisp的列表,vector访问任何一个元素的时间都是相同的。
而列表的访问速度其实是跟元素在列表的偏移位置相关的
搞过c 的人是容易理解的.

return , 你敲了return 键
?\C-p    ,你敲了C-p 键
?B ?o ...  , 你敲了BookmarkBegin 字符键
?\C-n ?\C-a, 你敲了C-n C-a键

Emacs 中的键盘宏功能有两种模式:macros 和kmacros。
前者以符号形式返回宏,后者提供 lambda 形式。
前者调用方式为: M-x name-last-kbd-macro,你会得到一个符号形式,
后者调用方式为: kmacro-name-last-macro,你会得到一个 lambda 形式。