emacs多键击绑定

时间:2013-06-29 17:11:14

标签: emacs elisp

我对EMACS仍然很陌生,但是当我浏览emacs和elisp手册时,我已经熟悉了。但是现在我坚持这个:

是否有一种以regexp风格绑定输入序列的简单方法?

例如:函数enlarge-window-horizo​​ntally的默认绑定是“Cx {”,是否可以将其重新绑定为类似“Cx({)+”的内容,以便可以通过重复重复调用enlarge-window-horizo​​ntal “{”字符,而不是多次释放Ctrl键?

4 个答案:

答案 0 :(得分:4)

还有另一种存档方式:

第一次要重复上一个命令时,按 Cx z ,之后只需按 z 即可按需要重复执行命令。

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

这里有额外的参考资料是 C-h f的输出

  

8.11重复命令

     

许多简单的命令,例如使用单个键或使用的命令    M-x COMMAND-NAME ,可以通过调用它们来重复   用作重复计数的数字参数(* note Arguments::)。   但是,如果要重复的命令提示输入或使用   另一种方式是数字参数,该方法不起作用。

     

命令 C-x z (`repeat')提供另一种重复方式   Emacs命令多次。此命令重复以前的Emacs   命令,无论那是什么。重复命令使用相同的命令   之前使用过的论据;它不会读取每个新的参数   时间。

     

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

     

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

答案 1 :(得分:1)

“Emacs方式”是使用 C-u 作为前缀键。例如。 C-ù 2 0 C-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)))

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

答案 2 :(得分:1)

您还可以定义自己的可重复命令并将其绑定到C-x {。然后,您可以按照要求使用完全C-x { { { { ...,而不必使用C-x { C-x z z z 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制作可重复的版本。我一直在我的几个图书馆里这样做。

答案 3 :(得分:0)

使用次要模式为emacs编写多次重复命令。我把它命名为smart-repeat-mode

https://github.com/zhsfei/emacs-ext