emacs多击键绑定

emacs多击键绑定,emacs,elisp,Emacs,Elisp,我对EMACS还是很陌生,但是当我阅读EMACS和elisp手册时,我会越来越熟悉。但现在我被困在这个问题上: 有没有一种简单的方法可以用regexp样式绑定输入序列 例如:横向放大窗口函数的默认绑定是“C-x{”,是否可以将其重新绑定到类似“C-x(+)”,以便通过重复“{”字符来重复调用横向放大窗口,而不是多次释放Ctrl键?“Emacs方式”是使用C-u作为前缀键。例如,C-u20C-x{ 话虽如此,你可以按你的要求去做。但是,这需要你分别绑定C-x{和{。前者的定义和今天一样,但后者必须

我对EMACS还是很陌生,但是当我阅读EMACS和elisp手册时,我会越来越熟悉。但现在我被困在这个问题上:

有没有一种简单的方法可以用regexp样式绑定输入序列

例如:横向放大窗口函数的默认绑定是“C-x{”,是否可以将其重新绑定到类似“C-x(+)”,以便通过重复“{”字符来重复调用横向放大窗口,而不是多次释放Ctrl键?

“Emacs方式”是使用C-u作为前缀键。例如,C-u20C-x{

话虽如此,你可以按你的要求去做。但是,这需要你分别绑定C-x{和{。前者的定义和今天一样,但后者必须看起来像:

(defun my-open-brace ()
  (interactive)
  (if (eq last-command 'shrink-window-horizontally)
      (progn
        (setq this-command 'shrink-window-horizontally)
        (call-interactively 'shrink-window-horizontally))
    (call-interactively 'self-insert-command)))

不幸的是,如果您有许多以{结尾的序列,则必须编写一个函数来处理它们。

还有另一种方法可以归档您想要的内容:

第一次要重复上一个命令时,请按C-x z,然后只需按z键即可根据需要重复命令

这种方法的优点是它适用于您使用的每个命令,而不仅仅适用于特定的命令

作为补充参考,这里是C-h f的输出

8.11重复命令 许多简单的命令,例如使用单个键或 M-x命令名,可以通过使用 用作重复计数的数值参数(*注意参数::)。 但是,如果要重复的命令提示输入,或使用 如果以另一种方式使用数值参数,则该方法将不起作用

命令C-xz(`repeat')提供了另一种方法来重复 Emacs命令多次。此命令重复前面的Emacs命令 命令,不管是什么。重复命令使用相同的 以前使用过的参数;它不会每次读取新参数 时间

要多次重复该命令,请键入其他z:each z再次重复该命令。重复在键入时结束 输入z以外的字符,或按鼠标按钮

例如,假设键入C-u 2 0 C-d以删除20 字符。您可以将该命令(包括其参数)重复三次 另外,键入C-x z可删除总共80个字符 z z。第一个C-x z会重复该命令一次,然后每次重复一次 z又重复了一遍


您还可以定义自己的可重复命令并将其绑定到
C-x{
。然后您可以完全按照您的要求使用它:
C-x{{{
…,而不必使用
C-x{C-x z

以下是您要做的:

 (defun your-repeat-command (command)
   "Repeat COMMAND."
   (let ((repeat-message-function  'ignore))
     (setq last-repeatable-command  command)
     (repeat nil)))


 (defun your-shrink-window-horizontally ()
   "Shrink window horizontally.
 You can repeat this by hitting the last key again..."
   (interactive)
   (require 'repeat nil t)
   (my-repeat-command 'shrink-window-horizontally))


 (define-key ctl-x-map "{" 'your-shrink-window-horizontally)

你可以用任何你喜欢的命令来做这件事——使用
my repeat command
来制作一个可重复的版本。我一直在我的几个库中这样做。

使用minor模式为emacs编写一个多重复命令。我将其命名为smart repeat mode