1

我想要一些模仿功能,它接受先前的输入并重复它(如repeat),但在完成其他操作时不会被覆盖,因此保持可重复。有人有什么想法吗?

编辑:我打算这样做的方式是设置某种模式,在这种模式下,D按键的作用完全一样repeat(如果已经完成了一些其他输入,请重复此操作),同时d将重复分配给最后一次D按键的最后一件事。

EDIT2:如果我要拉,然后按 Cx z(在我的模式下也绑定到 D),那么它将重复拉。但是,当我向下移动光标并尝试按 D 时,它会重复向下光标。在这种情况下,我希望小 d 执行最后一次重复(即 yank)的行为,而 D 将重复向下光标命令。因此,d存储最后一个重复的命令,而 D 将重复最后一个命令。

4

2 回答 2

1

这对评论来说太长了:

感觉就像您本质上想要一个较短版本的键盘宏?我将尝试简要解释一下,看看它是否接近:

  • C-x (- 开始录制宏。
  • 做任何你想做的事(可能只是一个命令)。例如,拉动某些东西,即M-d
  • C-x )- 完成录制宏。
  • 现在您可以C-x e重播宏(您可以在录制宏后执行其他操作,C-x e将执行您之前录制的操作(即M-d在本例中)。

如果您确定只有一个命令,也许您可​​以创建一个速记版本的 start-macro end-macro 录制,但这些确实是很小的改进。一旦你习惯了宏,你就会在不知不觉中这样做,这样节省的一次击键就无关紧要了。

另外,如果我没有猜到你在追求什么,这可能会让你感兴趣:http ://www.gnu.org/software/emacs/manual/html_node/elisp/Command-History.html

于 2012-12-28T18:00:14.623 回答
1

我最好的尝试。它可以工作,尽管它没有包含所有的错误处理repeat

(defun Navi-repeat () 

  ;; Checks whether the last repeatable command is the same as repeat var.
  ;; If yes, set repeat-navi to that command, and call it.
  ;; If no, check whether the Navi-repeat variable has been set before: 
  ;;        If bound, call it.
  ;;        If not bound, 
  ;;          give it the value of the last-repeatable command, and call it.

  (interactive)          
  (if (eq last-repeatable-command 'repeat)
      (progn (setq repeat-navi repeat-previous-repeated-command)
         (call-interactively repeat-navi)) 
    (if (boundp 'repeat-navi)
    (call-interactively repeat-navi)
      (progn  (setq repeat-navi last-repeatable-command)
          (call-interactively repeat-navi))
      )  
    )
)
于 2012-12-29T10:39:33.190 回答