2017-04-07 65 views
1

1)是否有自動縮進/重複在一組行上,而不是整個文件?在所選文本的vim中自動縮進

set shiftwidth=4 
set expandtab 
set tabstop=4 

已在我的.vimrc中定義。

我要的是選擇一堆線,只對他們適用的壓痕。這是因爲該文件很大,我只想清理我的代碼行。通過做:retab,我將不得不強制整個文件進行重新縮進。

例如選擇下面的代碼和縮進自動

def hello(self): 
line1 
line2 

def hello(self) 
    line1 
    line2 

2)是否有可以逆轉標籤任何方式? Eclipse中的Shift-Tab。它返回4個空格。

+0

當你說你已經設置了shifttab = 4,我假設你的意思是'shiftwidth'? Vim沒有任何'shifttab'設置。 – DJMcMayhem

+0

你能澄清,如果你有的例子是一個空間或選項卡? (SO不區分兩者很好) – DJMcMayhem

+0

在第一個空格中,第二個空格有4個空格(1個選項卡)。 – infoclogged

回答

1

我要的是選擇一堆線,只有在他們申請壓痕

您可以將縮進到Visual模式的某些行。爲此請按照下列步驟操作:

  1. 位置的第一行光標縮進

  2. 通過鍵入轉變 + v

  3. 向下移動進入可視化模式,打字Ĵ,直到到達最後一行縮進(或者你可以鍵入線# + G如果您知道要縮進的最後一行的行號)。

  4. 類型>

另一種解決方案是在命令行模式中的正則表達式來做到這一點:

2,5s/\v(.*)/\t\1/g

在這裏,線路範圍中的前兩個數字指定正則表達式(在這種情況下,從第2行到第5行)。

+0

第四步:輸入'='。調用格式化函數 – komar

+1

步驟4或> with或=會失敗。正如你所看到的那樣,>將僅僅前進4(shiftwidth = 4),其中在上面的例子中,只需要3個額外的空間(因爲一個空間已經存在) – infoclogged

+0

@infoclogged我明白了你的觀點,那麼你可以使用正則表達式:'2,5s/\ v \ s(。*)/ \ t \ 1/g' – Sergio

0

要在同一時間回答您的兩個問題,你可以使用><運營商。由於他們是運營商,他們的行爲就像ydc,和所有其他運營商做的,所以你必須與運動提供給他們。例如,將>>縮進電流線(帶有4個空格),>j將縮進當前行和下方線。 >G會將所有內容縮進緩衝區的末尾等。

同樣,<將不管您指定的內容。

在您的具體示例中,我會推薦兩種不同的方法。

  1. 使用正常模式。這一點有賴於你的功能有多大。如果只是兩行,則可以將光標放在行1,並鍵入<j>,。 (當然,如果你的函數有兩行以上,你需要調整)。不幸的是,您需要在重新註冊之前進行unindent,否則您最終會得到5個空格,我認爲您不想要這些空格。

  2. 使用可視化模式。除非您修改您的.vimrc,否則這個方法稍微不方便,因爲在視覺模式下調用><會丟失您的視覺選擇。這就是爲什麼我在我的.vimrc如下:

    "Make it easier to indent a visual selection several times. 
    xnoremap > >gv 
    xnoremap < <gv 
    

    有了這個設置,您可以直觀地選擇你想縮進當前行,然後做<>。海事組織,這是最好的解決方案,我經常使用這種工作流程。

+0

在第一個點中不幸的部分讓我問這個問題。 vim中沒有智能縮進嗎? Eclipse有它,並且智能化,例如即使是4的倍數的邊界,也可以使光標移動3(4的倍數的邊界)。 – infoclogged

0

大多數(如果不是全部的話)Ex命令需要一個範圍,因此您只需在視覺上選擇線條並執行:'<,'>retab即可。

:12,16retab

:.,+9retab

依此類推。

參見:help :retab:help :range

+0

我的問題中,我錯了retab。 Retab在我的代碼行中根本不會工作,因爲我用.vimrc中的expandtab替換了帶空格的選項卡。解決方案會像indent邊界一樣,但我不認爲vim有這個。 (我在eclipse中廣泛使用了這個) – infoclogged