Vim:用另一个之前的replace线
每天至less有一次我有以下情况:
A: This line should also replace line X ... X: This is line should be replaced
我相信我不会有效地执行这个任务。
我做的事:
- 去A线: AG
- Yank线A: YY
- 转到X: XG
- 粘贴行A: P
- 移到老线: j
- 删除旧行: dd
这还有另一个缺点,就是X行现在在默认的寄存器中,如果我find另外一行应该被replace为A,那么这很麻烦。Yanking和附加寄存器( “ayy , ”aP )的粘贴使得这个简单的任务变得简单效率较低。
我的问题:
- 我错过了一个内置的Vim命令来replace之前被抽出的一行吗?
- 如果没有,我怎样才能绑定我自己的命令离开(或恢复)在默认寄存器中被抽出的行?
我会做什么:
-
aG
-
Y
-
xG
-
Vp
你不必离开正常的模式,但它不会放弃线路。 然而,你可以使用V"0p
,它将总是把第2步中的行抽出。
Vp
:select行,粘贴被抽出的东西
这有另外的缺点,现在行X是在默认的注册,这是讨厌的,如果我find另一行应该被replaceA.
要删除文本而不影响正常的寄存器,可以使用黑洞寄存器"_
:
"_dd
我会使用命令行(Ex)模式并执行以下两个命令
:XmA :Ad
这只是简单地将X线移动到A之下,然后删除A就移动了
例如
:7m3 :3d
- YY
- j(移动到要replace的行),然后
- Vp(大写v,然后p,将replace为被抽出的内容)
-
移到第一行的开头。
-
y , $ – 复制最后没有换行符的行
-
移到目标行的开始处。
-
-
V , p – 只replace一个目标行
-
c , c , Ctrl r , 0 , Esc – 用原来的yankreplace目标行
-
-
移到下一个目标行的开始处。
-
。 – 重复4.2发出的命令。
笔记:
-
4.1是y , $,因为如果您执行y , y或Y,您将复制换行符,而Ctrl r , 0实际上会将换行符添加到目标行的下方。
-
4.2代替V p ,因为从技术上来说最后一个操作是删除,所以不能重复使用。 只会删除一行。
-
如果有人知道如何从EX模式(命令行)发出'用寄存器replace当前行',我想听到你的消息(并知道你在哪里find文档)。 可能有一个可重复的EX命令,它比4.2快,并且没有换行符警告。
你可以在可视模式下使用它。
- 去A线:
A
- select具有可视模式的行: V ESC
- 去X行:
X
G - input行的替代模式: S
- 粘贴你复制的行: shift + insert (或其他任何你映射的剪贴板粘贴)。
这是我会做的
- 移动A行的开始, A G (其中A是明显的行号)
- 将某行向某个寄存器跳过,例如a(不带新行)。 input“ a y $”
- 移动到插入行X G
- 替补线S
- 从寄存器a插入, Ctrl-R a
您可以在正常模式下使用此命令:
:AmX | Xd
m
命令用于m[ove]
,它将行号X后面的行号A移动,如果要复制而不是移动行,请使用co[py]
。 d
命令是d[elete]
。
你可以移动(使用co
复制)一系列的行使用
:start,end m X
build立在build议使用Vp
或VP
粘贴在一行上的答案 – 为了避免改变Yank寄存器的内容,我发现最符合人体工程学的命令是:
VPY
- :ay(其中a是行号,例如:20y)。 这一行(双关语打算)。
- VP
我经常需要一行代替多个地方,每个地方都有不同的值(这意味着我不能做一个正则expression式)。
是要抽出所需的原始线
然后在你想要replace的每一行上, V p zero Y
我发现使用Ex命令更容易。 恩。 将第9行移动到46:
:46|9m.|-1d
这会将光标移动到第46行,将第9行移到当前的下方,然后删除前一行(因为移动的行是当前行)。
或使用标记,使用标记“a”:
:46ma a|9m'a|'ad
我会简单地使用“黑洞”寄存器:
给定:
nnoremap <Cd>“_dd
解决scheme将是:
<Cd> yy