Vim girintisi davranışını dosya türüne göre değiştirme


379

Birisi bana Vim'in girinti davranışını dosya türüne göre değiştirmenin en kolay yolunu basit bir şekilde açıklayabilir mi? Örneğin, bir Python dosyasını açarsam 2 boşlukla girintili olmalıdır, ancak bir Powershell betiği açarsam 4 boşluk kullanmalıdır.


9
BTW - Python için PEP8 kuralı, tablanın 4 boşluk ve sekmelerin 4 boşluk olması gerektiğini söylüyor. ref: stackoverflow.com/questions/120926/…
cgseller

Yanıtlar:


304

.vimVim belirli bir dosya türüne her geçişinde yürütülecek dosyaları ekleyebilirsiniz .

Örneğin, ~/.vim/after/ftplugin/html.vim bu içeriğe sahip bir dosyam var:

setlocal shiftwidth=2
setlocal tabstop=2

Bu, vim'in girinti için 2 karakter genişliğinde sekmeler kullanmasına neden olur ( noexpandtabseçenek, yapılandırmamın başka bir yerinde genel olarak ayarlanır).

Bu burada açıklanmıştır: http://vimdoc.sourceforge.net/htmldoc/usr_05.html#05.4 , dosya türü eklentileri bölümüne gidin.


229
Bunu ~/.vim/after/ftplugin/html.vimyerine koymalısınız . Ama diğerleri aşağıda işaret ettiği gibi, sadece autocmd FileType html setlocal shiftwidth=2 tabstop=2sizin eklemek için çok daha hoş .vimrc.
Aristoteles Pagaltzis

10
Hata! Aslında, bu dosyaya sahip olduğum / is /. Cevabı düzeltirim. Yine de aynı fikirde değilim, farklı dosya türlerine yönelik komutları ayrı dosyalara ayırmanın özellikle her dosya türüne veya bazı dosya türlerine yönelik birçok seçeneğiniz varsa her şeyi çok daha kolay hale getirdiğini düşünüyorum.
SpoonMeiser

3
Aslında, ftplugins için after dizinini kullanmanın pek bir nedeni yoktur. Vim, sadece sözdizimi dosyalarında olduğu gibi değil, runtimepath'ınızda bulduğu hepsini yükler.
graywh

36
FYI: javascript dosya türü için js kullanmayın. Bunun yerine javascript kullanın. ( autocmd FileType javascript setlocal shiftwidth=2 tabstop=2)
Kiddo

13
filetype plugin onVimrc'nize de eklemeniz gerekir .
gatoatigrado

191

Seçenekleri ayarlamak için ftplugins veya autocommands kullanın.

ftplugin

İçinde ~/.vim/ftplugin/python.vim:

setlocal shiftwidth=2 softtabstop=2 expandtab

Ve onları açmayı unutmayın ~/.vimrc:

filetype plugin indent on

( :h ftplugindaha fazla bilgi için)

autocommand

İçinde ~/.vimrc:

autocmd FileType python setlocal shiftwidth=2 softtabstop=2 expandtab

Onların kısa versiyonlarıyla uzun komutları veya ayarlardan herhangi birini değiştirebilirsiniz:
autocmd: au
setlocal: setl
shiftwidth: sw
tabstop: ts
softtabstop: sts
expandtab:et

Ayrıca tabstopve arasındaki farkı öğrenmenizi öneririm softtabstop. Birçok insan bilmiyor softtabstop.


1
Teşekkürler! Ayrıca 'ts' ve 'sts' ile ilgili biraz da teşekkürler. Bu farkı ve nasıl kullanılacağını tartışmak için önerebileceğiniz belirli sayfalar var mı?
jvriesem

11
@jvriesem Çok fazla bir şey yok: 'ts' sekme karakterlerinin görüntülenme biçimidir; 'sts', sekme tuşuna basıldığında kaç "boşluk" ekleneceğini; 'sw', girinti seviyesi başına kaç "boşluk" kullanılacağını; 'et' boşluk veya sekme kullanılıp kullanılmayacağıdır; 'sta', satırın başındaki sekmeye basarken 'sw' "boşluklar" eklemenizi sağlar.
graywh

10
Son formdaki kısa cümle yerine tam formların netlik açısından daha iyi olup olmayacağını merak ediyorum.
icedwater

23
swkısaltması softwidth, stskısa içindir softtabstop, etkısa içindir expandtab, setlkısaltmasıdır setlocalve aukısaltmasıdır autocmd. Kısa formlar yerine uzun formları kullanabilirsiniz.
Flimm

13
Ben inanmaktan ziyade swgenişler . shiftwidthsoftwidth
johncip

83

düzenlemek ~/.vimrcve farklı girintiler için farklı dosya türleri ekleyin, örneğin html/rb2 boşluk js/coffeeiçin girinti ve 4 boşluk için girinti istiyorum :

