我想快速修改文档
00
01
10
11
看起来像
000
001
010
011
100
101
110
111
当然我可以做到暴力(如上所示),但我想快速做,因为我发现我做了很多这些。到目前为止,我的方法是猛拉并粘贴4Y 4j 4P
00
01
10
11
00
01
10
11
然后是否有一个命令在每行之前插入0次4次?我知道它有点像4,0,i,0,esc ~~我希望它是4轮0(向左移动),插入模式,插入0,重新命令模式。
由于
答案 0 :(得分:4)
使用visual-block模式:
y3j
<C-v>3j
I0<Esc>
'>
p
<C-v>3j
I1<Esc>
可以从1
填充开始,然后使用P
跳过'>
:
y3j
<C-v>3j
I1<Esc>
P
<C-v>3j
I0<Esc>
仅使用Ex命令:
:,+3y<CR>
:,+3norm! I0<CR>
:put
:<Up> "use commandline history to save some typing
<Backspace>1<CR>
使用替换和普通模式命令的混合:
y3j
:,+3s/^/0<CR>
p
:<Up>
<Backspace>1<CR>
如果你这么做,那么在宏中录制这可能是最好的策略。此时,实际填充的完成方式并不真正相关,因为您唯一的输入是@x
,宏无论如何都可能是瞬时的。
你在录音期间做的事并不重要,这是一个例子:
qx
y3j
:,+3s/^/0<CR>
p
:,+3s/^/1<CR>
q
假设你有这个:
[0]0
01
10
11
点击@x
将上述内容转换为:
000
001
010
011
100
101
110
111
您的宏已保存到注册x
中,并且仍可用于您的下一个Vim会话。
而且我确信有人能想出一个漂亮的衬垫。
修改强> 的
上述宏的逐步说明:
qx
,在注册x
开始录制(可以是任何可用的注册)。
y3j
,猛拉当前行和接下来的三行。
:
,无需解释。
,+3
,这是我们正在研究的范围。定义此范围的更正确方法是.,+3
。范围的起始线和结束线由彗差分开。
起始行是当前行,我们可以省略它以保存一些类型,因此我们留下了昏迷,然后是结束行,相对于当前行+3
表示。
s/^/0<CR>
,这是一个简单的替代。
搜索模式中的^
表示“行的开头”。它与第一个字符不匹配,所以它非常适合像这样的情况,我们希望将某些内容添加到一行。
所以,基本上我们在行前加0
。它可以是你想要的任何东西。
对范围执行替换时,将对范围的每一行执行替换。在这里,我们有四行,因此每行前面都有一个0
。
<CR>
,是......用于执行替换的<Enter>
密钥。
p
,粘贴我们在当前行下方拉出的四条线。
:,+3s/^/1<CR>
,与之前相同,但1
。
q
,结束录制。
而且,为了回答你的评论,以下是你如何解决这个问题:
00
01
10
11
进入那个:
00 0.0
01 0.0
10 0.0
11 0.0
你需要使用另一个“锚”。 ^
是“行的开头”,$
是“行的结尾”,因此替换变为:
:,+3s/$/ 0.0
答案 1 :(得分:2)
我相信你指的是<c-v>(motion)I
。
CTRL-V Start Visual mode blockwise. Note: Under Windows
CTRL-V could be mapped to paste text, it doesn't work
to start Visual mode then, see |CTRL-V-alternative|.
I Insert text before the first non-blank in the line
[count] times.
When the 'H' flag is present in 'cpoptions' and the
line only contains blanks, insert start just before
the last blank.
对于光标在顶部/左侧的示例,这可能会变成这样的
<c-v>3jI0<esc>
答案 2 :(得分:2)
您可以创建宏 q a I 0 Esc j 然后运行 4 @ a 。
但是你想要实现的是格雷码。搜索,也许有一些已编写的脚本(我找不到)。
编辑:如果您可以使用not-only-vim,那么您可以,即执行此操作:
:%!ruby -e 'puts (0..7).map { |i| i.to_s(2).rjust(3, "0") }'
将使用生成的数字替换所有文档。您还可以更改长度和范围。
答案 3 :(得分:0)
您也可以使用建议visincr plugin的here来完成此操作。在这种情况下,你会这样做:
:IIB 1 0
。结果:
000
001
010
011
100
101
110
111