如何在vim中替换为展开的选项卡

如何在vim中替换为展开的选项卡,vim,Vim,我没有问题,我只是好奇 这是我的.vimrc的一部分 set tabstop=4 set shiftwidth=4 set expandtab 我想用替换文本中的所有notab,我认为这应该完全符合您的要求: :%s/notab/\=repeat(" ", &tabstop)/ge 我认为这应该完全符合您的要求: :%s/notab/\=repeat(" ", &tabstop)/ge @如果将notab放在行的开头(当(col-1)%&tabstop==0时,sehe的答

我没有问题,我只是好奇

这是我的.vimrc的一部分

set tabstop=4
set shiftwidth=4
set expandtab

我想用
替换文本中的所有
notab
,我认为这应该完全符合您的要求:

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

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

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

@如果将
notab
放在行的开头(当(col-1)%&tabstop==0时,sehe的答案很有效,但对于变量&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')
函数扩展选项卡(pat)
对于范围内的lnr(1,行(“$”)
让线=“”
让chunks=split(getline(lnr),a:pat,1)

如果len(chunks)@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')
函数扩展选项卡(pat)
对于范围内的lnr(1,行(“$”)
让线=“”
让chunks=split(getline(lnr),a:pat,1)

如果是len(chunk),你想做什么?将
notab
替换为表格或用4个空格替换?您想做什么?用表格替换
notab
,或者用4个空格替换它?只有当“notab”恰好位于(col-1)%&tabstop==0的位置时,这才有效。@ZyX不知何故,我从来没有提交过这么多的编辑。嗯。这是一个非常繁忙的工作周。。。再次感谢您,只有当“notab”恰好位于(col-1)%&tabstop==0的位置时,这部作品才有效。@ZyX不知怎的,我从来没有完全承诺过我的编辑会这么说。嗯。这是一个非常繁忙的工作周。。。再次感谢