我是一名C#开发人员,他最近刚决定扩展我对可用工具的了解。我决定学习的第一个工具是Vi / Vim。到目前为止,一切进展顺利,但有几个问题似乎无法找到答案:
让我们说我想要抽出一系列线条。我知道有很多方法可以这样做,但我想通过行号来做。我认为它与替代命令的工作方式类似,如81,91y
。有没有办法做到这一点?
我对普通模式下的g
命令感到有些困惑。它似乎做了无数的事情,我无法确定g命令的核心内容。我很困惑它是否是一个动作命令或其他命令的“全部捕获”在正常模式下运行。有人可以解释一下这个问题,还是给我一个能够很好地解释g
命令的参考资料?
答案 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 index
将g
描述为:
|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 yank
是ya
的可能别名。
答案 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
在我看来是最好的,因为这很简单,您只需要知道明显的事情,即从哪个行号到要提取的行号