1

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

这是我的 .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/

但是不方便,第一个版本在文本中包含真正的制表符,需要重新制表符,第二个版本取决于定义为一个制表符的空格数。

有什么通用的方法吗?

4

2 回答 2

4

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

:%s/notab/\=repeat(" ", &tabstop)/ge
于 2012-06-29T13:45:09.590 回答
1

如果将@sehe 的答案notab放在行首(当 (col-1) % &tabstop == 0 时,但使用变量 &tabstop 时,这保证仅在 col==1 时发生)效果很好。如果您%s/notab/\t/ge | retab不满意(即您的变体使用条形符号加入一行)(也许,因为已经有标签不被重新标记,我没有看到任何其他原因)也不用@sehe的回答你必须使用更复杂的代码:

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')
于 2012-06-29T17:20:55.847 回答