Vim拉线范围


83

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

  1. 可以说我想拉一些线。我知道这样做的方式很多,但我想按行号进行。我认为这类似于替代命令的工作方式,例如81,91y。有没有办法做到这一点?

  2. 我对g普通模式下的命令有些困惑。它似乎做很多事情,但我无法真正确定g命令的核心功能。我对它是运动命令还是通过常规模式运行的其他命令“全部捕获”感到困惑。有人可以解释一下还是请给我提供对g命令有很好解释的参考?


1
您知道vim(1)中的命令“:help”吗?
史蒂夫·埃默森,2010年

是的,但是我无法在所有参考文献中找到它。原来,我以为我会从普通模式执行此操作,但是hometoast演示了如何从命令模式执行此操作。对于g命令,我只是发现该帮助并未像我期望的其他命令那样将所有内容捆绑在一起。
jnadro52

3
顺便说一句,我可能希望每个问题发表一篇文章。
丹娜

1
我将来会这样做。我更关心第一个问题,我在输入第一个问题时就想到了另一个问题。
jnadro52

Answers:


139

拉线81-91

:81,91y<enter>

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

81gg11yy 

我唯一的用途 g5gg。转到第五行。 22gg:第22行。正如金宝博所说,它实际上只是其他一些命令的修饰符。

为了完整起见,(http://vim.wikia.com/wiki/Power_of_g)解释了许多g在命令模式下的工作方式。


2
使用大写字母也可以提供多种形式: gg将转到第一行,而G将转到最后一行。同样,5G转到第5行。也可以使用标记代替行号(对宏很有用),例如: :'a,52y
NVRAM 2010年

1
如果您不惧怕Shift键,那就81G11Y更“短”了。
詹斯2012年

1
普通模式方法的缺点是您失去了“位置”。您可以想象mx之前和'x之后,但是命令模式版本变得更加简洁。嗯...我刚写完这个,就看到了@Asta的回答。
埃里克·史密斯

1
@WilliamRoss实际上将这些行放在vim中使用的缓冲区中,而不一定是在系统剪贴板中,您可以使用CTRL + V将其粘贴到记事本中。查看相关问题:如何将文本从vi复制/粘贴到不同的应用程序
hometoast

1
这让我感到很有趣,因为我寻找第一个解决方案的全部原因是避免数行或对我的脑袋做个减法。
保罗·帕克

22

您也可以使用“ t”将当前行复制到当前光标位置。

:81,91t.<enter>

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

我是从http://vimcasts.org上学到的,这是有关VIM的绝佳资源。


这是什么t.意思?
CivFan

2
根据我的理解,t可以认为是t病还是to,.是当前行的地址。
阿斯塔(Asta)'18年

1
@CivFan它是:copy
D. Ben Knoble

11

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

:-10,-7ya a

将文本拉到命名缓冲区a中。

注意:指定A会将您想要的内容追加到缓冲区a的当前内容中。

不要忘记,您也可以使用类似的命令来复制文本块并在其中移动文本块:

:-10,-7co .

表示将文本的四行从当前行的上方10行复制到下方,并且

:-10,-7mo .

表示将文本的四行从当前行上移10行。


8

如果该G命令带有计数值,则转到特定的行号。81G使您进入第81行。

y命令可以与动作结合使用,例如G。因此,可以将所有内容拖到第91行,直到可以使用为止y91G

您将共同获得:

81Gy91G

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


1
我希望我可以不止一次投票。帮我的忙是用它来拉到寄存器(在我的情况下是寄存器+即剪贴板):81G"+y91G
mgarey

1
@mgarey有没有办法使用行范围语法直接拉入寄存器?81,91y并以某种方式针对寄存器?
diplosaurus

1
@diplosaurus可能是,但我不知道。这听起来像是您可以在vi.stackexchange.com上提出的问题,如果尚不存在。我会感兴趣的。我不是Vim专家。
mgarey

2
@mgarey不得不通过Google搜索来发挥创意,但我在这里找到了它:stackoverflow.com/questions/16225366/…:81,91y +
diplosaurus

@diplosaurus:81,91y +不起作用。例如,它适用于其他寄存器:81,91y a,但似乎不喜欢该+寄存器。这肯定对其他人有用吗?
ojunk

4

g本身不会做任何事情。它是几个元命令中的一个,这些元命令包含一堆与排序无关的命令。

z 是另一个这样的命令。


谢谢。我现在知道它只是用于不同的目的。当我尝试学习这些工具时,我尝试将命令与可以抽象的东西相关联,以便记住如何正确使用它。似乎g命令只是要记住才能正确使用的那些东西之一。
jnadro52

2

Vim:help index描述g为:

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

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


1
我熟悉:help,但不熟悉:help(命令)。将来这将非常有用。先生,谢谢。
jnadro52


1

除了将第:91,96y ay91)行至第(96)行插入a(粘贴"ap)之外,还可以通过以下方式将这些替换的行添加到寄存器:

:91,96y A

A寄存器的大写会导致对寄存器的追加操作,a而不是覆盖。寄存器的大写总是这样,例如:let @A=';'将a追加;到register a

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

:-10,+10y b

也就是说,它将y在当前光标位置周围拉动(21)行并将其放入register b

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

:-5,y a

将文本从上面5行拉到当前光标位置到具名buffer中a,然后:

:,+5y a

将当前光标位置之后的5行插入缓冲区a

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

左右移动文本块,如下所示:

:+10,+13m.

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

附录

我先前混淆ya:91,95ya a以与某种方式同义ya{motion}其中运动被供给91,95。这是不正确的,并且ya完全不需要输入“ a” 。为辩护,我help yank没有传达这ya可能是的别名yank


1
:ya是的缩写:yank,所以我不确定我对所有行的感觉如何。但是,好工作凝聚了一些分散的信息
D. Ben Knoble

我也这么想,直到我看着:help yank。没有别名yayank。您说得对,但是,“”a不代表“所有”,从技术上来说,它代表“ a”。我还是喜欢说“全部”,因为这对我来说更有意义。
保罗·帕克

2
:[range]y[ank] [x] Yank [range] lines [into register x]方括号中的y[ank]表示[ank]可选。:y:ya:yan:yank
D的

我的立场是正确的:) a是没有必要的。将编辑答案以反映出来。
保罗·帕克

1
您的附录很好,但是我指的是您的第一行,在这里您使用ex命令:ya而不是普通命令y
D. Ben Knoble

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。键入''会将您移回到上一个位置(不幸的是,您仅会记住上一个位置,而不会记住两个)。

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


0

要将行号从81移到91:

方法1: 81gg11yy

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

接近2:81gg然后shift+v然后91gg然后y

尽我所能,因为这很简单,您只需要知道显而易见的事情,即从哪个行号到哪个行号即可提取

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.