2012-07-22 36 views
5

許多人使用空格而不是製表符。我使用他們兩個。從第一個非空白字符開始的行和空格標籤。沒有問題開始新的文件,並在我不得不修改一個更好地適應使用格式。有時候我仍然需要修復空間問題。按照Search and replace我可以做:%s/spaces_for_tab/tab/g。這很簡單,它可以用於很多情況。無論如何,我只想在行首開始重構空格。如何將前導空格轉換爲製表符?

+2

':設置noet',選擇要轉換的塊,':retab!' – ninjalj 2012-07-22 09:07:09

+0

@ninjalj是的,但選擇塊轉換有時很難。 – 2012-07-22 14:57:28

+0

[如何將空格轉換爲Vim或Linux中的選項卡?](http://stackoverflow.com/questions/9104706/how-can-i-convert-spaces-to-tabs-in-vim-or -linux) – 2012-07-22 20:07:45

回答

2

我寫了一個簡單的func。無論如何,它只能用於4-space選項卡。

fu! Fixspaces() 
     while search('^\t* \{4}') != 0 
       execute ':%s/^\t*\zs \{4}/\t/g' 
     endwhile 
endfu 

如果存在,您可以提出更好的解決方案,我會樂於使用它。 問題是這個func也替換了字符串中的空格。

+0

這是我第一次標記我的答案。無論如何,這是一個很大的任務(防止改變多行字符串中的空格,html預標籤等),我的實現有點幼稚。 – 2012-07-23 06:28:20

+0

這不是一個好的解決方案,而是使用vim的內置命令,而不是''retab'與'noexpandtab'結合使用 – 2016-09-08 19:16:10

+0

@sg如果我理解正確,Martin的抱怨是'retab'不能像預期的那樣工作,'retab! '把空格轉換爲製表符*任何地方*(甚至在字符串內部)。只有前導空白纔會轉換爲製表符更合適。 – 2017-06-14 01:37:53

5

這是更多的正則表達式問題。爲了在線的起始處錨定,使用插入符號,例如,

s/^  /\t/ 

或者使用vim的內建功能它:

:set tabstop=4 "four spaces will make up for one tab 
:set noexpandtab "tell vim to keep tabs instead of inserting spaces 
:retab   "let vim handle your case 

順便說一句,我也更喜歡縮進製表和空格的排列。不幸的是,vim doesn't handle this well(我不知道其他編輯器在做什麼),所以我大多使用:set expandtab(也許參見:set softtabstop)。

+0

你通常需要'retab!'而不是'retab'。 – 2012-07-22 14:47:09

+1

問題是,正如你所寫的,VIM不能很好地處理這個問題(更可能是我錯過了VIM的一些功能,VIM總是讓我感到驚喜),因爲retab替代了所有的空間,不僅是領先的。 – 2012-07-22 14:51:06

-1

我把馬丁的答案,就可以提高一點,如果任何人的興趣:

function Fixspaces() 
    let ts = &tabstop 
    let pos = getpos('.') 

    if &expandtab 
    while search('^ *\t') != 0 
     silent execute ':%s/^ *\zs\t/'.repeat(' ', ts).'/g' 
    endwhile 

    echo 'Changed tabs to spaces' 
    else 
    while search('^\t* \{'.ts.'}') != 0 
     silent execute ':%s/^\t*\zs \{'.ts.'}/\t/g' 
    endwhile 

    echo 'Changed spaces to tabs' 
    endif 

    call setpos('.', pos) 
endfunction 

這個函數根據的expandtabtabstop設置的值適當的事情,還記得光標所在。

相關問題