假设我有下面的文字,光标停留在当前的第一个A
,
AAAA
BBB
CC
D
如何在每一行的前面添加空格以使其成为可能,如果可以即时指定空格列数,那就更好了,例如,这里有两个。
AAAA
BBB
CC
D
我认为有一种方法可以在视觉模式下快速完成,但任何想法?
目前我正在以可视模式复制第一列文本两次,并将整个两列替换为空格,其中涉及> 5次击键,太麻烦了。
约束:
很抱歉,我没有明确说明问题,可能会产生一些混淆。
目标只是较大文件的一部分,因此如果可以指定从第一个A
开始的行数和列数,那就太棒了。
修改
感谢@DeepYellow和@Johnsyweb,显然>}
和>ap
都是我不了解的重要提示,在我澄清有关的具体要求之前,它们都是有效的答案。回答我的问题,但无论如何,@ luser droog的回答是唯一可行的答案。谢谢大家!
答案 0 :(得分:44)
我会使用:%s/^/ /
您还可以指定一系列行:10,15s/^/ /
或相对范围:.,+5s/^/ /
或者为地点:/A/,/D/>
使用正则表达式。
为了复制要在SO上粘贴的代码,我通常使用来自终端sed 's/^/ /' filename
I just learned这是一个新技巧。您进入视觉模式v
,选择区域(带有常规移动命令的 ),然后点击:
,它会为您提供:
:'<,'>
准备好只键入上述命令的命令部分,标记'<
和'>
将自动设置为视觉选择的范围。
选择并缩进当前段落:
vip>
或
vip:>
然后输入。
编辑:
根据评论中的要求,您还可以使用任何元字符\{n}
上的正则表达量词.
在行的中间添加空格。
:%s/^.\{14}/& /
这会在每行上从左侧添加14个字符。当然,%
可以替换为上述任何选项,用于指定 ex 命令的范围。
答案 1 :(得分:23)
当在第一个A上时,我会进入块视觉模式ctrl-v
,选择要修改的行,按I
(插入模式为大写i
),然后对第一行应用我想要的任何更改。离开视觉模式esc
会将第一行的所有更改应用于所有行。
可能不是最有效的击键次数,但在离开视觉模式之前为您提供所需的所有自由。当我必须手动指定正则表达式命令中的行和列范围时,我不喜欢它。
答案 2 :(得分:14)
答案 3 :(得分:12)
答案 4 :(得分:6)
我会喜欢尼古。另一种解决方案是使用:normal
:
<S-v>
进入VISUAL-LINE模式3j
或jjj
或/D<CR>
选择行:norm I<Space><Space>
,自动插入正确的范围('<,'>
) :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
向下移动光标以选择某个区域。>
来移动块,并按下.
来重复操作直到期望的位置(如果错过了光标,请按h
或b
返回)。 答案 8 :(得分:0)
我正在寻找类似的解决方案,并使用此变体
VG:norm[N]I
N = numbers of spaces to insert.
V=Crtl-V
*** Notice *** put space immediate after I.