2012-02-15 131 views
33

默認的VIM縮進命令通過shiftwidth空格縮進Vim:使用一個空格縮進(不是shiftwidth的空格)

例如,

>> Indent line by shiftwidth spaces 
<< De-indent line by shiftwidth spaces 

是否有任何縮進一個或n(其中n!= shiftwidth)空間(s)?要做到這一點

的一種方式是選擇垂直塊中的一列與Ctrl+V然後,I垂直插入,然後鍵入一個space<Esc>。但是有更好的方法嗎?

+2

爲什麼要避免更改'sw'?這就是它的前景。 – Daenyth 2012-02-15 04:40:50

+0

在視線選擇中,'{count}>'會按{count} *'shiftwidth''縮進,而在普通模式下,'{count}'用於對縮進的行進行計數。也許這就是你想要的。請注意,對於可視塊選擇也是如此,但間距插入在塊的第一列之前而不是行的開始處。 – Benoit 2012-02-15 06:23:00

回答

29

我不確定是否有更好的方法。但是,也有少數方式,你能做到這一點(我能想到反正)的...

你的視覺阻斷溶液

就像你說的:按Ctl-V選擇您需要的行,按I插入,然後輸入空格數。

搜索

以上,但更靈活一點相似 - 你可以使用帶有「選擇項」 vip命令,或任何範圍真正做到:按vvip或者你有什麼選擇範圍和類型:s/^/{n spaces}其中,{n空格}是要插入的空格的數量。

它稍微冗長些,但對於幾乎任何範圍都很好。哎呀,如果你想做整個文件,你可以做Ctl-A或你有什麼(取決於操作系統)並縮進整個文件(或者只是跳過整個視覺模式的事情,只是做它的命令模式... ...在:1,$s/^/{n spaces}

請注意,您不必包括以s ///因爲你沒有在最後把任何標籤的第三個斜槓。

全球

也許你想只縮進該行匹配一些圖案。說...包含foo的所有行。沒問題:類型:g/foo/s/^/{n spaces}

如果其多線部分具有相似的圖案,Global特別方便。您可以跳入正常模式的土地,然後選擇相應的線和縮進::g/foo/norm Vjj:s/^/{n spaces}Ctl-V{Enter}。最後一點額外的Ctl-V{Enter}稍微複雜一些,但在某些情況下很有用。

使用的製表位和shiftwidth的

是的,如果你做了很多 - 我願意做:set ts=2:set et:set sw=2和使用>><<所有可能的方法...

做一個功能

好的,仍然不夠簡短,無論出於何種原因,您需要做很多事情,您不能忍受sw,etts設置。沒問題,只寫了一個快速的功能,並給它一個localleader映射:

function! AddSpace(num) range 
    let s:counter = 0 
    let s:spaces = '' 
    while s:counter < a:num 
    let s:spaces .= ' ' 
    let s:counter = s:counter + 1 
    endwhile 
    execute a:firstline .','. a:lastline .'s/^/'. s:spaces 
endfunction 

:map <LocalLeader>i :call AddSpace(3)Ctl-V{enter} 

也許只知道不止一種方法更多的工作要做,這是不是隻知道一個更好?畢竟,有時是最好的解決方案取決於問題:)

+0

使用搜索方法時,空行將被插入空行的開頭。有沒有一種乾淨而巧妙的方法來避免這種情況?此外,我發現我需要在視覺上選擇一個塊,然後':',然後''<,'> s/^//'一個空格。謝謝! – ryanjdillon 2013-12-11 17:11:59

+0

+1爲視覺塊解決方案。它非常適合快速修改 – verboze 2014-01-10 23:18:54

11

要改變插入縮進空格字符數,使用shiftwidth選項:

:set shiftwidth = <number> 

看一看這裏瞭解更多details

您也可以將其添加到您的.vimrc文件中。

+1

這節省了我的時間。獎勵! – fruqi 2015-08-18 05:27:40

+1

1up。一些建議的解決方案不工作,因爲他們聲稱沒有設置shiftwidth。 – yantaq 2015-10-02 19:40:32

20

縮進的代碼在vi由三個空間與視覺塊模式塊:

  1. 選擇要縮進的代碼塊。在正常模式下使用Ctrl + V並向下箭頭以選擇文本。當它被選中時,輸入「:」給出選定文本塊的命令。

  2. 下面將出現在命令行::'<,'>

  3. 要設置縮進到3位,類型le 3並按下確認鍵。這是出現的內容::'<,'>le 3

  4. 所選文本立即縮進爲3個空格。

縮進由三個空間與視線模式的六代碼塊:

  1. 打開文件VI。
  2. 將光標放在一些代碼
  3. 在正常模式下,按下列鍵:

    Vjjjj:le 3 
    

解釋你做了什麼:

V手段開始選擇文本。

jjjj箭頭向下4行,突出顯示4行。

:告訴vi您將輸入高亮文本的指令。

le 3表示縮進高亮文本3行。

+0

這很棒,除了...當有空行時,它會插入空格。無論如何要避免這一點? – ryanjdillon 2013-12-11 16:51:46

+0

這是更好的答案。選擇的答案太複雜了,在這個答案中,選項1「您的可視塊解決方案」在大多數系統上不起作用。 – user1271772 2014-12-11 09:29:58

+5

我不同意,因爲解決方案的左邊距(第1/0列)有':le 3'縮進,但我認爲OP希望(進一步)從它所在的位置縮進一段文本。例如,爲了更好地垂直對齊自動縮進的代碼/文本,相比較好的位置,只需幾個空格。 – 2015-01-13 08:49:46

3

地點標記之間的代碼要縮進(「a」和「B」):

<position cursor at top of block> 
m a 
<position cursor at bottom of block> 
m b 

做一個替換命令,使得你的標記之間的每個換行符替換所需的空格數(在該示例中,2位):

:'a,'bs/^/ /g 
0

我不得不由給定數目的空格,amount到DEDENT語言,Vim腳本內部。這工作:

let sw_setting = &shiftwidth 
    set shiftwidth=1 
    exe "normal v" . amount . "<" 
    let &shiftwidth = sw_setting 

一個副作用是,它重置最後的視覺模式選擇。相反,您可能希望編輯exe...行,以便在正常模式下執行「< <」重複的amount次。那就是:而不是normal v3<,如果amount爲3,則使其爲normal <<<<<<

相關問題