2012-06-29 53 views
1

我沒有問題,我只是好奇。如何用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/

但它不是方便,這第一個版本在文本中包含真正的標籤,需要至極TE被retabed和第二版本取決於定義爲一個標籤空間的數量。

有什麼一般的方法可以做到嗎?

+1

你想要做什麼?用製表符替換'notab'或用4個空格替換? – romainl

回答

4

我想這應該做的正是你想要的東西:

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

這隻適用於「notab」碰巧位於(col-1)%&tabstop == 0的位置。 – ZyX

+0

@ZyX不知何故,我從來沒有完全承諾過我的編輯說了這麼多。嗯。這是一個非常繁忙的工作周...再次感謝 – sehe

1

@ sehe的回答運作良好,如果notab被放置在該行的開始(當(COL-1)%&製表位== 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')