我是一名C#开发者,最近决定扩展自己的工具知识。我决定学习的第一个工具是Vi/Vim。到目前为止一切都进展顺利,但是有几个问题我找不到答案:
假设我想要拷贝一段行数范围内的内容。虽然有很多方法可以实现,但我想按行号来选取。我认为它应该与替换命令类似,像
81,91y
这样。有没有办法做到这一点?我对普通模式下的
g
命令有些困惑。它似乎能做很多事情,我无法确定g
命令在本质上是运动命令或其他通过普通模式运行的命令的“通用”命令。请问有人能够解释这个或指向一个好的g
命令的参考资料吗?
我是一名C#开发者,最近决定扩展自己的工具知识。我决定学习的第一个工具是Vi/Vim。到目前为止一切都进展顺利,但是有几个问题我找不到答案:
假设我想要拷贝一段行数范围内的内容。虽然有很多方法可以实现,但我想按行号来选取。我认为它应该与替换命令类似,像81,91y
这样。有没有办法做到这一点?
我对普通模式下的g
命令有些困惑。它似乎能做很多事情,我无法确定g
命令在本质上是运动命令或其他通过普通模式运行的命令的“通用”命令。请问有人能够解释这个或指向一个好的g
命令的参考资料吗?
复制第81-91行
:81,91y<enter>
81gg11yy
我的唯一使用 g
的方法是 5gg
。用于跳转到第5行。22gg
: 第22行。正如jimbo所说,它实际上只是其他一些命令的修饰符。
为了完整起见,(http://vim.wikia.com/wiki/Power_of_g)解释了在命令模式下g
的许多工作原理。
81G11Y
甚至更“短”。 - Jensmx
之前和'x
之后,但是命令模式版本变得更加简洁。嗯...我刚写完这个就看到了@Asta的答案。 - Eric Smitht.
是什么意思? - CivFant
可以被视为“直到”或“至”,而.
是当前行的地址。 - Asta:copy
的同义词。 - D. Ben KnobleG
命令在搭配计数值时,可以定位到指定行号。例如81G
会把光标移动到第81行。
y
命令可以和类似G
的动作结合使用。因此,要复制从当前行到第91行的所有内容,可以使用y91G
命令。
两个命令结合起来就是:
81Gy91G
前往第81行,在前往第91行的同时复制。
81G"+y91G
。 - mgarey81,91y
并以某种方式指定寄存器? - diplosaurus:81,91y +
的意思是将第81行到第91行的内容复制到寄存器中。 - diplosaurus:81,91y a
可以正常工作,但如果你想要复制到 +
或 *
寄存器,则需要在前面加上 "
,例如 :81,91y "+
。 - ojunk我也喜欢使用vim的相对行号选项(set rnu),这意味着我只需要输入:
:-10,-7ya a
将文本复制到命名缓冲区a中。
注意:指定A将把您要复制的内容附加到缓冲区a的当前内容中。
不要忘记,您还可以使用类似的命令复制文本块并移动文本块:
:-10,-7co .
意思是将当前行以下的四行文本复制到当前行以上十行。
:-10,-7mo .
意思是将当前行下面的四行文本向上移动10行。
除了使用y
命令将第91到96行复制到寄存器a
中(使用"ap
黏贴),还可以使用以下命令将复制的行追加到寄存器中:
:91,96y A
A
寄存器大写会将内容追加到寄存器 a
中而不是覆盖。寄存器的大小写始终如一,例如,:let @A=';'
会将 ;
追加到寄存器 a
中。:-10,+10y b
例如,它将沿着当前光标位置抓取(y
)21行并将它们放入寄存器b
。
实际上,缺少输入表示当前光标位置,这意味着这样做:
:-5,y a
a
的缓冲区,并进行以下操作::,+5y a
将当前光标位置后的5行文本复制到缓冲区a
中。
注意:如果您在缓冲区a
中有一个宏,它将被前面的复制覆盖,因为复制寄存器和宏寄存器实际上是相同的东西。这也是为什么,巧合的是,您可以粘贴一个宏、编辑它,然后再将其复制回它的寄存器中。我个人使用左手可达的字母来进行复制,右手可达的字母来进行宏操作。
移动文本块的操作如下:
:+10,+13m.
:help yank
。yank
没有别名 ya
。不过你说得对,a
并不代表“全部”,它实际上代表的是“a”。不过我仍然更喜欢说“全部”,因为这对我来说更有意义。 - Paul Parker:[range]y[ank] [x] Yank [range] lines [into register x]
the square brackets in y[ank]
indicate that the [ank]
are optional. :y
, :ya
, and :yan
are implicitly aliases for :yank
- D. Ben Knoble:ya
而不是正常命令y
。 - D. Ben Knobleya
是从ex
遗留下来的。来自ex
手册的描述:( . , . )yank buffer count abbr: ya
。 - Paul Parkerg
本身并没有任何作用。它是几个元命令之一,包含了许多有点不相关的命令。
z
也是一个类似的命令。
Vim的:help index
将g
描述为:
|g| g{char} extended commands, see |g| below
向下滚动(或使用:help g
)查看列表。
:help
,但不熟悉:help (command)
。这在以后会非常有用。非常感谢您,先生。 - jnadro52m
是“标记”字符;然后使用任何字母来标识/命名该标记。要返回到标记,请在命名的标记前加上单引号('a
)。这些标记可以用作范围。例如:File:
<line 1>
<line 2>
<line 3>
<line 4>
<line 5>
在命令模式下,将光标移动到第二行,键入ma
。滚动到第四行,键入mb
。
要从标记a复制至标记b,请键入:
:'a,'byank
要从标记a到标记b删除,请输入:
:'a,'bdel
:'a,'bs/ine/ink/g
要复制标记a到标记b并粘贴到当前位置下方(“点”始终引用光标当前所在的行):
:'a,'bco .
<
来向左移动): :'a,'b>
在命令模式下,您可以通过键入'a
返回标记行a
。键入''
将使您返回到上一个位置(不幸的是,它只能记住上一个位置,而不能回退两个位置)。
您可以复制、删除行、搜索和替换代码的部分等操作,而无需知道行号,并且可以将其保存到命名缓冲区中。
要从第81行到第91行拷贝:
方法1:81gg11yy
还不错,但你需要进行一些计算来确定要拷贝多少行
方法2:81gg
然后 shift+v
然后 91gg
然后 y
在我看来是最好的方法,因为这是直接的,你只需要知道明显的事情,即从哪一行到哪一行你想要拷贝