如何用vim中的扩展选项卡替换

时间:2012-06-29 12:27:05

标签: vim

我没有问题,我只是好奇。

这是我.vimrc的一部分。

set tabstop=4
set shiftwidth=4
set expandtab

我想将所有notab替换为<-here is a tab

所以命令应该是:

:%s/notab/^I<-here is a tab/

给我真正的标签,所以为了替换它需要4个空间来调用 :retab

一次调用的结果相同(直接添加4个空格):

:%s/notab/ <-here is a tab/

但是不方便,第一个版本包含文本中的真实标签,需要重新标记,第二个版本取决于定义为一个标签的空间数量。

有没有通用的方法呢?

2 个答案:

答案 0 :(得分:4)

我认为这应该完全符合您的要求:

:%s/notab/\=repeat(" ", &tabstop)/ge

答案 1 :(得分:1)

如果notab放在行的开头(当(col-1)%&amp; tabstop == 0)时,@ sehe的答案很有效,但是使用变量&amp; tabstop这保证只有在山口== 1)。如果你对%s/notab/\t/ge | retab都不好(即你的变种用条形符号加入一行)(也许,因为已经有一些不被重新标记的标签,我没有看到任何其他原因)也没有@谢谢你的回答你必须使用更复杂的代码:

function ToExpTab(pat)
    for lnr in range(1, line('$'))
        let line=''
        let chunks=split(getline(lnr), a:pat, 1)
        if len(chunks)<=1
            continue
        endif
        for chunk in chunks[:-2]
            let line.=chunk
            let line.=repeat(' ', &tabstop-(strdisplaywidth(line))%&tabstop)
        endfor
        let line.=chunks[-1]
        call setline(lnr, line)
    endfor
endfunction
call ToExpTab('notab')