如何部分替换所选文本块中的文本?


14

为我的问题找到一个好标题并不容易。

我知道要在文本块前面插入:

Ctrl- v 选择行 I 键入文本 ESC

现在,我想这样做,但也可以替换块选择中的一部分。目前我正在做两次手术

Ctrl- v 选择块 x 返回开始

接下来是我上面提到的顺序。

是否可以通过仅选择一次(Ctrl- v)块来组合这两个操作?

这是一个小例子:

我想转换以下块

1  text
2  text
3  text
4  text
5  text

进入

new text 
new text 
new text 
new text 
new text

只做一次“手术”。


1
我不是100%地确定您想要什么,也许一个真实的例子会有所帮助(您所拥有的与您想要的)。您知道gv吗?它会重新选择上一个视觉选择,可能会对您有所帮助。
PhilippFrank

Answers:


21

c选择块而不是输入后,x将删除选择块中的文本并进入插入模式。键入内容并退出插入模式后,每一行都应该有相同的更改。

尝试

Ctrl-- v选择区块c--插入任何内容-Esc


1
    1
   1 1
  1   1
 1111111
 1     1
 1     1
 1     1

像上面的一样,想象一行三个不同的印刷体字母。 ^V选择以上内容后,A由于行数不相等,我无法将所有内容都更改为行中的最后一个字母。以前的正楷工作得很好用 :s/\%V1/T/g “前一块封信是一件T从“1'制造。更改/T/到什么。

但是选择上面显示的最后一个印刷体字母,只会将所有的'1'更改为'A'到A *的位置,其余的保留为1。

*最短的线。

为了使所有线条的长度相同,我用空格填充了它们。(我是vim的新手,所以我确定可以编写更好的脚本。)

注意:A的峰值始于第2行。

let Maxlen = 0
" Find longest line
for i in range(2,8)
    let t = getline(i)
    let a = strlen(t)
    if a > Maxlen
        Maxlen = a
    endif
endfor

" Append spaces 'til all lines are the same length.
for i in range(2,8)
    let t = getline(i)
    let a = strlen(t)
    if a < Maxlen
        let b = Maxlen - a
        execute "normal!" . i . "gg0" . b . "A "
    endif
endfor

之后,:s/\%V1/T/g 按该行最后一个印刷体字母上的说明进行工作。

PS我读到execute上面的行应该没有点,但对我来说不起作用。


执行行,移至印刷体字母的第i行的开头,并在行末添加b空格。“ b”是当前行和最长行之间的长度差。
罗恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.