Vim'de Tab Vs Space tercihleri


87

Vim, sekme Vs söz konusu olduğunda çok yardımcı oluyor. alan tercihleri. Anladığım kadarıyla, tabstopayar bir sekme karakterinin genişliğini gösteriyor. shiftwidthAyar belirtir kaç sütun için arttırma / azaltma kullanıldığında <<ve >>komutları ise softtabstoptuşuna zaman boşluk miktarı sokulacak ayar etkiler Tabekleme modunda anahtar. Eğer expandtab, sekme tuşu ekler üzerinde softtabstopboşluk karakter sayısı. Kapalıyken expandtab, tuşuna basıldığında, Tabeşleşen mümkün olan en az sayıda sekme + boşluk karakteri eklenir softtabstop. (Yanılıyorsam lütfen beni düzeltin.)

Bu son nokta beni meraklandırıyor: istemeyeceğiniz pratik bir durum var shiftwidth == tabstop && tabstop == softtabstopmı? Ben bir tane düşünemiyorum. Bana kalırsa, bunların 3'ünü de tek bir atamada aynı değere ayarlayabilmem en uygunudur. örneğin arıyor:

:set stab=4

koşmaya eşdeğer olan:

:set tabstop=4 softtabstop=4 shiftwidth=4 

Bunun nasıl yapılabileceğini kimse önerebilir mi?


GÜNCELLEME

Şimdiye kadar gelen yanıtlar için teşekkürler , çok fazla php , hobbs ve kaiser.se . Her birine ayrı ayrı yanıt vermek yerine, soruyu burada güncelliyorum.

Expandtab kapalıyken Softtabstop

Yukarıda, expandtab kapalıyken, Sekme tuşuna basıldığında, eşleşen mümkün olan en az sayıda sekme + boşluk karakteri eklendiğini söylemiştim softtabstop. Bunun yanındayım, ama ne demek istediğimi açıklamam gerektiğini düşünüyorum. Bunu birkaç örnekle yapmaya çalışacağım. Takip etmek için, :set listsekme karakterlerini görebilmek için koşun .

tabstop=4 softtabstop=2 shiftwidth=4 noexpandtab

Ekleme modunda, sekme tuşuna basıldığında 2 boşluk karakteri eklenir. Sekme tuşuna ikinci kez basın ve iki boşluk karakteri daha eklemek yerine (toplam 4 boşluk karakteri için) önceki 2 boşluğu tek bir sekme karakteriyle değiştirir. Tabstop 4'e ayarlanmıştır, bu nedenle tek bir sekme karakteri 4 boşlukla aynı genişliğe sahiptir.

tabstop=4 softtabstop=6 shiftwidth=4 noexpandtab

Ekleme modunda, sekme tuşuna basıldığında 1 sekme karakteri artı 2 boşluk eklenir. Sekme karakterinin genişliği 4'tür, bu nedenle toplam genişlik 6'dır ve bu 3 karakter kullanılarak elde edilir. Sekme tuşuna ikinci kez basmak, iki sekme karakteri ekler ve daha önce eklenen iki boşluğu kaldırır. Toplam genişlik 12'dir ve bu 3 karakter kullanılarak elde edilir.

Bu örneklerin her ikisinde de Vim, softtabstop ile eşleşen mümkün olan minimum sayıda sekme + boşluk karakteri ekler.

Expandtab kapalıyken çalışıyorsam, softtabstop'u tabstop'tan farklı bir değere ayarlayarak elde edilebilecek ekstra granüler kontrolü istediğimi göremiyorum. Hala beni ayarlamak mümkün olabilmesi için yararlı olacağını tabstop, softtabstopve shiftwidthtek bir komutla aynı değere.

Expandtab, softtabs'ı gereksiz kılar mı?

tabstop=4 softtabstop=0 shiftwidth=4 expandtab

Ekleme modunda, sekme tuşuna basıldığında 4 boşluk eklenir. Silme tuşuna basmak tek bir alanı siler - bu nedenle yanlışlıkla sekme tuşuna basarsanız 4 kez geri gitmeniz gerekir.

tabstop=4 softtabstop=4 shiftwidth=4 expandtab

Ekleme modunda, sekme tuşuna basıldığında 4 boşluk eklenir. Geri silme tuşuna basıldığında 4 boşluk silinir.

Açık olarak çalışıyorsam expandtab, silme tuşunun sekme tuşu ekleriyle aynı miktarda beyaz boşluğu kaldırmasını tercih ederim. Yani bu durumda da, ben aynı değer atamak edebilmek için yararlı olacağını hissediyorum tabstop, softtabstopve shiftwidthaynı anda.

Bir kısayol yine de faydalı olabilir

Vim'in bu kadar çok esneklik sağlaması harika ama buna ihtiyaç duyduğumu göremiyorum. Sadece bir sekmenin genişliğini ve 'sert' sekme mi (sekme karakteri kullanarak) yoksa 'yumuşak' sekme mi (boşluklardan oluşan) seçebilmek istiyorum. Sert ve yumuşak sekmeler arasında geçiş yapmak yeterince kolaydır ( :set expandtab!), ancak 3 farklı parametreyle uğraşmak zorunda kalmadan sekmenin genişliğini ayarlamanın daha kolay olmasını diliyorum.

