如何在Emacs中轻松地复制一行10次? 我找不到复制整行的快捷键或函数。 我可以使用C-a C-spc C-e M-w来费力地复制该行,但我如何将其粘贴多次?
有什么想法吗,在我编写自己的函数之前。
您可以使用键盘宏来实现此操作: -
C-a C-k C-x ( C-y C-j C-x ) C-u 9 C-x e
说明:
复制:
如果你经常操作行,你可能希望在没有选择区域时,能够通过执行复制(kill-ring-save
)和剪切(kill-region
) 操作来操作行:
(defadvice kill-ring-save (before slickcopy activate compile)
"When called interactively with no active region, copy a single line instead."
(interactive
(if mark-active (list (region-beginning) (region-end))
(list (line-beginning-position)
(line-beginning-position 2)))))
(defadvice kill-region (before slickcut activate compile)
"When called interactively with no active region, kill a single line instead."
(interactive
(if mark-active (list (region-beginning) (region-end))
(list (line-beginning-position)
(line-beginning-position 2)))))
然后你可以直接复制只带M-w的那一行。
粘贴:
通常情况下,前置参数只是多次执行一个动作,因此您期望C-u 10 C-y起作用,但在这种情况下,C-y使用其参数来确定要“yank”(粘贴)的kill-ring元素。我能想到的唯一解决办法是像kronoz所说的那样:使用C-x(C-y C-x)记录一个宏,然后让C-u的参数传递给kmacro-end-and-call-macro
(即C-u 9 C-x e或甚至只是C-9 C-x e或M-9 C-x e)。
另一种方法:
您还可以保持在M-x viper-mode
中并使用yy10p :)
viper-mode
; т«ЃтЁиТюЅУ«ИтцџviperТ▓АТюЅуџёVimтіЪУЃйсђѓ - Gordon Gustafson这是我从OS/2版本的Emacs中提取的一个函数。(是的,我已经使用Emacs有一段时间了。)
;; Author: Eberhard Mattes <mattes@azu.informatik.uni-stuttgart.de>
(defun emx-dup-line (arg)
"Duplicate current line.
Set mark to the beginning of the new line.
With argument, do this that many times."
(interactive "*p")
(setq last-command 'identity) ; Don't append to kill ring
(let ((s (point)))
(beginning-of-line)
(let ((b (point)))
(forward-line)
(if (not (eq (preceding-char) ?\n)) (insert ?\n))
(copy-region-as-kill b (point))
(while (> arg 0)
(yank)
(setq arg (1- arg)))
(goto-char s))))
我将其绑定到了F9 d:
(global-set-key [f9 ?d] 'emx-dup-line)
首先你需要在你的 .emacs 文件中添加这个按键绑定:
;; yank n times
(global-set-key "\C-y" (lambda (n) (interactive "*p") (dotimes (i n) (clipboard-yank))))
然后你可以这样做:
C-a C-SPC C-n M-w C-u 10 C-y
C-a C-SPC C-n M-w - 选择整行
C-u 10 C-y - 重复执行“clipboard-yank” 10次
基于Baxissimo的回答,我定义了这个:
(defun yank-n-times (arg)
"yank prefix-arg number of times. Not safe in any way."
(interactive "*p")
(dotimes 'arg (yank)))
(defun yank-n-times (&optional arg)
"yank prefix-arg number of times. Call yank-pop if last command was yank."
(interactive "*p")
(if (or (string= last-command "yank")
(string= last-command "yank-pop"))
(yank-pop arg)
(if (> arg 1)
(dotimes 'arg (yank))
(message "Previous arg was not a yank, and called without a prefix."))))
这个消息有点虚假,但是你无论如何都不应该在没有大于1的前缀的情况下调用它。
不确定这是否是一个好主意,但我用这个替换了M-y,我会看看效果如何。
你需要删除这一行:C-a C-k,然后使用C-y或者?。
我不知道有没有直接的等价物(C-y 10次是我所知道的最好的方法),但你可能会对Viper感兴趣,它是一个针对emacs的vi仿真包。它是标准emacs发行版的一部分。
<C-S-backspace>
,它会运行kill-whole-line
命令,相当于 vi 中的dd
。因此,每当您发现自己在执行C-a C-k C-k
时,可以直接使用<C-S-backspace>
。 - Deniz DoganF3
和F4
键来代替C-x (
和C-x )
。请参阅 Emacs 手册以获取更多信息。 - user12345(setq kill-whole-line t)
,这将使得当光标位于行首时,按下C-k会删除整行(包括换行符)。 - Aiden Cullo