在Vim中,您可以按.
重复最新的更改,包括插入文本。
在Emacs中时,C-x
z
仅重复最后一个命令。我知道可以在这里使用宏,但更多的时候我意识到我需要为时已晚重新插入相同的文本。当我只需要再插入一次时,定义一个宏就没有意义了。
问:是否可以在Emacs中重复插入文本?
C-f
,搜索等)的结果吗?如果那有什么意义……
C-space
,移动光标,M-w
进行复制),然后C-y
根据需要粘贴多次。
在Vim中,您可以按.
重复最新的更改,包括插入文本。
在Emacs中时,C-x
z
仅重复最后一个命令。我知道可以在这里使用宏,但更多的时候我意识到我需要为时已晚重新插入相同的文本。当我只需要再插入一次时,定义一个宏就没有意义了。
问:是否可以在Emacs中重复插入文本?
C-f
,搜索等)的结果吗?如果那有什么意义……
C-space
,移动光标,M-w
进行复制),然后C-y
根据需要粘贴多次。
Answers:
这是因为,如果我忘了开始定义的宏
您可以使用kmacro-edit-lossage
(C-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)
edmacro-fix-menu-commands
。它带有一个可选参数,该参数可以忽略鼠标事件。但是我对建议系统的了解还不足以使其正常工作。
我认为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)
我希望这会有所帮助。
repeat
(OP提到的)一样,对于文本插入并不是真正有用。Repeat-insert
就像插入宏一样,在插入文本之前需要考虑一下。但这dabbrev-expand
是一个好主意!