फ़ाइल प्रकार से विम इंडेंट व्यवहार को बदलना


379

कोई मुझे सरल शब्दों में समझा सकता है कि फ़ाइल प्रकार के आधार पर विम के इंडेंटेशन व्यवहार को बदलने का सबसे आसान तरीका क्या है? उदाहरण के लिए, यदि मैं एक पायथन फाइल खोलता हूं, तो उसे 2 स्थानों के साथ इंडेंट करना चाहिए, लेकिन अगर मैं एक पॉवर्सशैल स्क्रिप्ट खोलता हूं तो इसे 4 रिक्त स्थान होना चाहिए।


9
BTW - पायथन के लिए PEP8 सम्मेलन का कहना है कि टैबस्टॉप 4 स्थान होना चाहिए और टैब 4 स्थान होना चाहिए। रेफरी: stackoverflow.com/questions/120926/…
cgseller

जवाबों:


304

.vimजब भी विम किसी विशेष फिल्टाइप पर स्विच करता है, तो आप फ़ाइलों को निष्पादित कर सकते हैं ।

उदाहरण के लिए, मेरे पास ~/.vim/after/ftplugin/html.vim इस सामग्री के साथ एक फ़ाइल है :

setlocal shiftwidth=2
setlocal tabstop=2

जो इंडेंटिंग के लिए 2 वर्णों की चौड़ाई के साथ टैब का उपयोग करने के लिए विम का कारण बनता है ( noexpandtabविकल्प मेरे कॉन्फ़िगरेशन में अन्यत्र वैश्विक रूप से सेट है)।

इसका वर्णन यहां किया गया है: http://vimdoc.sourceforge.net/htmldoc/usr_05.html#05.4 , फ़ाइल नाम प्लगइन्स पर अनुभाग तक नीचे स्क्रॉल करें।


229
आपको ~/.vim/after/ftplugin/html.vimइसके बजाय इसे लगाना चाहिए । लेकिन जैसा कि दूसरों ने नीचे बताया है, यह सिर्फ autocmd FileType html setlocal shiftwidth=2 tabstop=2आपके साथ जोड़ने के लिए बहुत अच्छा है .vimrc
अरस्तू पगाल्ट्ज़िस

10
वूप्स, वास्तव में, वह / है / जहां मेरे पास वह फाइल है। मैं जवाब ठीक कर दूंगा। हालांकि मैं असहमत हूं, मुझे लगता है कि अलग-अलग फाइल के लिए अलग-अलग फाइल के लिए कमांड को अलग करना सब कुछ बहुत आसान कर देता है, खासकर यदि आपके पास कई फाइलपेट्स के लिए आवश्यकताएं हैं, या कुछ फाइलपेट के लिए बहुत सारे विकल्प हैं।
स्पूनमाइजर

3
वास्तव में, ftplugins के लिए निर्देशिका का उपयोग करने के लिए बहुत कारण नहीं है। विम उन सभी को लोड करेगा जो आपके रनटाइमपथ में पाता है, न कि सिंटेक्स फ़ाइलों के लिए पहली तरह।
ग्रेव

36
FYI करें: javascript filetype के लिए js का उपयोग न करें। इसके बजाय जावास्क्रिप्ट का उपयोग करें। ( autocmd FileType javascript setlocal shiftwidth=2 tabstop=2)
किदो

13
आपको filetype plugin onअपने vimrc में भी जोड़ना होगा।
गातोतिग्रादो

191

विकल्प सेट करने के लिए ftplugins या autocommands का उपयोग करें।

ftplugin

में ~/.vim/ftplugin/python.vim:

setlocal shiftwidth=2 softtabstop=2 expandtab

और उन्हें चालू करना न भूलें ~/.vimrc:

filetype plugin indent on

( :h ftpluginअधिक जानकारी के लिए)

autocommand

इन ~/.vimrc:

autocmd FileType python setlocal shiftwidth=2 softtabstop=2 expandtab

आप लंबे समय के आदेशों या उनके छोटे संस्करणों के साथ किसी भी सेटिंग को बदल सकते हैं:
autocmd: au
setlocal: setl
shiftwidth: sw
tabstop: ts
softtabstop: sts
expandtab:et

मैं भी tabstopऔर के बीच अंतर सीखने का सुझाव दूंगा softtabstop। बहुत सारे लोगों के बारे में पता नहीं है softtabstop


1
धन्यवाद! 'Ts' और 'sts' के बारे में उस बिट के लिए भी धन्यवाद। क्या कोई विशेष पृष्ठ हैं जो आप सुझाएंगे कि इस अंतर पर चर्चा करें और इसका उपयोग कैसे करें?
jvriesem