" by default, the indent is 2 spaces. 
set shiftwidth=2
set softtabstop=2
set tabstop=2

" for html/rb files, 2 spaces
autocmd Filetype html setlocal ts=2 sw=2 expandtab
autocmd Filetype ruby setlocal ts=2 sw=2 expandtab

" for js/coffee/jade files, 4 spaces
autocmd Filetype javascript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype coffeescript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype jade setlocal ts=4 sw=4 sts=0 expandtab

bakın: Vet boşluk tercihlerini filetype ile ayarlama


"
Vimrc

@sdkks Ben öyle düşünmüyorum. çift ​​tırnak yorum, tek tırnak 'tüm Linux vim hata veriyor. (7.3+, 8.0 ...)
Siwei Shen 申思维

Evet. Benim yorumum bir single kullandığını söylüyor ", yani başka biriyle kapatma ". Neden olsa yorum emin değilim.
sdkks

tamam seni yanlış anladım Tek teklif anlamına gelir 'ama "sağ olmadan "
bırakmaz

60

~ / .Vimrc dosyanızdaki dosya sonekini temel alan autocmd komutlarını yerleştirin

autocmd BufRead,BufNewFile   *.c,*.h,*.java set noic cin noexpandtab
autocmd BufRead,BufNewFile   *.pl syntax on

Aradığınız komutlar muhtemelen ts = ve sw =


18
Bunun avantajı ne FileType?
Casey Chow

3
Maçı tersine çevirmenin bir yolu var mı?
SystemParadox

7
(.Html dosyası gerçekten HTML değil, şablon bir dil ile bir şablon HTML dosyası) html dosyaları ile çalışmak için dosya türlerini alma sorunları yaşadım. Dosya türleri bunu html olarak tanımıyor gibi görünüyor, ancak bu yöntem geçerli olacak.
Mark Hildreth

3
@digitxp - avantajı, kullanılan uzantınızın tanımlanmış bir "FileType" ile eşleşmemesidir. Örneğin, yüklememde, * .md Modula2 dosya türünü ifade ederken ben işaretleme için kullanıyorum. Ben (a) varsayılan FileType ayarlarını değiştirmek (b) özel bir yapılandırma ile filetype ayarlarını değiştirmek veya (c) hızla (c) ile gitti benim 1 .vimrc dosyasında bu ayarı kullanarak ne istediğimi alabilirsiniz.
pdwalker

Belgeleri hızlı bir şekilde okuduğumun doğru olduğunu varsayarsak, dosya türlerine bu yolla birden çok komut ekleyebileceğinizi ve verilen sırayla yürütüleceklerini garanti etmekte fayda var.
underscore_d

23

Genellikle expandtabset ile çalışırım , ancak bu makyaj malzemeleri için kötüdür. Son zamanlarda ekledim:

:autocmd FileType make set noexpandtab

.vimrc dosyamın sonuna eklenir ve Makefile, makefile ve * .mk dosyalarını makefiles olarak tanır ve sekmeleri genişletmez. Muhtemelen, bunu uzatabilirsiniz.


Daha iyi seçenek etkinleştirmektir: filetype eklentileri. Vim için varsayılan olan şunları içerir: setl noet, bu yüzden vimrc'nizde o aucmd'ye bile ihtiyacınız yoktur.
graywh

TAMAM. Bunun yararlarını açıklayabilir misiniz ve bununla ilgili neler var? Filetype eklentileri neden autocmd 'den daha iyi? Autocmd ne zaman kullanılmalıdır? Kullanılmamış?
Jonathan Leffler

5
Vim ile gelen filetype eklentileri, örneğin makefiles için "setlocal noexpandtab" gibi yararlı şeyler yapar. Vites genişliği gibi kişisel şeyler için autocommands vs ftplugins önemli değil - vim yapılandırmanızı nasıl yapılandıracağınız budur.
graywh

17

Şahsen, bu ayarları .vimrc'de kullanıyorum:

autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab

22
Birçok şirket, bazı şirketler gibi uzun zamandır kurulan sözleşmelere sahiptir. Birincisi olarak NodeJS'yi ele alalım. Sekmeler iki boşluk olmalıdır. Baş ağrısı ve oldukça aptalca ama önemli.
Paul Hazen

3
Sekmeler neden tüm koşullar için aynı olmalıdır? Bir yapılandırma dosyası için 8 boşluk sekmesi iyi çalışır, ancak çok fazla girintili kod için 2'nin yönetimi çok daha kolaydır. Ve sonra sabit kurallar var: node.js'nin 2 boşluk sekmesi olmalı ve python aslında 4 boşluk sekmesinden başka bir şeyle sözdizimsel olarak geçersiz.
felixphew

1
@felixphew Python, tümüyle aynı kaldığı sürece herhangi bir sayıda boşlukla (hatta sekmeyle) mükemmel bir şekilde doğrudur.
James

