簡體   English   中英

Tab Vs Vim中的空間首選項

[英]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 

任何人都可以建議如何做到這一點?


UPDATE

感謝迄今為止對phphobbskaiser.se的 回復 我不是單獨回復每個人,而是在這里更新問題。

Softtabstop已關閉expandtab

我在上面說過,關閉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不同的值來實現額外的粒度控制。 使用單個命令將tabstopsofttabstopshiftwidth設置為相同的值對我來說仍然有用。

expandtab是否使softtabstop冗余?

tabstop=4 softtabstop=0 shiftwidth=4 expandtab

在插入模式下,按Tab鍵可插入4個空格。 按刪除鍵可刪除單個空格 - 因此,如果意外按Tab鍵,則必須退格4次。

tabstop=4 softtabstop=4 shiftwidth=4 expandtab

在插入模式下,按Tab鍵可插入4個空格。 按退格鍵可刪除4個空格。

如果我正在使用expandtab ,我希望刪除鍵刪除與tab鍵插入相同數量的空格。 所以在這種情況下,我覺得能夠同時為tabstopsofttabstopshiftwidth分配相同的值是有用的。

快捷方式仍然有用

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設置的下一個縮進級別,而不管tabstopsofttabstopexpandtab設置如何。 Vim會自動添加/刪除空格或制表符,以便您進入正確的列。

如果您使用這些命令來控制縮進而不是Tab / Backspace ,則不必擔心所有這些選項卡設置適合在一起並始終達到正確的縮進級別。

如果設置了expandtab (因為過多的php指出), softtabstop變得多余。 你可以設置shiftwidthtabstop不同的唯一原因是為了迎合一個奇怪的習慣; 例如,您使用四個空格縮進,但您更喜歡使用tab插入八個空格。

如果未設置expandtab ,那么事情會變得更加模糊。 如果你希望你的代碼與cat和非vim編輯器在vim中看起來相同,那么tabstop應該總是設置為8; 在這種情況下,您可以將softtabstopshiftwidth設置為首選縮進級別。 如果你更喜歡文件中的每個“物理標簽”代表一個縮進級別,你可以將tabstopshiftwidth設置為你喜歡的縮進級別,並將softtabstop保持為零(將它設置為等於tabstop是等效的,除非你改變tabstop它將不同步,而零只是意味着“請忽略這一點”)。

您對softtabstopexpandtab理解是錯誤的 - 因此您建議的stab選項不會非常有用。

expandtab是當你想用空格代替標簽的一切 如果設置expandtab ,則Vim會忽略softtabstop選項,並使用tabstopshiftwidth來計算要插入的空格數。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM