4

我想快速修改文档

00
01
10
11

看起来像

000
001
010
011
100
101
110
111

当然,我可以蛮力(如上所示)但我想快速完成,因为我发现我正在做很多这样的事情。到目前为止,我的方法是 yank 和 paste 4Y 4j 4P

00
01
10
11
00
01
10
11

那么是否有一个命令在每行之前插入 0 4 次?我知道它类似于 4, 0, i, 0, esc ~~ 我希望它是 4 轮 0(移动到行的左侧),插入模式,插入 0,reinter 命令模式。

谢谢

4

4 回答 4

4
  • 使用视觉块模式:

    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
于 2013-02-27T08:10:26.337 回答
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>
于 2013-02-27T08:10:04.187 回答
2

您可以创建宏qaI0Escj然后运行它4@a

但是你想要实现的是格雷码。搜索一下,也许有一些已经写好的脚本(我找不到)。

编辑:如果你可以使用 not-only-vim 那么你可以,即这样做:

:%!ruby -e 'puts (0..7).map { |i| i.to_s(2).rjust(3, "0") }'

这将用生成的数字替换所有文档。您还可以更改长度和范围。

于 2013-02-27T08:14:36.223 回答
0

您也可以使用此处建议的visincr 插件来完成此操作。在这种情况下,你会这样做:

  1. 在空行上插入 0。
  2. 制作一个跨越 8 行的可视块,包括 0。
  3. 运行:IIB 1 0

结果:

000
001
010
011
100
101
110
111
于 2013-02-27T09:39:49.680 回答