Bu yüzden böyle bir şey için önerdiğim önerim :set stab=4bana hala iyi geliyor.


Görünüşe göre burada iki farklı sorunuz var, belki de sorunuzu ikiye bölmelisiniz.
Greg Hewgill

Haklısın! İkinci soruyu kendi konusuna taşıdım.
nelstrom

1
Bu bir sorudan çok bir RFE gibi görünüyor. Bu nedenle, muhtemelen VIM topluluğuna teklif vermelisiniz : vim.org/community.php - veya basitçe bir yama yazmalısınız. Bunun dışında, VIM'in yeni operasyonları tanımlamanıza izin veren kapsamlı bir makro özelliği vardır, bu nedenle istediğinizi yapan bir makro oluşturmanız çok olasıdır.
kdgregory

@nelstrom Sorunuzla ilgili olarak is there a practical case where you wouldn't want shiftwidth == tabstop && tabstop == softtabstop?, Vim'in kendi kaynak kodunu kullanır set shiftwidth=4 tabstop=8 noexpandtab. Evet, tipik olarak ister shiftwidth == softtabstop, ancak bu, değerin ne olduğundan bağımsızdır tabstop.
jamessan

Yanıtlar:


56

Vim'de bir stabseçenek oluşturmak kolay olmayacaktır, ancak bu komutu / işlevi .vimrc(veya süper organize iseniz bir eklenti dosyasını) ekledim. Kullanın :Stabve sizden bir girinti seviyesi ve kullanıp kullanmamanız istenecektir expandtab. Yeni bir girinti düzeyi vermeden enter tuşuna basarsanız, yalnızca mevcut ayarları yazdırır.