11
@jvriesem इसमें बहुत अधिक नहीं है: 'ts' है कि टैब वर्ण कैसे प्रदर्शित होते हैं; टैब कुंजी दबाए जाने पर सम्मिलित करने के लिए 'sts' कितने "रिक्त स्थान" है; "sw’ प्रति इंडेंट स्तर का उपयोग करने के लिए कितने “स्पेस” हैं; 'एट' रिक्त स्थान या टैब का उपयोग करना है या नहीं; 'sta' आपको एक लाइन की शुरुआत में टैब दबाने पर 'sw' "स्पेस" डालने देता है।
ग्रेव

10
मुझे आश्चर्य है कि अगर पूर्ण रूपों का उपयोग करना बेहतर होगा, स्पष्टता के लिए, अंत में कर्ट वाक्य के बजाय।
आइकेडवाटर

23
swके लिए छोटा है softwidth, के stsलिए छोटा है softtabstop, के etलिए छोटा है expandtab, के setlलिए छोटा है setlocal, और के auलिए छोटा है autocmd। आप छोटे रूपों के बजाय लंबे रूपों का उपयोग कर सकते हैं।
फ्लिमल

13
मेरा मानना swहै कि shiftwidthइसके बजाय विस्तार होता है softwidth
जौनीपील

83

अपने संपादित करें ~/.vimrc, और अलग अलग प्रकार के लिए अलग फ़ाइल प्रकार जोड़ें, जैसे मुझे html/rb2 रिक्त स्थान के लिए इंडेंट चाहिए और js/coffee4 स्थानों के लिए फाइल इंडेंट:

" 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

संदर्भ: फिलामेंट द्वारा विम व्हाट्सएप वरीयताओं को सेट करना



@sdkks मुझे ऐसा नहीं लगता। डबल उद्धरण टिप्पणी है, एकल उद्धरण 'मेरे सभी लिनक्स के विम पर त्रुटि देता है। (7.3+, 8.0 ...)
सिएवेई शेन '

हाँ। मेरी टिप्पणी कहती है कि एक एकल का उपयोग करें ", जिसका अर्थ है इसे दूसरे के साथ बंद न करें "। मुझे यकीन नहीं है कि मैंने यह टिप्पणी क्यों की।
sdkks

ठीक है, मैंने आपको गलत समझा। हालांकि मैं एकल उद्धरण का मतलब है, 'लेकिन "बिना दाएं बाएं नहीं " @ @।
Siwei शेन '

60

अपने ~ / .vimrc में फ़ाइल प्रत्यय के आधार पर ऑटोकैम्ड कमांड डालें

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

आप जिन आदेशों की तलाश कर रहे हैं, वे संभवतः ts = और sw = हैं


18
इससे अधिक लाभ क्या है FileType?
केसी चो

3
क्या मैच को पलटने का कोई तरीका है?
सिस्टमपारॉक्स

7
मुझे HTML फ़ाइलों के साथ काम करने में समस्याएँ हो रही हैं (क्योंकि .html फ़ाइल वास्तव में HTML नहीं है, लेकिन टेम्प्लेट भाषा के साथ टेम्पलेट HTML फ़ाइल)। Filetypes इसे html के रूप में नहीं पहचानता है, लेकिन यह तरीका होगा।
मार्क हिल्ड्रेथ

3
@digitxp - फायदा तब होता है जब आपके द्वारा उपयोग किया गया एक्सटेंशन परिभाषित "FileType" से मेल नहीं खाता है। उदाहरण के लिए, मेरी स्थापना में, * .md का मतलब है, मॉडुला 2 का एक फिलामेंट, जबकि मैं इसे मार्कडाउन के लिए उपयोग कर रहा हूं। मैं एक डिफ़ॉल्ट कॉन्फ़िगरेशन फ़ाइल सेटिंग्स (b) को बदल सकता है (कस्टम) या एक कस्टम कॉन्फ़िगरेशन या (c) के साथ फ़ाइल सेटिंग्स को जल्दी से बदल सकता हूं जो मैं अपनी 1 .vimrc फ़ाइल के साथ इस सेटिंग का उपयोग करना चाहता हूं (c)।
pdwalker

यह इंगित करने के लायक होगा कि - डॉक्स के मेरे त्वरित पढ़ने को सही मानते हुए - आप इस तरह प्रति फिल्टाइप (ओं) में कई कमांड जोड़ सकते हैं, और उन्हें दिए गए आदेश में निष्पादित होने की गारंटी है।
अंडरस्कोर_ड

