Sekme tuşu == Vim'deki süslü ayraçlardan sonra 4 boşluk ve otomatik girinti


1265

Nasıl yaparım vi - Vim sekmeleri (!, Sekmeler için feci boşluk dönüştürme) gibi küme ayracı blokları sonra sekme tuşunu == 4 boşluk ve otomatik girinti kodu yapar kullanmak asla Emacs yapar?

Ayrıca, bir daha asla girmemek için bu ayarları nasıl kaydederim?

Bununla ilgili başka sorular gördüm, ama her zaman istediğimden biraz uzakta görünüyor.


Yanıtlar:


1882

Aşağıdaki yanıtları bir çift işaret edildiği gibi, tercih edilen yöntem artık kullanım smartindent için değil, ancak bunun yerine (sizin şu satırlar .vimrc ):

filetype plugin indent on
" show existing tab with 4 spaces width
set tabstop=4
" when indenting with '>', use 4 spaces width
set shiftwidth=4
" On pressing tab, insert 4 spaces
set expandtab

Senin içinde .vimrc: dosyanın:

set smartindent
set tabstop=4
set shiftwidth=4
set expandtab

Yardım dosyalarının alışması biraz zaman alır, ancak ne kadar çok okursanız Vim o kadar iyi olur:

:help smartindent

Daha da iyisi, taşınabilirlik için bu ayarları kaynağınıza gömebilirsiniz:

:help auto-setting

Mevcut ayarlarınızı görmek için:

:set all

Yorumlarda grinin işaret ettiği gibi , smartindent'in yerini, daha çok C gibi sözdizimine sahip diller için olmasına rağmen, "daha akıllıca çalışır" şeklinde değiştirdi:

:help C-indenting


4
Expandtab setiniz varsa boşluk kullanmalıdır. Ayrıca "uyumlu" mu ayarlıyorsunuz? Bunun, expandtab'ı varsayılan "off" değerine sıfırlama dahil olmak üzere çeşitli yan etkileri vardır
Ken

60
Üzgünüz, ama smartindent'in yerini sadece C-tarzı sözdizimi için uygun olan cindent aldı. Diğer dillerle çalışırken vimrc'nizden birini açmak bir sorun olabilir. Bunun yerine "filetype indent on" kullanın.
graywh

2
Smartindent aynı zamanda sadece C-tarzı sözdizimi içindir ve aslında kullanımdan kaldırılmıştır.
graywh

4
expandtab'ı etkinleştirirsem, aslında metne sekme karakterini girmenin bir yolu var mı?
Daniele Segato

3
@DanieleSegato <ctrl v> <tab> ekleme modunda çalışmalıdır: stackoverflow.com/questions/4781070/…
Ken

236

İlgili, hem sekmeleri hem de boşlukları kullanan bir dosyayı açarsanız,

set expandtab ts=4 sw=4 ai

Tüm sekmeleri tüm dosyadaki boşluklarla

:%retab

10
FYI, sekmenizin boşluklarla değiştirilmesini istemiyorsanız, genişletme satırı satırını kaldırın.
Eno

6
Sekmeler boşluk değil mi? ;-)
Rob Wells

11
@ Rob-Wells: "Boşluk" u "boşluk" olarak değiştirdim. Şimdi mutlu musun? ;-)
netjeff

İlk satırın ne anlama geldiğini açıklayabilir misiniz?
Monica'nın Davası

2
expandtab, sekmelerin boşluklara genişletilip genişletilmeyeceğini belirler. ts = tabstop = Dosyadaki bir <Tab> öğesinin sayıldığı boşluk sayısı. sw = shiftwidth = (otomatik) girintinin her adımı için kullanılacak boşluk sayısı. ai = autoindent = Yeni bir satır başlatırken mevcut satırdan girintiyi kopyala.
mcmacerson

89

Dosya türüne özgü girinti elde etmenin en iyi yolu filetype plugin indent onvimrc'nizde kullanmaktır . Sonra set sw=4 sts=4 et.vim / ftplugin / c.vim gibi şeyleri belirtebilirsiniz , örneğin, tüm dosyalar için bu dosyaları küresel hale getirmek zorunda kalmadan ve diğer C tipi olmayan sözdizimleri de doğru şekilde girintilenir (lisps) .


