3

我对 EMACS 还是很陌生,但是当我阅读 emacs 和 elisp 手册时会变得熟悉。但现在我坚持这一点:

有没有一种简单的方法来绑定正则表达式样式的输入序列?

例如:功能放大窗口水平的默认绑定是“Cx {”,是否可以将其重新绑定到“Cx({)+”之类的东西,以便可以通过重复“{”重复调用放大窗口水平字符,而不是多次释放 Ctrl 键?

4

4 回答 4

4

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

第一次要重复上一条命令时,请按C-x z,然后您可以按 键多次重复您的命令z

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

更多参考这里是输出C-h f

8.11 重复命令

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

命令C-x z(`repeat') 提供了另一种重复 Emacs 命令多次的方法。这个命令重复前面的 Emacs 命令,不管它是什么。重复一个命令使用之前使用的相同参数;它不会每次都读取新参数。

要多次重复该命令,请键入附加z's:每个 z重复该命令一次。当您键入除 以外的字符z或按下鼠标按钮时,重复结束。

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

于 2013-06-29T20:06:10.320 回答
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制作它的可重复版本。我一直这样做,在我的几个图书馆里。

于 2013-08-11T21:46:42.023 回答
1

“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)))

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

于 2013-06-29T19:19:40.380 回答
0

使用次要模式为 emacs 编写多重复命令。我将其命名为智能重复模式

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

于 2014-02-13T09:01:32.317 回答