23

मैं आमतौर पर expandtabसेट के साथ काम करता हूं , लेकिन यह मेकअप के लिए बुरा है। मैंने हाल ही में जोड़ा:

:autocmd FileType make set noexpandtab

मेरी .vimrc फ़ाइल के अंत में और यह Makefile, makefile, और * .mk को makefiles के रूप में पहचानता है और टैब का विस्तार नहीं करता है। संभवतः, आप इसे बढ़ा सकते हैं।


सक्षम करने के लिए बेहतर विकल्प है: फिलाटाइप प्लगइन्स। विम के लिए डिफ़ॉल्ट एक में शामिल हैं: सेट नॉट, ताकि आपको अपने विम में भी उस aucmd की आवश्यकता न हो।
ग्रेव

ठीक। क्या आप इसके फायदे बता सकते हैं और इसे करने में क्या शामिल है? ऑटोकैड की तुलना में फिलाइल प्लगइन्स बेहतर क्यों हैं? ऑटोकैमड का उपयोग कब किया जाना चाहिए? उपयोग नहीं किया?
जोनाथन लेफ़लर

5
Vim के साथ आने वाले filetype plugins, उदाहरण के लिए, मेकफाइल्स के लिए "सेट्लोकल नोफ़ेन्डाटैब" जैसी सहायक चीजें करेंगे। ऑटोकॉमैंड्स बनाम फुटप्लगिन्स व्यक्तिगत चीज़ों के लिए जैसे कि शिफ्ट में कोई फर्क नहीं पड़ता है - यह सिर्फ यह है कि आप अपने विम कॉन्फ़िगरेशन को कैसे चुनते हैं।
ग्रेव

17

व्यक्तिगत रूप से, मैं इन सेटिंग्स को .vimrc में उपयोग करता हूं:

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

22
कई भाषाओं में लंबे समय से स्थापित परंपराएं हैं, जैसा कि कुछ कंपनियां करती हैं। NodeJS को पूर्व के उदाहरण के रूप में लें। टैब दो जगह होने चाहिए। सिरदर्द, और काफी मूर्खतापूर्ण, लेकिन महत्वपूर्ण।
पॉल हजेन

3
टैब को सभी परिस्थितियों के लिए समान क्यों होना चाहिए? कॉन्फ़िगरेशन फ़ाइल के लिए, 8 स्पेस टैब ठीक काम करते हैं, लेकिन बहुत सारे इंडेंट के साथ कोड के लिए, 2 को प्रबंधित करना बहुत आसान है। और फिर निश्चित कन्वेंशन हैं: नोड.जेएस में 2 स्पेस टैब होने चाहिए, और अजगर वास्तव में 4 स्पेस टैब के अलावा किसी भी चीज़ के साथ सिंटैक्टिक रूप से अमान्य है।
felixphew

1
@felixphew पायथन किसी भी संख्या में रिक्त स्थान (या यहां तक ​​कि टैब) के साथ पूरी तरह से सही है जब तक यह उसी तरह से पूरे तरीके से रहता है।
जेम्स

@DJMcMayhem तुम सही हो - मुझे कहना चाहिए था "दृढ़ता से अनुशंसा करता है"।
felixphew

1
नेलो को +1। टैब वर्ण में अर्थ की एक लंबी स्थापित परंपरा है जो 8 वर्णों के कई स्थानों पर अगली स्थिति में कूदती है। यह केवल इसलिए है क्योंकि लोग "मेरी भाषा में अच्छा दिखने वाले अगले इंडेंट" के लिए टैब का उपयोग करना चाहते थे और क्योंकि कुछ पाठ संपादकों ने "एक टैब चरित्र जोड़ने" और "इंडेंटिंग के लिए रिक्त स्थान जोड़ने" और लोगों के बीच अंतर करने से परेशान नहीं किया था अपने संपादक को यह बताने का तरीका है कि अब हमारे पास यह गड़बड़ है जहां टैब कभी भी इच्छित तरीके से प्रदर्शित नहीं होते हैं। स्रोत कोड पाठ है और पाठ के लिए मानक 8-वर्ण टैब है।
फ्लोरियन एफ

6

यह हम में से अधिकांश के द्वारा जाना जा सकता है, लेकिन वैसे भी (मैं पहली बार हैरान था): डूइंग :set et( :setएक्सपेंडाबस) फ़ाइल में पहले से मौजूद टैब को नहीं बदलता है, एक को करना है :retab। उदाहरण के लिए:

:set et
:retab

