如何从vi中的光标位置开始插入一个空格块?

时间:2011-09-29 04:02:55

标签: vim vi

假设我有下面的文字,光标停留在当前的第一个A

AAAA
BBB
CC
D

如何在每一行的前面添加空格以使其成为可能,如果可以即时指定空格列数,那就更好了,例如,这里有两个。

  AAAA
  BBB
  CC
  D

我认为有一种方法可以在视觉模式下快速完成,但任何想法?

目前我正在以可视模式复制第一列文本两次,并将整个两列替换为空格,其中涉及> 5次击键,太麻烦了。

约束:

很抱歉,我没有明确说明问题,可能会产生一些混淆。

目标只是较大文件的一部分,因此如果可以指定从第一个A开始的行数和列数,那就太棒了。

修改

感谢@DeepYellow和@Johnsyweb,显然>}>ap都是我不了解的重要提示,在我澄清有关的具体要求之前,它们都是有效的答案。回答我的问题,但无论如何,@ luser droog的回答是唯一可行的答案。谢谢大家!

9 个答案:

答案 0 :(得分:44)

我会使用:%s/^/ /

您还可以指定一系列行:10,15s/^/ /

或相对范围:.,+5s/^/ /

或者为地点:/A/,/D/>使用正则表达式。

为了复制要在SO上粘贴的代码,我通常使用来自终端sed 's/^/ /' filename

的sed

快捷方式

I just learned这是一个新技巧。您进入视觉模式v,选择区域(带有常规移动命令的 ),然后点击:,它会为您提供:

:'<,'>

准备好只键入上述命令的命令部分,标记'<'>将自动设置为视觉选择的范围。

选择并缩进当前段落:

vip>

vip:>

然后输入

编辑:

根据评论中的要求,您还可以使用任何元字符\{n}上的正则表达量词.在行的中间添加空格。

:%s/^.\{14}/& /

这会在每行上从左侧添加14个字符。当然,%可以替换为上述任何选项,用于指定 ex 命令的范围。

答案 1 :(得分:23)

当在第一个A上时,我会进入块视觉模式ctrl-v,选择要修改的行,按I(插入模式为大写i),然后对第一行应用我想要的任何更改。离开视觉模式esc会将第一行的所有更改应用于所有行。

可能不是最有效的击键次数,但在离开视觉模式之前为您提供所需的所有自由。当我必须手动指定正则表达式命令中的行和列范围时,我不喜欢它。

答案 2 :(得分:14)

我使用&gt; }

哪里......

  • >:向右移动
  • }:表示直至段落结尾

希望这有帮助。

答案 3 :(得分:12)

  1. Ctrl + v(以可视模式进入)
  2. 使用箭头键选择行
  3. Shift + i(带您进入插入模式)
  4. 点击空格键或您想要在所选行前面键入的任何内容。
  5. 保存更改(使用:w),现在您将看到所有选定行的更改。

答案 4 :(得分:6)

我会喜欢尼古。另一种解决方案是使用:normal

  1. <S-v>进入VISUAL-LINE模式
  2. 3jjjj/D<CR>选择行
  3. :norm I<Space><Space>,自动插入正确的范围('<,'>
  4. 对于这种特定情况,

    :normal可能有点过分,但有时您可能希望在一系列行上执行一系列复杂的操作。

答案 5 :(得分:4)

您可以在可视模式下选择线条,然后输入>。这假设您已设置选项卡以插入空格,例如:

setl expandtab
setl shiftwidth=4
setl tabstop=4

(在缩进中用你的偏好替换4)

如果这些行形成一个段落,>ap在正常模式下会将整个段落移到当前位置的上方和下方。

答案 6 :(得分:2)

你可以尝试的另一件事是宏。如果您还不知道,请使用q启动宏并选择注册表以保存宏...所以要将宏保存在注册表a中,您可以在正常情况下键入qa模式。

在底部应该有记录的内容。现在就按照你的意愿做你的动作。

所以在这种情况下你想要在每一行的前面有两个空格,所以你的光标已经在第一行的开头,进入插入模式,然后两次点击空格。现在点击escape进入正常模式,然后进入下一行,然后到该行的开头,然后按q。这结束并保存宏

(所以这一切都在一个地方,这是你要做的关键组合的完整列表,当你按下转义键时<esc>是,<space>是你点击的地方空格键:qai<space><space><esc>j0q这会将宏保存在寄存器a

现在要回放宏,你需要@,然后是你保存的寄存器......所以在这个例子中@a。现在第二行也将在它们前面有两个空格。

宏也可以多次运行,所以如果我3@a,宏将会运行3次,你就可以完成了。

我喜欢这样使用宏,因为它对我来说更直观,因为我可以完全按照我的意愿去做,并且只是多次重放。

答案 7 :(得分:1)

假设您要转移一段代码:

  • 设置每个移位命令:set shiftwidth=1使用的空间数,默认值为8。
  • 在适当的位置按Ctrl+v,然后向上k或向下j向下移动光标以选择某个区域。
  • 按下>来移动块,并按下.来重复操作直到期望的位置(如果错过了光标,请按hb返回)。

move block of code

答案 8 :(得分:0)

我正在寻找类似的解决方案,并使用此变体

VG:norm[N]I

N = numbers of spaces to insert. 
V=Crtl-V 
*** Notice ***  put space immediate after I.