@DJMcMayhem Haklısın - "kesinlikle öneririm" demeliydim.
felixphew

1
Nello'ya +1. Sekme karakteri, 8 karakterden oluşan katlarda bir sonraki konuma atlamak anlamına gelen köklü bir geleneğe sahiptir. Bunun nedeni, insanların sekmesini "kendi dilimde iyi görünen bir sonraki girinti" için kullanmak istedikleri ve bazı metin editörlerinin "sekme karakteri ekleme" ile "girinti için boşluk ekleme" arasındaki farkı yaratmadığı ve sekmelerinin amaçlanan yolu göstermediği bu karmaşaya sahip olduğumuz için editörlerini değiştirdiler. Kaynak kodu metindir ve standart metin 8 karakterli sekmelerdir.
Florian F

6

Bu çoğumuz tarafından biliniyor olabilir, ama her neyse (ilk kez şaşkınım) : Yapmak :set et( :setgenişletme) dosyada zaten var olan sekmeleri değiştirmez, biri yapmak zorunda :retab. Örneğin:

:set et
:retab

ve dosyadaki sekmeler yeterli boşlukla değiştirilir. Sekmeleri geri almak için yapmanız gerekenler:

:set noet
:retab

4

Bugün, editorconfig'i deneyebilirsiniz , bunun için bir vim eklentisi de var. Bununla, yalnızca vim'deki girinti boyutunu değiştirmekle kalmaz, aynı zamanda diğer birçok editörde tutarlı kodlama stillerini koruyabilirsiniz.

Aşağıda gördüğünüz gibi basit bir editorconfig, python dosyalarının girinti için 4 boşluğu olacak ve pug şablon dosyalarının sadece 2'si olacaktır.

# 4 space indentation for python files
[*.py]
indent_style = space
indent_size = 4

# 2 space indentation for pug templates
[*.pug]
indent_size = 2

3

Girinti eklentisini kullanarak veya ayarları kullanarak Vim'in girintisini iyi yapılandırabilseniz de, bir python dosyasını açtığınızda sizin için ilgili ayarları otomatik olarak ayarlayan Vindect adlı bir python betiği kullanmanızı öneririm . Vindect'i daha da etkili hale getirmek için bu ipucunu kullanın . Çeşitli girinti stilleri (sekme vs boşluk ve boşluk sayısı) ile başkaları tarafından oluşturulan python dosyalarını düzenlemeye başladığımda, inanılmaz derecede sinir bozucuydu. Ancak bu girinti dosyasıyla birlikte Vindect

Ayrıca tavsiye:


2

Kullananlar için autocmd, bunları bir arada gruplandırmak en iyi uygulamadır. Bir gruplama dosya türü algılamasıyla ilgiliyse, bunun gibi bir şeye sahip olabilirsiniz:

augroup filetype_c
    autocmd!
    :autocmd FileType c setlocal tabstop=2 shiftwidth=2 softtabstop=2 expandtab
    :autocmd FileType c nnoremap <buffer> <localleader>c I/*<space><esc><s-a><space>*/<esc>
augroup end

Gruplamalar, .vimrcözellikle bir dosya türünün kendisiyle ilişkilendirilmiş birden çok kuralı olduğunda organize olmanıza yardımcı olur. Yukarıdaki örnekte, .c dosyalarına özgü bir açıklama kısayolu tanımlanmıştır.

İlk çağrıyı autocmd!vim'e adı geçen gruplandırmada daha önce tanımlanmış oto kommandonları silmesini söyler. Bu, .vimrctekrar kaynaklanırsa yinelenen tanımlamayı önleyecektir . Daha :help augroupfazla bilgi için.


1

C dilinde yazdığım bir yardımcı programı kullanıyorum autotab. Bu yük ve Vim parametreleri için değer belirleyen bir dosyanın ilk birkaç bin satırları analiz shiftwidth, tabstopve expandtab.

Bu, örneğin kullanılarak derlenir gcc -O autotab.c -o autotab. Vim ile entegrasyon talimatları üstteki yorum başlığındadır.

Autotab oldukça zekidir, ancak zaman zaman, özellikle de farklı girintileme stilleri kullanılarak tutarsız bir şekilde muhafaza edilmiş olanlarla karıştırılabilir.

Bir dosya, girintileme için sekmeleri veya sekmeler ve boşlukların bir kombinasyonunu açıkça kullanıyorsa, Autotab, yorumlar gibi ardışık satırlarda iç öğelerin hizalanması gibi faktörleri göz önünde bulundurarak hangi sekme boyutunun kullanıldığını anlar.

Çeşitli programlama dilleri için çalışır ve C önişleme direktifleri, C deyim etiketleri gibi girinti artışlarına uymayan "bant dışı" öğeler için bariz boş satırlardan bahsetmez.

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.