[英]Tab Vs Space preferences in Vim
Vim非常適應標簽Vs. 空間偏好。 據我了解, tabstop
設置表示制表符的寬度。 shiftwidth
設置指定在使用<<和>>命令時要遞增/遞減的列數,而softtabstop
設置會影響在插入模式下按Tab鍵時要插入的空白量。 如果啟用了expandtab
,則tab鍵會插入softtabstop
空格字符數。 在關閉expandtab
下,按Tab鍵會插入與softtabstop
匹配的盡可能少的制表符+空格字符。 (如果我錯了,請糾正我。)
最后一點讓我想知道:有沒有一個實際情況你不想要shiftwidth == tabstop && tabstop == softtabstop
? 我想不出一個。 就我而言,如果我可以在一個單獨的任務中將所有這三個設置為相同的值,那將是最方便的。 例如:
:set stab=4
這相當於運行:
:set tabstop=4 softtabstop=4 shiftwidth=4
任何人都可以建議如何做到這一點?
感謝迄今為止對php , hobbs和kaiser.se的 回復 。 我不是單獨回復每個人,而是在這里更新問題。
我在上面說過,關閉expandtab后,按Tab鍵會插入與softtabstop
匹配的最小數量的tab + space字符。 我支持這一點,但我認為我需要解釋我的意思。 我將通過幾個例子嘗試這樣做。 要繼續,請運行:set list
以便您可以看到制表符。
tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab
在插入模式下,按Tab鍵可插入2個空格字符。 再次按Tab鍵,而不是再插入兩個空格字符(總共4個空格字符),它將使用單個制表符替換前兩個空格。 Tabstop設置為4,因此單個制表符的寬度與4個空格的寬度相同。
tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab
在插入模式下,按Tab鍵可插入1個制表符加2個空格。 制表符的寬度為4,因此總寬度為6,這是使用3個字符實現的。 再次按Tab鍵可插入兩個制表符,並刪除先前插入的兩個空格。 總寬度為12,使用3個字符即可實現。
在這兩個示例中,Vim都插入了與softtabstop匹配的最小可能數量的制表符+空格字符。
如果我正在使用expandtab關閉,我看不到自己想要通過將softtabstop設置為與tabstop不同的值來實現額外的粒度控制。 使用單個命令將tabstop
, softtabstop
和shiftwidth
設置為相同的值對我來說仍然有用。
tabstop=4 softtabstop=0 shiftwidth=4 expandtab
在插入模式下,按Tab鍵可插入4個空格。 按刪除鍵可刪除單個空格 - 因此,如果意外按Tab鍵,則必須退格4次。
tabstop=4 softtabstop=4 shiftwidth=4 expandtab
在插入模式下,按Tab鍵可插入4個空格。 按退格鍵可刪除4個空格。
如果我正在使用expandtab
,我希望刪除鍵刪除與tab鍵插入相同數量的空格。 所以在這種情況下,我覺得能夠同時為tabstop
, softtabstop
和shiftwidth
分配相同的值是有用的。
Vim提供了如此大的靈活性,這很棒,但我看不出自己需要它。 我只是想能夠選擇標簽的寬度,以及它是“硬”標簽(使用標簽字符)還是“軟”標簽(由空格組成)。 在硬標簽和軟標簽之間切換很容易( :set expandtab!
),但我希望設置標簽的寬度更簡單,而不必調整3個不同的參數。
所以我提出的建議如下:set stab=4
對我來說仍然聽起來不錯。
在Vim中創建一個stab
選項本身並不容易,但我已經掀起了這個命令/函數,你可以放入.vimrc
(如果你是超級組織的話,還是一個插件文件)。 使用:Stab
,系統將提示您輸入縮進級別以及是否使用expandtab
。 如果按Enter鍵而不給它一個新的縮進級別,它將只打印當前設置。
" put all this in your .vimrc or a plugin file command! -nargs=* Stab call Stab() function! Stab() let l:tabstop = 1 * input('set shiftwidth=') if l:tabstop > 0 " do we want expandtab as well? let l:expandtab = confirm('set expandtab?', "&Yes\n&No\n&Cancel") if l:expandtab == 3 " abort? return endif let &l:sts = l:tabstop let &l:ts = l:tabstop let &l:sw = l:tabstop if l:expandtab == 1 setlocal expandtab else setlocal noexpandtab endif endif " show the selected options try echohl ModeMsg echon 'set tabstop=' echohl Question echon &l:ts echohl ModeMsg echon ' shiftwidth=' echohl Question echon &l:sw echohl ModeMsg echon ' sts=' echohl Question echon &l:sts . ' ' . (&l:et ? ' ' : 'no') echohl ModeMsg echon 'expandtab' finally echohl None endtry endfunction
這是我第一次嘗試編寫VimScript,但是這里是:
function! Stab(value)
let &shiftwidth = a:value
let &softtabstop = a:value
let &tabstop = a:value
endfunc
如果我把它放在我的.vimrc文件中,我可以通過運行來調用它:call Stab(X)
,其中X是所需的標簽寬度。 這對於現在來說是一個充分的解決方案,但是如果有人能提出一種讓我更容易打電話的方式,我將不勝感激。
我還創建了一個快速匯總當前設置的函數,我已將其映射到ctrl-Tab:
nmap <C-Tab> :call TabParams()<CR>
function! TabParams()
echo "tabstop: ".&tabstop
echo "shiftwidth: ".&shiftwidth
echo "softtabstop: ".&softtabstop
endfunc
好吧,我為這個答案提出了100分的賞金,現在我已經自己解決了一半。 不確定我是否可以接受我自己的答案......
您可以在編輯模式下使用Ctrl-T進行縮進,並使用Ctrl-D取決於shiftwidth
設置的下一個縮進級別,而不管tabstop
, softtabstop
或expandtab
設置如何。 Vim會自動添加/刪除空格或制表符,以便您進入正確的列。
如果您使用這些命令來控制縮進而不是Tab / Backspace ,則不必擔心所有這些選項卡設置適合在一起並始終達到正確的縮進級別。
如果設置了expandtab
(因為過多的php指出), softtabstop
變得多余。 你可以設置shiftwidth
與tabstop
不同的唯一原因是為了迎合一個奇怪的習慣; 例如,您使用四個空格縮進,但您更喜歡使用tab插入八個空格。
如果未設置expandtab
,那么事情會變得更加模糊。 如果你希望你的代碼與cat
和非vim編輯器在vim中看起來相同,那么tabstop
應該總是設置為8; 在這種情況下,您可以將softtabstop
和shiftwidth
設置為首選縮進級別。 如果你更喜歡文件中的每個“物理標簽”代表一個縮進級別,你可以將tabstop
和shiftwidth
設置為你喜歡的縮進級別,並將softtabstop
保持為零(將它設置為等於tabstop
是等效的,除非你改變tabstop
它將不同步,而零只是意味着“請忽略這一點”)。
您對softtabstop
和expandtab
理解是錯誤的 - 因此您建議的stab
選項不會非常有用。
expandtab
是當你想用空格代替標簽的一切 。 如果設置expandtab
,則Vim會忽略softtabstop
選項,並使用tabstop
和shiftwidth
來計算要插入的空格數。
softtabstop
僅適用於您希望混合使用制表符和空格的情況,允許您使用精確控制(2或4個空格)縮進,同時將制表符寬度保持在較高值(通常為8),以便文本顯示在另一個中應用。 設置softtabstop=tabstop
無法完成任何事情,因為Vim將始終使用制表符進行縮進。
更新:正如kaizer.se所指出的,如果你使用的是expandtab
,那么你仍然需要設置softtabstop
如果你想讓Vim退格多個空格,就像它們是一個標簽一樣。
您是否經常更改空白區域設置以確實需要一個功能來管理它? 如果你經常搞亂tabstop並設置expandtab,你可能會隨着時間的推移而變得一團糟,因為你更改了傳遞給stab
不同值的文件。 今天我使用:call stab (4)
,明天就是:call stab (2)
,上周是:call stab (8)
。 聽起來即使你寫它,你很快就會停止使用它。
如果您打算始終將相同的值傳遞給stab,為什么不編輯全局設置? 在vim中:
:e $MYVIMRC
並添加以下內容:
set tabstop=4
set shiftwidth=4 "tabs are 4 spaces wide (default = 8)
set expandtab "Convert tabs to spaces
這就是我的.vimrc的設置方式。
一個有用的選項是softtabstop=-1
,它將把它設置為shiftwidth
的值。
您還可以將shiftwidth
設置為0,在這種情況下將使用tabstop
值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.