Kat*_*iel 8 emacs elisp key-bindings
我刚刚开始学习emacs(哇哦!)而且我一直在.emacs愉快地捣乱.不幸的是,我还不知道Lisp,所以我遇到了基础问题.
在修好肌肉记忆之前,我已经重新设计了几个按键:
(global-set-key (kbd "<f9>") 'recompile)
没关系.但是,如何判断"模拟按几个键"键?例如,我不知道,<f1>做同样的事情C-u 2 C-x }(用两个字符加宽缓冲区).
一种方法是查找C-x }调用shrink-window-horizontally,并做一些lambda事情.这当然是整洁而优雅的方式(你怎么做?).但肯定有一种方法来定义<f1>发送击键C-u 2 C-x }?
ang*_*gus 18
当然有,这是显而易见的方式:
(global-set-key (kbd "<f1>") (kbd "C-u 2 C-x }"))
我将使用shrink-window-horizontally作为示例函数,但您可以将想法概括为您要定义的任何绑定.
如果要使用两个作为缩小窗口的默认量,而不是一个,请尝试以下操作:
(global-set-key [f9]
  (lambda (&optional n)
    (interactive "P")
    (shrink-window-horizontally (or n 2))))
这将F9键绑定到接受前缀参数的交互式函数.如果你只是按F9,你将不传递任何参数,它会传递默认值2,因为参数n将nil作为参数接收.但是,如果你按,比方说,C-u 10 F9你将通过十作为参数n.这使您可以更灵活地使用绑定.
对于任何长期的事情,我会推荐seh所示的方法,因为在大多数情况下这种方法自然会更加强大.当然,它需要更多的工作和技术诀窍,但这一切都值得:)
安格斯的方法就像是键盘宏功能的简化版本,它为Emacs提供了名称(并且使用的宏比使用宏的宏更简单).你肯定应该知道宏 - 然而 - 它们非常有用,而且对于任何更复杂的东西,动态记录动态比手动写出所有单独的键要快得多.
以下是我自己写的最重要的部分摘要:
;;;; * Keyboard macros
;;   C-x (          or F3  Begin recording.
;;                     F3  Insert counter (if recording has already commenced).
;;   C-u <n> C-x (  or F3  Begin recording with an initial counter value <n>.
;;   C-x )          or F4  End recording.
;;   C-u <n> C-x )  or F4  End recording, then execute the macro <n>-1 times.
;;   C-x e          or F4  Execute the last recorded keyboard macro.
;;       e          or F4  Additional e or F4 presses repeat the macro.
;;   C-u <n> C-x e  or F4  Execute the last recorded keyboard macro <n> times.
;;   C-x C-k r             Apply the last macro to each line of the region.
;;   C-x C-k e             Edit a keyboard macro (RET for most recent).
;;   C-x C-k b             Set a key-binding.
;;
;; If you find yourself using lots of macros, you can even name them
;; for later use, and save them to your init file.
;;   M-x name-last-kbd-macro RET (name) RET
;;   M-x insert-kbd-macro RET (name) RET
;;
;; For more documentation:
;;   C-h k C-x (
;;   M-: (info "(emacs) Keyboard Macros") RET
如果我们使用问题中的示例,您将看到这些事情中的一些如何结合在一起......
首先,您可以使用定义宏 F3C-u2C-x}F4
然后,您可以暂时将其绑定到F1与C-xC-kbF1(实际上,如果F1是目前现有的键盘映射前缀关键,因为交互输入它只会提示输入其余那是不正确的.您可以用代码绕过这个(global-set-key (kbd "<f1>") ...),但我会建议坚持该保留的绑定).
如果然后使用describe-key(C-hk)来检查绑定到该键的内容,Emacs将显示一个(lambda)表达式,如果您愿意,可以将其复制到init文件中.
或者,您可以命名宏并要求Emacs将代码插入当前缓冲区:
M-x name-last-kbd-macro RET (名称) RET
M-x insert-kbd-macro RETRET  
此代码看起来与lambda表达式不同describe-key,但如果您评估插入的宏,您将看到等价.您同样可以显示(kbd "...")表达式也计算为相同的值,因此这些只是执行相同操作的替代方法.
(您可以使用*scratch*缓冲区通过在表达式结束后移动点来评估代码,并键入C-xC-e以显示迷你缓冲区中的值,或者C-j将值插入缓冲区).
请注意,"插入"代码用于fset将宏指定给符号.您可以通过执行(fset),然后将该符号分配给一个键来将宏绑定到一个键(global-set-key),或者您可以忽略它,(fset)并直接分配宏值.当然,这直接等同于安格斯的回答.
编辑:我刚刚注意到有一个kmacro-name-last-macro函数绑定到C-xC-kn几乎相同的形式name-last-kbd-macro,但它生成了使用kmacro-bind-to-key(C-xC-kb)和时看到的lambda表达式describe-key.