"bunların hepsini .vimrc dosyanıza veya bir eklenti dosyasına koyun
komut! -nargs = * Stab çağrısı Stab ()
işlev! Bıçak ()
  let l: tabstop = 1 * input ('shiftwidth'i ayarla =')

  eğer l: tabstop> 0
    "Genişletme sekmesini de istiyor muyuz?
    let l: expandtab = onayla ('expandtab ayarla?', "& Evet \ n & Hayır \ n & İptal")
    eğer l: expandtab == 3
      "iptal mi?
      dönüş
    endif

    let & l: sts = l: tabstop
    let & l: ts = l: tabstop
    let & l: sw = l: tabstop

    eğer l: expandtab == 1
      setlocal expandtab
    Başka
      setlocal noexpandtab
    endif
  endif

  "seçilen seçenekleri göster
  Deneyin
    echohl ModeMsg
    echon 'set tabstop ='
    echohl Soru
    echon & l: ts
    echohl ModeMsg
    echon 'shiftwidth ='
    echohl Soru
    echon & l: sw
    echohl ModeMsg
    echon 'sts ='
    echohl Soru
    echon & l: sts. ''. (& l: et? '': 'hayır')
    echohl ModeMsg
    echon 'expandtab'
  en sonunda
    echohl Yok
  son deneme
son işlev

3
Senaryo için teşekkürler! İstediğimden daha fazlasını yapıyor - sanırım genişleme sekmesini bunun dışında tutmayı tercih ederim - ancak kendi zevkime göre kolayca özelleştirebilirim. Bana Vimscript'te küçük bir hızlandırılmış kurs sağladınız, bu yüzden çok minnettarım. 100 puanlık ödül sizindir!
nelstrom

9

Bu benim ilk VimScript yazma girişimim, ama işte şu:

function! Stab(value)
    let &shiftwidth  = a:value
    let &softtabstop = a:value
    let &tabstop     = a:value
endfunc

Bunu .vimrc dosyama koyarsam, çalıştırarak çağırabilirim :call Stab(X), burada X istenen sekme genişliğidir. Bu şimdilik yeterli bir çözüm, ancak birisi aramayı kolaylaştırmanın bir yolunu önerebilirse minnettar olurum.

Ayrıca ctrl-Tab ile eşleştirdiğim mevcut ayarları hızlı bir şekilde özetleyen bir işlev oluşturdum:

nmap <C-Tab> :call TabParams()<CR>
function! TabParams()
    echo "tabstop:     ".&tabstop
    echo "shiftwidth:  ".&shiftwidth
    echo "softtabstop: ".&softtabstop
endfunc

Bu cevap için 100 puanlık bir ödül koydum ve şimdi yarımını kendim çözdüm. Kendi cevabımı kabul edip edemeyeceğimden emin değilim ...


+1 evet, ama gerçekten istediğin buysa, yine de iyi bir cevap.
DaveParillo

2
Yerel sürümleri ayarlamak için muhtemelen let & l: shiftwidth, vb. Kullanmak isteyeceksiniz.
SystemParadox

7

Düzenleme modunda , veya ayarlarından bağımsız olarak tarafından ayarlandığı şekilde bir sonraki girinti düzeyini Ctrl-Tgirintilemek ve Ctrl-Dazaltmak için de kullanabilirsiniz . Vim, sizi doğru sütuna getirmek için otomatik olarak boşluklar veya sekmeler ekler / kaldırır.shiftwidthtabstopsofttabstopexpandtab

Girintiyi kontrol etmek için bu komutları kullanırsanız Tab/ yerine Backspacetüm bu sekme ayarlarının birbirine uyması konusunda endişelenmenize gerek kalmaz ve her zaman doğru girinti düzeyine ulaşırsınız.


3

Eğer expandtabayarlanırsa (çok fazla php işaret ettiği için), softtabstopgereksiz hale gelir. shiftwidthFarklı bir tabstopşekilde ayarlamanızın tek nedeni , tuhaf bir alışkanlığı beslemek olabilir; örneğin, dört boşluklu girintiler kullanıyorsunuz ancak tabsekiz boşluk eklemeyi tercih ediyorsunuz .

Eğer expandtabayarlanmazsa sonra işler fuzzier olsun. Kodunuzun catvim'de olduğu gibi hem vim olmayan düzenleyicilerde aynı görünmesini istiyorsanız , o tabstopzaman her zaman 8 olarak ayarlanmalıdır; Bu durumda kuracak softtabstopve shiftwidthhem tercih girinti seviyeye. Bunun yerine dosyasındaki her "fiziksel sekme" bir girinti düzeyini temsil ettiğini tercih ederseniz, kuracak tabstopve shiftwidthtercih girinti düzeyi ve izne softtabstopsıfırda (o kadar eşit ayarını tabstopdeğiştirmek eğer hariç eşdeğerdir tabstopo senkronize edilmemiş alacak sıfır sadece "bunu lütfen dikkate almayın" anlamına gelir).


3
Bunun yanlış olduğunu düşünüyorum çünkü yalnızca softtabstopdoğru değere ayarlandığında, geriye doğru boşluk bırakılmış bir girintiyi sekme gibi silecektir. aklı başında kullanım için bir zorunluluktur.
u0b34a0f6ae

2

Anlayışınız softtabstopve expandtabyanlış - bu nedenle stabönerdiğiniz seçenek pek yararlı olmayacaktır.

expandtabher şey için sekmeler yerine boşluk kullanmak istediğiniz zamanlar içindir . Ayarlarsanız expandtab, daha sonra Vim görmezden softtabstopseçeneği ve kullanımlarını tabstopve shiftwidtheklemek kaç aralıklı olarak işe.

softtabstopyalnızca sekme ve boşlukların bir karışımını kullanmak istediğinizde, ince kontrolle (2 veya 4 boşluk) girintileme yapmanıza ve sekme genişliğini daha yüksek bir değerde (genellikle 8) tutmanıza olanak tanır, böylece metin diğer uygulamalarda görünür . softtabstop=tabstopVim her zaman girintileme için sekmeleri kullanacağından ayar hiçbir şey yapmaz.

Güncelleme: kaizer.se'nin de belirttiği gibi , kullanıyorsanız expandtab, softtabstopVim'in birden çok boşluğu bir sekme gibi geri almasını isteyip istemediğinizi yine de ayarlamanız gerekir .


Bu konuda haklı olmanıza tabstopve ayarlandığında softtabstopçok fazla değişken olmanıza rağmen extpandtab, bence öncelik konusunda yanılıyorsunuz. Sadece deneyin: ts=8 sts=4 etsekmeyi ayarlayın ve basın; imleç beşinci sütunda olacak ve sizin ayarladığınız gibi dört boşluk eklenecektir ts=4 sts=0 et.
hobbs

5
Bunun yanlış olduğunu düşünüyorum çünkü yalnızca softtabstopdoğru değere ayarlandığında, geriye doğru boşluk bırakılmış bir girintiyi sekme gibi silecektir. aklı başında kullanım için bir zorunluluktur.
u0b34a0f6ae

2

Beyaz alan ayarlarınızı o kadar sık ​​değiştiriyorsunuz ki, bunu yönetmek için gerçekten bir işleve mi ihtiyacınız var? Tabstop ile çok uğraşıyorsanız ve ayrıca expandtab'ı ayarlıyorsanız, farklı değerlere sahip dosyaları değiştirirken muhtemelen zamanla karışıklık yaşayacaksınız stab. Bugün kullanıyorum :call stab (4), yarın :call stab (2)ve geçen hafta kullanıyorum :call stab (8). Görünüşe göre yazsanız bile, yakında kullanmayı bırakacaksınız.

Bıçaklamak için her zaman aynı değeri aktarmayı planlıyorsanız, neden sadece genel ayarlarınızı düzenlemiyorsunuz? Vim'de:

:e $MYVIMRC

ve aşağıdakileri ekleyin:

set tabstop=4
set shiftwidth=4  "tabs are 4 spaces wide (default = 8)
set expandtab     "Convert tabs to spaces

.Vimrc bu şekilde kurulur.


1

Kullanışlı bir seçenek, softtabstop=-1onu değerine ayarlayacak olanıdır shiftwidth.
Ayrıca shiftwidth0 olarak da ayarlayabilirsiniz , bu durumda tabstopdeğer kullanılacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.