如何在Emacs中轻松复制一行10次?我找不到复制线快捷方式或功能。我可以使用C-aC-spcC-eM-w来费力地复制该行,但是如何将其粘贴多次?
在我去写自己的功能之前的任何想法。
答案 0 :(得分:18)
您可以使用键盘宏: -
C-a C-k C-x(C-y C-j C-x)C-u 9 C-x e
<强>解释: - 强>
答案 1 :(得分:11)
<强>复制强>:
如果您经常使用线条,则可能需要在未选择任何区域时对线条进行复制(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使用它的参数来表示杀戮戒指的哪个元素“猛拉”(粘贴)。我能想到的唯一解决方案是kronoz所说的:用Cx(Cy Cx)记录一个宏,然后让Cu的参数改为kmacro-end-and-call-macro
(那是Cu 9 Cx e甚至只是C-9 Cx e)或M-9 Cx e)。
另一种方式:
您也可以留在M-x viper-mode
并使用yy10p:)
答案 2 :(得分:9)
您可能知道这一点,但对于许多命令,“C-u 10”前缀将起作用。不幸的是,对于C-y yank命令,“C-u”被重新定义为“返回杀死戒指中的许多物品,然后猛拉该物品”。
我认为您可以使用C-u前缀命令使用copy-to-register和insert-register命令,但显然这也不起作用。
同样C-x z,“重复最后一个命令”似乎对C-u免疫。
另一个想法是使用M-:得到一个Eval提示并键入一些elisp。我认为像(dotimes '10'yank)这样的东西可能会这样做,但似乎没有。
所以看起来在宏上使用C-u可能确实是最好的,你可以做的不是编写你自己的小函数。
如果我投票,我会投票给kronoz回答。
答案 3 :(得分:7)
在此示例中,您不需要C-x和C-x e。
你可以直接将重复参数赋予C-x)。这将停止录制并一步重复宏。或者你可以跳过C-x并直接进入C-x e,因为C-x e将在重复之前结束录音。
选择哪种方式取决于您喜欢重复计数的工作方式。对于C-x),你说你想要多少次重复(在这种情况下为10)。对于C-x e,你需要说多少重复(即9)。
C-a C-k C-k也将杀死尾随换行符,因此您不必在以后自行回放。它比使用标记更快,并且不需要您更改任何变量。
更好(除非你在终端),你可以使用C-S-Backspace *杀死整行,无论你在哪里。
[*如果您使用的是X窗口,请确保键入shift(不 alt),否则您可以终止会话!]
说到终端,如果您发现无法输入C-9,M-9是一个不错的选择。
在Emacs 22及更高版本中,默认情况下F3启动宏,F4结束/重复宏。您只需按F3开始录制,完成后按F4,然后再次按F4重复播放宏。 (F4也有争议。)
将所有内容放在一起,获得当前行的10个副本:
不像10 p那么短,但非常接近。 :)
答案 4 :(得分:3)
这是我从Emacs的OS / 2端口获取的一个函数。 (是的,我一直在使用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)
然后我会用C-u 10 F9 d复制一行10次。
答案 5 :(得分:2)
我知道重复任意命令的唯一方法是使用键盘宏的“重复参数”功能。
C-a C空间向下M-w C-x(C-y C-x)C-9 C-x e
与vim相比,这有点弱。但这只是因为vim在这类事情上的效率非常高。
如果您真的想要进行模态vi类交互,可以使用其中一种vi仿真模式,例如viper-mode。请查看在线emacs手册的“仿真”部分。
答案 6 :(得分:0)
你想杀死这条线:C-a C-k,然后是C-y或?
答案 7 :(得分:0)
我不知道直接的等价物(C-y 10倍是我所知道的最好的),但您可能对Viper感兴趣,这是一个针对emacs的vi仿真包。它是标准emacs发行版的一部分。
答案 8 :(得分:0)
根据Baxissimo的回答,我对此进行了解释:
(defun yank-n-times (arg)
"yank prefix-arg number of times. Not safe in any way."
(interactive "*p")
(dotimes 'arg (yank)))
将其设置为某个键,使用前缀参数调用它,然后关闭。
编辑(也修改了上面的互动调用以减少糟糕)
或者,这是一个可以替代yank-pop的版本:
(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,我会看到它是怎么回事。
答案 9 :(得分:0)
你可以用较少的击键次数拉一行(或一个区域)十次:
C-w C-x ( C-y C-1 C-0 C-x )
或者,使用F3和F4功能键开始和结束键盘宏:
C-w F3 C-y C-1 C-0 F4
答案 10 :(得分:-1)
你得到了C-k的行,你用C-u 10使下一个命令发生了十次,然后你用C-y粘贴这一行。很简单。
如果你总是希望C-k完成整行,你可以将kill-whole-line设置为t。不再烦扰C-a或C-e。
你可以用花哨的杀戮戒指,登记册和宏来做很多事情,我鼓励你去学习它们,但是连续十次划线不一定是强硬或奇怪的。