9
IMHO, doğru olarak işaretlenmiş cevaptan daha iyi. cindent ve smartindent yerine filetype girintisi.
0fnt

62

Çoğu dosyada 4 boşluklu sekmeler, Makefiles'de gerçek 8 genişlikli sekme karakteri ve C / C ++ dahil olmak üzere çeşitli dosyalarda otomatik girinti oluşturmak için bunu ~/.vimrcdosyanıza koyun :

" Only do this part when compiled with support for autocommands.
if has("autocmd")
    " Use filetype detection and file-based automatic indenting.
    filetype plugin indent on

    " Use actual tab chars in Makefiles.
    autocmd FileType make set tabstop=8 shiftwidth=8 softtabstop=0 noexpandtab
endif

" For everything else, use a tab width of 4 space chars.
set tabstop=4       " The width of a TAB is set to 4.
                    " Still it is a \t. It is just that
                    " Vim will interpret it to be having
                    " a width of 4.
set shiftwidth=4    " Indents will have a width of 4.
set softtabstop=4   " Sets the number of columns for a TAB.
set expandtab       " Expand TABs to spaces.

Neden ihtiyacın yok else? Bana öyle geliyor ki, son satırlar her durumda makefile özgü üzerine
yazılıyor

6
Hi @lucidbrot, "autocmd FileType make" deyimi temelde vim'e bir Makefile açtığında kullanacağı bazı ayarları söyler. Oysa altındaki çizgiler varsayılanları ayarlıyor. Başka bir deyişle, "tabstop = 8 ..." ayarları daha sonra dosya açıldığında uygulanır ve başlatma sırasında geçerli olan "tabstop = 4 ..." ayarlarının üzerine yazılır.
Shervin Emami

56

Ubuntu gibi birçok Linux sisteminde, .vimrcdosya varsayılan olarak mevcut değildir, bu yüzden önce onu oluşturmanız önerilir.

Giriş .viminfodizininde bulunan dosyayı kullanmayın . Farklı bir amaç için kullanılır.

1. Adım: Ana dizininize gidin

cd ~

2. Adım: Dosyayı oluşturun

vim .vimrc

3. Adım: Yukarıda belirtilen yapılandırmayı ekleyin

filetype plugin indent on
set tabstop=4
set shiftwidth=4
set expandtab

Adım 3: Shift+ tuşuna basarak dosyayı kaydedin ZZ.


11
Dont kullanmak Shift + ZZdosyayı .swp yaratacaktır. kullanın wq.
shas

6
@shas: "ZZ", ": wq" ile aynı olan ": x" ile eşdeğerdir , ancak yalnızca dosya değiştirildiyse kaydeder ... ( Ctrl-Zbaşka bir hikaye ...)
Gert van den Berg

1
@shas Bu sadece doğru değil. Bir düzenleme oturumu için bir takas dosyası istemiyorsanız, çalıştırmanız gerekir vim -n <file>. Takas dosyası, tasarruf zamanında oluşturulan bir şey değildir; takas dosyaları aniden sonlandırılan düzenleme oturumlarını kurtarmada kullanışlı hale geldiği için bu, amacını neredeyse yenecektir.
Kaz

32

Önerilen yol, dosya türü tabanlı girinti kullanmak ve yalnızca yeterli olmadığında smartindent ve cindent kullanmaktır.

Aşağıdakileri .vimrc'nize ekleyin

set expandtab
set shiftwidth=2
set softtabstop=2
filetype plugin indent on

Umarım farklı bir cevap olarak yardımcı olur.


12

~ / .vimrc düzenleyin

$ vim ~/.vimrc

aşağıdaki satırları ekleyin:

set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab


6

Otomatik girinti, mevcut sözdizimi moduna dayanır. Foo.java'yı düzenliyorsanız, o zaman bir girip {vurmak Enteraşağıdaki satırı girintili biliyorum .

Sekmelere gelince, iki ayar vardır. Vim içinde iki nokta üst üste yazın ve ardından sekmeleri dört boşluk olarak görüntülenecek şekilde ayarlayan "tabstop = 4'ü ayarlayın". İki nokta üst üste tuşuna basın ve sekmeler için boşluk ekleyecek "set expandtab" yazın.