और फ़ाइल के टैब को पर्याप्त स्थान से बदल दिया गया है। टैब्स वापस करने के लिए बस करें:

:set noet
:retab

4

आज, आप Editorconfig आज़मा सकते हैं , इसके लिए एक विम प्लगइन भी है। इसके साथ, आप न केवल इंडेंटेशन साइज़ को विम में बदल सकते हैं, बल्कि कई अन्य संपादकों में भी लगातार कोडिंग स्टाइल बनाए रख सकते हैं।

नीचे एक सरल Editorconfig है, जैसा कि आप देख सकते हैं, अजगर फ़ाइलों में इंडेंटेशन के लिए 4 स्थान होंगे, और पग टेम्पलेट फ़ाइलें केवल 2 होंगी।

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

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

3

यद्यपि आप इंडेंट प्लगइन का उपयोग करके या सेटिंग्स का उपयोग करके मैन्युअल रूप से विम के इंडेंटेशन को ठीक से कॉन्फ़िगर कर सकते हैं, मैं विन्डक्ट नामक एक पायथन स्क्रिप्ट का उपयोग करने की सलाह देता हूं जो स्वचालित रूप से आपके लिए संबंधित सेटिंग्स सेट करता है जब आप एक अजगर फ़ाइल खोलते हैं। विन्डेक्ट का उपयोग करके और भी अधिक प्रभावी बनाने के लिए इस टिप का उपयोग करें । जब मैंने पहली बार विभिन्न इंडेंटेशन शैलियों (टैब बनाम स्पेस और स्पेस की संख्या) के साथ दूसरों द्वारा बनाई गई अजगर फाइलों को संपादित करना शुरू किया, तो यह अविश्वसनीय रूप से निराशाजनक था। लेकिन इस इंडेंट फाइल के साथ ही विन्डेक्ट करें

यह भी सिफारिश करें:


2

उपयोग करने वालों के लिए, उन लोगों autocmdको एक साथ समूहित करना सबसे अच्छा अभ्यास है। यदि एक ग्रुपिंग फ़ाइल-प्रकार का पता लगाने से संबंधित है, तो आपके पास कुछ इस तरह हो सकता है:

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

ग्रुपिंग .vimrcविशेष रूप से संगठित होने में मदद करता है एक बार एक फाइलाइप के साथ कई नियम जुड़े हैं। उपरोक्त उदाहरण में, .c फ़ाइलों के लिए विशिष्ट एक टिप्पणी शॉर्टकट परिभाषित किया गया है।

प्रारंभिक कॉल autocmd!कहावत में किसी भी पहले से परिभाषित ऑटोकॉमैंड्स को हटाने के लिए विम को बताता है। यह .vimrcफिर से सोर्स किए जाने पर डुप्लिकेट परिभाषा को रोक देगा । :help augroupअधिक जानकारी के लिए देखें ।


1

मैं एक उपयोगिता का उपयोग करता हूं जो मैंने सी नामक में लिखा था autotab। यह फ़ाइल की पहली कुछ हज़ार लाइनों का विश्लेषण करता है जिसे आप विम मापदंडों के लिए मानों को लोड और निर्धारित करते हैं shiftwidth, tabstopऔर expandtab

उदाहरण के लिए, इसका उपयोग किया जाता है gcc -O autotab.c -o autotab। विम के साथ एकीकरण के निर्देश शीर्ष पर टिप्पणी शीर्ष लेख में हैं।

ऑटोटैब काफी चालाक है, लेकिन समय-समय पर भ्रमित हो सकता है, विशेष रूप से इसके द्वारा विभिन्न अविवेक शैलियों का उपयोग करते हुए असंगत रूप से बनाए रखा गया है।

यदि कोई फ़ाइल स्पष्ट रूप से टैब, या टैब और रिक्त स्थान के संयोजन का उपयोग करता है, तो इंडेंटेशन के लिए, ऑटोटैब यह पता लगाएगा कि किस प्रकार के टैब का उपयोग कारकों पर विचार करके किया जा रहा है, जैसे कि लगातार लाइनों पर आंतरिक तत्वों को संरेखित करना, जैसे कि टिप्पणियां।

यह विभिन्न प्रकार की प्रोग्रामिंग भाषाओं के लिए काम करता है, और "बैंड से बाहर" तत्वों के लिए क्षमा कर रहा है, जो इंडेंटेशन वेतन वृद्धि का पालन नहीं करते हैं, जैसे कि सी प्रीप्रोसेसिंग निर्देश, सी स्टेटमेंट लेबल, स्पष्ट रिक्त लाइनों का उल्लेख नहीं करना।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.