在VIM中自动插入插件

时间:2013-02-27 07:28:30

标签: vim

我想快速修改文档

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,重新命令模式。

由于

4 个答案:

答案 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表示。

    < / LI>
  • 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 pluginhere来完成此操作。在这种情况下,你会这样做:

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

    000
    001
    010
    011
    100
    101
    110
    111