Bu ayarları ana dizininizdeki bir .vimrc (veya Windows'ta _vimrc) içine koyabilirsiniz, böylece yalnızca bir kez yazmanız gerekir.


0

İlk olarak, Tabmanuel girintiler için Vim'deki anahtarı kullanmayın . Vim, girintileme miktarını manuel olarak artırmak veya azaltmak için ekleme modunda bir çift komut içerir. Bu komutlar Ctrl-Tve Ctrl-D. Bu komutlar değerlerini gözeten tabstop, shiftwidthve expandtabve boşluklar ve sekmeler (sekmelerin sayısı alanlarının gerekli sayıda elde edilmiş) doğru bir karışım elde.

İkinci olarak, otomatik girintiyi kullanırsanız, bu manuel girinti tuşlarının çok fazla kullanılmasına gerek yoktur.

Eğer Ctrl-Tyerine Tabrahatsız ediyor sizi, bunu eşleştirmek:

:imap <Tab> ^T

Deindent'i Shift-Tabyapmak için Ctrl-Dtekrar eşleştirebilirsiniz :

:imap <S-Tab> ^D

Burada ^ T ve ^ D, eklenebilecek değişmez kontrol karakterleri Ctrl-VCtrl-T.

Bu eşleme uygulandığında, kullanarak ara belleğe değişmez Sekme yazabilirsiniz Ctrl-VTab. Bunu yaparsanız, açık olsa bile :set expandtab, genişletilmemiş bir sekme karakteri elde ettiğinizi unutmayın.

<Tab>Haritaya benzer bir etki kullanılarak da elde edilir :set smarttab, bu da bir hattın önündeki arka boşluğun akıllı davranmasına neden olur.

In smarttabmodunda iken Tabbir satırın başında değil kullanıldığında, özel bir anlamı vardır. Yani benim yukarıdaki haritalama farklıdır Tabiçin Ctrl-Tbir nedeni, Ctrl-T(ekleme modunda) bir çizgide kullanılan yerde o çizginin girinti artacaktır.

Diğer yararlı eşlemeler şunlar olabilir:

:map <Tab> >
:map <S-Tab> <

Şimdi bazı satırları seçmek gibi şeyler yapabiliriz ve Tabonları girintilemek için vurabiliriz . Veya Tabgirintisini artırmak için bir satıra iki kez vurun (komut modunda).

Doğru girinti yönetim komutlarını kullanırsanız, o zaman her şey üç parametre ile kontrol edilir: shiftwidth, tabstopve expandtab.

shiftwidthParametresi girinti boyutunu kontrol eder; dört boşluk girintisi istiyorsanız, kullanın :set shiftwidth=4veya kısaltma kullanın :set sw=4.

Sadece bu yapılırsa, noexpandtabvarsayılan olarak boşluklar ve sekmeler karışımı kullanılarak girinti oluşturulur . Kullanın :set expandtab. Bu, ara belleğe yazdığınız sekme karakterlerinin boşluklara genişlemesine ve Vim tarafından yönetilen girintinin yalnızca boşluk kullanmasına neden olur.

Açık olduğunda expandtabve girintinizi tüm uygun Vim mekanizmalarıyla yönetirseniz, değeri tabstopönemsiz hale gelir. Sekmelerin dosyada görünmeleri durumunda nasıl görüneceğini kontrol eder. set tabstop=8 expandtabDosyayı kullanarak sabit bir sekmeye sahipseniz ve sonra gizlice girerseniz Ctrl-VTab, her zamanki gibi bir sonraki 8 sütuna dayalı sekme konumuna hizalama oluşturur.


Tüm eşlemelerinizde özyinelemesiz varyantlar kullanılmalıdır. Mapping go <C-t>, değişmez kelimeler yerine sözdizimini kullanabilir. Son olarak, <Tab>normal modda eşleme de haritalanır <C-i>(aynı karakterdir), bu yüzden bunu tavsiye etmiyorum (şık bir vim işlevselliği parçasını kaybedersiniz
D. Ben Knoble

@ D.BenKnoble Bunların hiçbirini önermiyorum; Kendimi Ctrl-T, Ctrl-D ve <> kullanıyorum. Vim'i amaçlandığı gibi kullanıyor. Tab'ı diğer editörlerde kullanan insanlar bundan hoşlanmayabilir, hepsi bu.
Kaz
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.