89

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

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

  2. 我对g正常模式下的命令有点困惑。它似乎做了很多事情,我无法真正确定 g 命令的核心是什么。我对它是运动命令还是其他命令通过正常模式运行的一种“全部捕获”感到困惑。有人可以解释一下吗,或者给我指出一个可以很好地解释g命令的参考资料?

4

10 回答 10

146

扬克线 81-91

:81,91y<enter>

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

81gg11yy 

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

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

于 2010-01-07T19:27:00.857 回答
24

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

:81,91t.<enter>

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

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

于 2014-12-16T09:49:17.840 回答
12

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

:-10,-7ya a

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

注意 指定 A 会将您正在拉动的内容附加到缓冲区 a 的当前内容中。

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

:-10,-7co .

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

:-10,-7mo .

表示将当前行上方 10 行的四行文本移动到当前行下方。

于 2014-05-24T16:20:57.350 回答
11

G命令转到某个行号,如果它伴随着一个计数值。81G让你在第 81 行。

y命令可以与动作结合,例如G. 因此,要将所有内容拉到第 91 行,您可以使用y91G.

一起获得:

81Gy91G

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

于 2015-02-04T12:11:58.560 回答
4

g自己不做任何事情。它是包含一堆排序无关命令的几个元命令之一。

z是另一个类似的命令。

于 2010-01-07T19:31:34.373 回答
3

最好的解决方案是按 v 进入“可视模式”。选择行后,按 y 复制它们。然后按 p 粘贴复制的行。

于 2018-06-07T12:33:19.513 回答
2

Vim 的:help index描述g如下:

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

向下滚动(或:help g)查看列表。

于 2010-01-07T19:37:15.800 回答
2

除了将:91,96y a( y) 行 91 到 96 拉入寄存器a( 粘贴"ap) 之外,还可以将拉出的行附加到寄存器中:

:91,96y A

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

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

:-10,+10y b

即它会在当前光标位置周围 yank( y) 21 行并将它们放入 register b

没有输入实际上也表示当前光标位置,这意味着:

:-5,y a

将文本从上面的 5 行拉到当前光标位置到命名的缓冲区a中,并且:

:,+5y a

会将当前光标位置之后的 5 行拉到 buffera中。

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

移动文本块,如下所示:

:+10,+13m.

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

附录

我以前混淆ya了在:91,95ya a某种程度上与ya{motion}提供运动的位置同义91,95。这是不正确的,“a”ya是完全没有必要的。在我的辩护中,我help yank并没有传达.ya的可能别名yank

于 2019-08-11T02:31:16.707 回答
1

作为一个长期使用 Vi/Vim 的用户,我倾向于使用“标记”而不是行号(或“行标记”)。它的工作原理是这样的:m是“标记”字符;然后使用任何字母来识别/命名标记。要返回标记,请在命名标记前加上单引号 ( '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。打字''会让你回到之前的位置(不幸的是只记得之前的位置,而不是两个回来)。

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

于 2019-09-25T23:54:42.153 回答
0

要从第 81 行拉到第 91 行:

方法1:81gg11yy

不错,但是您必须做一些数学运算才能找出要拉出的行数

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

最好的我的意见,因为这是直截了当的,你只需要知道显而易见的事情,即你想从哪个行号到哪个行号

于 2019-10-31T18:00:45.057 回答