在不使用可视模式的情况下,在给定行范围内的特定列处插入字符

时间:2015-05-19 04:01:23

标签: vim

我有这样的评论栏

###################
# 20a#
# I need this     #
# I all lines
# The endin #
###################

我想这样:

###################
# 20a#            #
# I need this     #
# I all lines     #
# The ending #    # 
###################

我可以在可视模式下执行此操作(启用虚拟编辑,选择列,r#),如此answer中所述。

但是,我正在寻找这样的解决方案,如果存在一个原生的:

:100,200r20,#

(假设的意思是:替换第20列字符,即使超过行尾,对于行100到200,使用#。更一般地,替换多个字符会更好)

感谢。

2 个答案:

答案 0 :(得分:2)

您可以将&ve设置为all以使用:normal!

进行此操作
:let x=&ve
:set ve=all|2,5norm! 19|r#
:let &ve=x

如果你愿意的话,你也可以将它们包装在一个函数中。

关于ve选项::h 've'

P.S。

不完全是您的问题的解决方案,但您可能想要检查一下:

https://github.com/sk1418/blockit

答案 1 :(得分:1)

如果你真的决定这样做,你可以:

:100,200g!/\m^.\{20}/s/$/\=repeat(' ', 20-strdisplaywidth(getline('.')))/
:100,200s/\m^.\{19}\zs./#/

第一个命令的要点是将线条填满所需的长度。第二行的要点是添加#个字符。

您也可以将上述内容变为命令:

function! FillHash(line1, line2)              
    let max_len = max(map(getline(a:line1, a:line2), 'strdisplaywidth(v:val)')) + 1
    for n in range(a:line1, a:line2)
        let line = getline(n)
        call setline(n, line . repeat(' ', max_len - strdisplaywidth(line)) . '#')
    endfor
endfunction
command! -range FillHash call FillHash(expand(<line1>), expand(<line2>))

然后你就这样调用命令:

:100,200FillHash

但是,我建议你改用Par