Emacs相当于Vim的yy10p?

时间:2008-09-16 13:06:39

标签: emacs editor shortcuts

如何在Emacs中轻松复制一行10次?我找不到复制线快捷方式或功能。我可以使用C-aC-spcC-eM-w来费力地复制该行,但是如何将其粘贴多次?

在我去写自己的功能之前的任何想法。

11 个答案:

答案 0 :(得分:18)

您可以使用键盘宏: -

C-a C-k C-x(C-y C-j C-x)C-u 9 C-x e

<强>解释: -

  • C-a:转到行首
  • C-k:Kill line
  • C-x(:开始录制键盘宏
  • C-y:Yank遇害线
  • C-j:转到下一行
  • C-x):停止录制键盘宏
  • C-u 9:重复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个副本:

  • C-S-Backspace:杀掉这一行
  • F3:启动宏
  • C-y:拉线
  • C-1 C-0 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

  • C-a:转到行首
  • C-space:设置标记
  • down:转到以下行的开头
  • M-w:复制区域
  • C-x(:启动键盘宏
  • C-y:Yank复制行
  • 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)

你可以用较少的击键次数拉一行(或一个区域)十次:

  • 标记一条线(或区域)
  • 将选定的文字抽出10次:

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。

你可以用花哨的杀戮戒指,登记册和宏来做很多事情,我鼓励你去学习它们,但是连续十次划线不一定是强硬或奇怪的。

相关问题