重复上一次插入文字


10

在Vim中,您可以按.重复最新的更改,包括插入文本。

在Emacs中时,C-x z仅重复最后一个命令。我知道可以在这里使用宏,但更多的时候我意识到我需要为时已晚重新插入相同的文本。当我只需要再插入一次时,定义一个宏就没有意义了。

问:是否可以在Emacs中重复插入文本?


1
您想重复的“文字”是什么?从技术上讲,最后插入只是最后一个字符,可能不是您想要的。那么,您将如何为您的目的定义“文本插入”?澄清它也可以帮助您找到实现它的方法。
T. Verron 2014年

嗯,好问题-如何定义最后的连续缓冲区修改。也许两个点移动之间的缓冲区修改不是缓冲区修改(C-f,搜索等)的结果吗?如果那有什么意义……
ooi 2014年

用食谱澄清您想要的东西。有很多“插入”(插入文本的方式)。您是否要以交互方式插入?如果是这样,怎么办?
Drew

互动地。但是理想情况下,无论如何或什么都没有关系。这是因为,如果我忘了开始定义的宏。在这种情况下,问题在于何时。也许可以使用一些钩子
ooi

2
您如何在Emacs中定义“最后插入”?由于没有像vi一样的编辑/命令模式切换,我们应该走多远?我通常只选择“最后插入”(C-space,移动光标,M-w进行复制),然后C-y根据需要粘贴多次。
2014年

Answers:


7

dot-mode是“重复输入或命令的次要模式”,它可以满足您的需要。它基本上只是重复您所做的最后一次插入/删除。它与.Vi(m)非常相似。


2
什么没有做什么?
马拉巴巴2014年

1
欢迎来到Emacs.SE。现在,您的答案更接近评论而不是答案。您能否对其进行编辑以解释dot-mode功能以及它如何提供OP试图获得的功能?
Dan

7

这是因为,如果我忘了开始定义的宏

您可以使用kmacro-edit-lossageC-x C-k l):它允许您查看最近的300次击键(包括简单的插入操作),并将其作为宏进行编辑。

为了简单使用,您只需找到要重复的插入的开头,从“宏:”中删除所有文本到该点,然后按C-c C-c。现在,您有了一个宏,可以用来执行相同的操作,就好像您没有忘记首先将其记录下来一样。

可悲的是,如果最后300次击键包括鼠标单击,则此操作将失败。

编辑:下面的代码对其进行更改,以便仅保留上一个鼠标事件之后的键。

(defadvice recent-keys (after tv/recent-keys-no-mouse first ())
  "Return only the keys since the last mouse event"
  (let* ((vec ad-return-value)
         (lst (append vec nil))
         (nmax (length vec))
         (i (- nmax 1)))
    (while
        (and
         (>= i 0)
         (not
          (let ((mod (event-modifiers (elt vec i))))
            (or (memq 'click mod)
                (memq 'double mod)
                (memq 'triple mod)
                (memq 'drag mod)
                (memq 'down mod)))))
      (setq i (- i 1)))
    (setq ad-return-value (vconcat (nthcdr (+ i 1) lst) nil))))

(defun tv/kmacro-edit-lossage-no-mouse ()
  "Same as `kmacro-edit-lossage', but fallback if the keys contain mouse events.

Source: http://emacs.stackexchange.com/a/4071/184"
  (interactive)
  (ad-activate-regexp "tv/recent-keys-no-mouse")
  (call-interactively #'kmacro-edit-lossage)
  (ad-deactivate-regexp "tv/recent-keys-no-mouse"))

;; If you want this function to replace the default one, uncomment this line:
; (global-set-key (kbd "C-x C-k l") 'tv/kmacro-edit-lossage-no-mouse)

我经常使用鼠标滚动,看看如何从宏中删除它们会很酷。
ooi 2014年

哇,如果最后300次鼠标单击没有完全失败,此命令将很有用。也许只是不包含点击次数,而是让用户知道而不是拒绝工作。
保姆2014年

@nanny我添加了一些省略号,以使(imo)更好的回退,而不仅仅是失败并显示错误消息:使用此功能,仅保留上一次鼠标事件后的键。也可以完全删除鼠标事件,但是宏的结果有些不可预测。
T. Verron 2014年

@ooi不知道您是否通过先前的评论自动ping,所以这里也是您的ping。
T. Verron 2014年

谢谢,我在做同样的事情。我认为有可能过滤的args edmacro-fix-menu-commands。它带有一个可选参数,该参数可以忽略鼠标事件。但是我对建议系统的了解还不足以使其正常工作。
保姆2014年

4

我认为dabbrev-expand功能可以解决问题。假设您已经输入了一些单词:emacs,emotion,emoji等。。。下一次您输入以'em'开头的单词时,您可以点击M-/,emacs会建议您插入一个已经插入的单词以“ em”开头。继续点击M-/,emacs将显示“表情符号”,然后显示“情感”,然后显示...

您可能还会看到repeat-complex-command。流行的例子是:您希望query-replace始终使用相同的参数在许多不同的缓冲区中重复该命令,将“ pitt”替换为“ patt”。

您运行一次,转到另一个窗口,然后键入C-x ESC ESC以再次运行它。

最后,我可以建议重复插入吗?这个el文件将使用某种逻辑帮助您进行插入。它更像是“重复最后一次插入,但是对于每次迭代,参数都会改变。

该示例可以在el文件中找到:

;; You can also iterate over lists:
;;   My desk is cluttered
;;   My desk is a real mess
;;   My desk is very hard to see
;;   My desk is buried
;;
;; from m-x insert-patterned
;;    ";;   My desk is %s"
;;    (cluttered "a real mess" "very hard to see" buried)

我希望这会有所帮助。


1
也许您可以扩大一点...
T. Verron 2014年

@ T.Verron Done :)
Nsukami _ 2014年

1
Repeat-complex-command就像repeat(OP提到的)一样,对于文本插入并不是真正有用。Repeat-insert就像插入宏一样,在插入文本之前需要考虑一下。但这dabbrev-expand是一个好主意!
T. Verron 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.