Vim yanking系列线

时间:2010-01-07 19:24:52

标签: vim editor range vi yank

我是一名C#开发人员,他最近刚决定扩展我对可用工具的了解。我决定学习的第一个工具是Vi / Vim。到目前为止,一切进展顺利,但有几个问题似乎无法找到答案:

  1. 让我们说我想要抽出一系列线条。我知道有很多方法可以这样做,但我想通过行号来做。我认为它与替代命令的工作方式类似,如81,91y。有没有办法做到这一点?

  2. 我对普通模式下的g命令感到有些困惑。它似乎做了无数的事情,我无法确定g命令的核心内容。我很困惑它是否是一个动作命令或其他命令的“全部捕获”在正常模式下运行。有人可以解释一下这个问题,还是给我一个能够很好地解释g命令的参考资料?

10 个答案:

答案 0 :(得分:115)

Yank 81-91号线

:81,91y<enter>

如果您的手指不想找到:,键,这也可以使用(转到第81行,猛拉11行)

81gg11yy 

g的唯一用途是5gg。去第5行。 22gg:第22行。正如jimbo所说,它实际上只是其他一些命令的修饰符。

为了完整性,(http://vim.wikia.com/wiki/Power_of_g)解释了很多g在命令模式下的工作原理。

答案 1 :(得分:17)

您还可以使用't'将当前行复制到当前光标位置。

:81,91t.<enter>

这会将81-91行粘贴在光标所在的行下。

我从http://vimcasts.org学到了这一点,这是VIM的优秀资源。

答案 2 :(得分:8)

我也想使用vim的相对行号选项,这意味着我可以输入:

:-10,-7ya a

将文本拉入命名缓冲区a。

N.B。指定A会将您正在处理的内容附加到缓冲区a的当前内容。

不要忘记你也可以使用类似的命令复制文本块并移动文本块:

:-10,-7co .

表示将上面10行的四行文本复制到当前行的下面,然后

:-10,-7mo .

表示将四行文本上移10行到当前行以下。

答案 3 :(得分:7)

G命令会转到某个行号,如果它附有计数值。 81G让你上81行。

y命令可以与移动结合使用,例如G。所以要抓住所有内容直到第91行,你可以使用y91G

你们一起得到:

81Gy91G

转到第81行,然后在前往第91行时猛拉。

答案 4 :(得分:4)

g本身没有做任何事情。它是几个元命令中的一个,它包含许多与sorta无关的命令。

z是另一个这样的命令。

答案 5 :(得分:2)

Vim :help indexg描述为:

|g|             g{char}            extended commands, see |g| below

向下滚动(或:help g)以获取列表。

答案 6 :(得分:2)

最佳解决方案是按v进入“视觉模式”。选择行后,按y键复制它们。然后按p。

粘贴复制的行

答案 7 :(得分:1)

除了:91,96y a将第91行至第96行拖入寄存器y(用a粘贴)中之外,这些拖拽的行还可以是 附加到寄存器:

"ap

:91,96y A 寄存器的大写导致对寄存器A的附加操作,而不是覆盖。寄存器的大写总是这样,例如a附加一个:let @A=';'来注册;

使用加号(+)或减号(-)引用相对于当前光标位置的行:

a

即它将在当前光标位置周围拉动(:-10,+10y b )21行,并将其放入寄存器y中。

缺少输入实际上也代表当前光标位置,这意味着:

b

将文本从上面5行拖动到当前光标位置到命名缓冲区:-5,y a 中,然后:

a

将当前光标位置之后的5行拖入缓冲区:,+5y a

注意:如果缓冲区a中有宏,则该宏只是被前一个yank覆盖,因为yank寄存器和宏寄存器实际上是同一回事。碰巧的是,这就是为什么您可以粘贴宏,对其进行编辑,然后将其重新拉回到其寄存器中的原因。我个人将左手到达的字母用于拉动,而右手到达的字母用于宏。

移动文本块,看起来像这样:

a

这意味着将位于当前光标之前10行的四行移动到当前行下方。

附录

我以前在:+10,+13m. 中混淆了ya,将其与:91,95ya a提供运动的ya{motion}同义。这是不正确的,91,95中的“ a”完全没有必要。为辩护,我的ya并未说明help yankya的可能别名。

答案 8 :(得分:0)

作为长期使用Vi / Vim的用户,我倾向于使用“标记” 代替行号(或“行标记”)。它的工作方式如下:m是'mark'字符;然后使用任何字母标识/命名商标。要返回标记序言,请使用单引号('a命名命名标记。这些标记可用作范围。例子:

File:
    <line 1>
    <line 2>
    <line 3>
    <line 4>
    <line 5>

在命令模式下,将光标移至第2行,键入ma。滚动到第4行,键入mb。 要从标记 a 标记为 b ,请输入:

    :'a,'byank

要从标记 a 中删除以标记 b ,请输入:

    :'a,'bdel

要从标记 a 中搜索以标记 b ,并将“ ine”替换为“ ink”:

    :'a,'bs/ine/ink/g

要复制标记 a 到标记 b 并将其粘贴到当前位置下方(“点”始终引用光标当前所在的行):

    :'a,'bco . 

在标记 a 至标记 b 之间移动代码行,向右移动一个标签(使用相反的V形箭头<,向左移动):

    :'a,'b> 

在命令模式下,您可以通过简单地键入'a返回到标记为a的行来移回标记。键入''会将您移回到上一个位置(不幸的是,它仅记住了上一个位置,而没有记住两个位置)。

您可以提取命名缓冲区,复制,删除行,仅搜索和替换部分代码等,而无需知道行号。

答案 9 :(得分:-1)

从第81行到第91行拉线:

方法1:81gg11yy

  

不错,但是您必须做一点数学才能弄清楚要拖多少行

方法2:81gg然后shift+v然后91gg然后y

  

在我看来是最好的,因为这很简单,您只需要知道明显的事情,即从哪个行号到要提取的行号