टैब कुंजी == 4 रिक्त स्थान और विम में घुंघराले ब्रेसिज़ के बाद ऑटो-इंडेंट


1265

मैं vi - विम कैसे बनाऊं कभी टैब का उपयोग नहीं करता (रिक्त स्थान को टैब में परिवर्तित करना, बुरा?), टैब को कुंजी बनाता है == 4 रिक्त स्थान, और Emacs जैसे घुंघराले ब्रेस ब्लॉकों के बाद स्वचालित रूप से इंडेंट कोड करता है?

इसके अलावा, मैं इन सेटिंग्स को कैसे सहेज सकता हूं ताकि मुझे उन्हें फिर से इनपुट न करना पड़े?

मैंने इससे संबंधित अन्य प्रश्न देखे हैं, लेकिन यह हमेशा लगता है कि मैं जो चाहता हूं उससे थोड़ा हटकर हूं।


जवाबों:


1881

जैसा कि नीचे दिए गए कुछ उत्तरों में बताया गया है, पसंदीदा तरीका अब स्मार्टइंटेंट का उपयोग नहीं करना है, बल्कि इसके बजाय (अपने .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

आपके .vimrc: फ़ाइल में:

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

मदद फ़ाइलों को उपयोग करने के लिए थोड़ा समय लगता है, लेकिन जितना अधिक आप पढ़ते हैं, उतना बेहतर विम प्राप्त होता है:

:help smartindent

इससे भी बेहतर, आप पोर्टेबिलिटी के लिए इन सेटिंग्स को अपने स्रोत में एम्बेड कर सकते हैं:

:help auto-setting

अपनी वर्तमान सेटिंग देखने के लिए:

:set all

जैसा कि ग्रेव ने टिप्पणी में बताया है, स्मार्टइंडेंट को सिंटेंट द्वारा बदल दिया गया है जो "अधिक चतुराई से काम करता है", हालांकि अभी भी मुख्य रूप से सी-जैसे सिंटैक्स वाली भाषाओं के लिए:

:help C-indenting


4
यदि आपके पास एक्सपेंडेब सेट है तो यह रिक्त स्थान का उपयोग करना चाहिए। क्या आप "संगत सेट" भी करते हैं? एक्सपेंडाटैब को "ऑफ" के अपने डिफॉल्ट में रीसेट करने सहित विभिन्न दुष्प्रभाव हैं
केन

60
क्षमा करें, लेकिन स्मार्टइंडेंट को cindent द्वारा प्रतिस्थापित किया गया था, जो कि केवल C- शैली सिंटैक्स के लिए उपयुक्त है। अन्य भाषाओं के साथ काम करने पर आपके vimrc में या तो चालू करना एक समस्या हो सकती है। इसके बजाय "फ़िलाइटाइप इंडेंट ऑन" का उपयोग करें।
ग्रेफ

2
खैर, smartindent है भी केवल सी शैली वाक्य रचना के लिए और अनिवार्य रूप से मान्य नहीं है।
ग्रेव जूल

4
अगर मैं एक्सपेंडेब को सक्षम करता हूं, तो क्या वास्तव में पाठ में टैब चरित्र को इनपुट करने का एक तरीका है?
डेनियल सेगातो

3
@DanieleSegato <ctrl v> <टैब> इन्सर्ट मोड में काम करना चाहिए: stackoverflow.com/questions/4781070/…
Ken

236

संबंधित, यदि आप एक फ़ाइल खोलते हैं जो टैब और रिक्त स्थान दोनों का उपयोग करती है, तो मान लें कि आप मिल गए हैं

set expandtab ts=4 sw=4 ai

आप पूरी फ़ाइल में रिक्त स्थान के साथ सभी टैब को बदल सकते हैं

:%retab

10
FYI करें, यदि आप नहीं चाहते हैं कि आपके टैब को रिक्त स्थान द्वारा प्रतिस्थापित किया जाए, तो विस्ताराटैब लाइन को हटा दें।
एनो

6
टैब व्हाट्सएप नहीं हैं? ;-)
रोब वेल्स

11
@ रॉब-वेल्स: मैंने "व्हाट्सएप" को "स्पेस" में बदल दिया। क्या आप अब खुश हैं? ;-)
नेटजेफ़

क्या आप बता सकते हैं कि पहली पंक्ति का क्या मतलब है?
निधि मोनिका का मुकदमा

2
यदि टैब को रिक्त स्थान तक विस्तारित किया जाता है, तो एक्सपैंडटाब निर्धारित करता है। ts = tabstop = रिक्त स्थान की संख्या जो फ़ाइल में एक <Tab> के लिए गिना जाता है। स्व (शिफ्ट) = इंडेंट के प्रत्येक चरण के लिए उपयोग करने के लिए रिक्त स्थान की संख्या। ai = autoindent = नई लाइन शुरू करते समय करंट लाइन से इंडेंट कॉपी करें।
mcmacerson

89

Filetype- विशिष्ट इंडेंटेशन प्राप्त करने का सबसे अच्छा तरीका है कि आप filetype plugin indent onअपने vimrc में उपयोग करें। फिर आप set sw=4 sts=4 et.vim / ftplugin / c.vim जैसी चीजों को निर्दिष्ट कर सकते हैं , उदाहरण के लिए, बिना संपादित किए सभी फ़ाइलों के लिए उन वैश्विक बनाने के लिए और अन्य गैर-सी प्रकार के सिंटैक्स को सही ढंग से इंडेंट किया जाएगा, यहां तक ​​कि (लिस्प्स भी)


9
IMHO, उस उत्तर से बेहतर है जिसे सही चिह्नित किया गया है। filetype इंडेंटेड सिंडींट और स्मार्टइंडेंट पर इंडेंट।
0fnt

62

अधिकांश फ़ाइलों में 4-स्पेस टैब होने के लिए, मेकफाइल्स में वास्तविक 8-वाइड टैब चार और C / C ++ सहित विभिन्न फ़ाइलों में स्वचालित इंडेंटिंग, इसे अपनी ~/.vimrcफ़ाइल में रखें:

" 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.

आपको एक की आवश्यकता क्यों नहीं है else? यह मुझे लगता है कि आखिरी लाइनें सभी मामलों में
मेकफाइल

6
हाय @lucidbrot, "autocmd FileType मेक" स्टेटमेंट मूल रूप से जब भी मेकफाइल खोलता है, तो इसे इस्तेमाल करने के लिए कुछ सेटिंग्स बताता है। जबकि नीचे की रेखाएँ डिफॉल्ट सेट कर रही हैं। दूसरे शब्दों में, "tabstop = 8 ..." सेटिंग्स बाद में लागू होती हैं जब फ़ाइल खोली जाती है, और "tabstop = 4 ..." सेटिंग को अधिलेखित करने पर लागू होगा।
शेरविन इमामी

56

कई लिनक्स प्रणालियों पर, उबंटू की तरह, .vimrcफ़ाइल डिफ़ॉल्ट रूप से मौजूद नहीं है, इसलिए यह अनुशंसा की जाती है कि आप इसे पहले बनाएं।

.viminfoघर निर्देशिका में मौजूद फ़ाइल का उपयोग न करें । इसका उपयोग एक अलग उद्देश्य के लिए किया जाता है।

चरण 1: अपने घर निर्देशिका पर जाएं

cd ~

चरण 2: फ़ाइल बनाएँ

vim .vimrc

चरण 3: ऊपर वर्णित कॉन्फ़िगरेशन जोड़ें

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

चरण 3: फ़ाइल सहेजें, दबाकर Shift+ ZZ


11
इसका उपयोग न करें Shift + ZZ.swp फ़ाइल बनाएंगे। का उपयोग करें wq
शास

6
@ एसएचएस: "जेडजेड" ": एक्स" के बराबर है , जो कि ": विक" के समान है, सिवाय इसके कि यह केवल बचाता है अगर फ़ाइल बदल दी गई है ... ( Ctrl-Zएक और कहानी है ...)
गर्ट वैन डेन बर्ग

1
@ बस जो असत्य है। यदि आप एक संपादन sesion के लिए एक स्वैप फ़ाइल नहीं चाहते हैं, तो आपको दौड़ना होगा vim -n <file>। एक स्वैप फाइल कुछ ऐसी चीज नहीं है जो समय बचाने पर उत्पन्न होती है; यह काफी हद तक अपने उद्देश्य को हरा देगा, क्योंकि स्वैप फाइलें अचानक समाप्त हुए सत्रों को पुनर्प्राप्त करने में उपयोगी हो जाती हैं।
कज़

32

अनुशंसित तरीका यह है कि फिलाटाइप आधारित इंडेंटेशन का उपयोग करें और केवल स्मार्टइंडेंट और सिंटेंट का उपयोग करें यदि यह पर्याप्त नहीं है।

निम्नलिखित को अपने .vimrc में जोड़ें

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

आशा है कि यह एक अलग उत्तर होने के नाते मदद करता है।




6

ऑटो-इंडेंट वर्तमान सिंटैक्स मोड पर आधारित है। मुझे पता है कि अगर आप Foo.java का संपादन कर रहे हैं, तो एक में प्रवेश करना {और Enterनिम्नलिखित पंक्ति को इंगित करता है ।

टैब के लिए, दो सेटिंग्स हैं। विम के भीतर, एक कोलन टाइप करें और फिर "सेट टैबटॉप = 4" जो चार स्थानों के रूप में प्रदर्शित करने के लिए टैब सेट करेगा। कोलन को फिर से हिट करें और "सेट एक्सपेंडेबट" टाइप करें जो टैब के लिए रिक्त स्थान सम्मिलित करेगा।

आप इन सेटिंग्स को अपने होम डायरेक्टरी में .vimrc (या विंडोज पर _vimrc) में डाल सकते हैं, इसलिए आपको केवल एक बार टाइप करना होगा।


0

सबसे पहले, Tabमैनुअल इंडेंटेशन के लिए विम में कुंजी का उपयोग न करें । विम में इंडेंटेशन राशि को मैन्युअल रूप से बढ़ाने या घटाने के लिए इंसर्ट मोड में एक जोड़ी कमांड होती है। उन आदेशों हैं Ctrl-Tऔर Ctrl-D। इन आदेशों के मूल्यों का पालन tabstop, shiftwidthऔर expandtab, और रिक्त स्थान और टैब (टैब की अधिकतम संख्या रिक्त स्थान की किसी भी आवश्यक नंबर के बाद) का सही मिश्रण बनाए रखें।

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

यदि आपको परेशान Ctrl-Tकरने के बजाय Tab, आप इसे हटा सकते हैं:

:imap <Tab> ^T

आप भी कर सकते हैं रीमेक Shift-Tabकरने के लिए Ctrl-D:

:imap <S-Tab> ^D

यहाँ ^ T और ^ D शाब्दिक नियंत्रण वर्ण हैं जिन्हें सम्मिलित किया जा सकता है Ctrl-VCtrl-T

जगह में इस मानचित्रण के साथ, आप अभी भी उपयोग कर रहे बफर में शाब्दिक टैब टाइप कर सकते हैं Ctrl-VTab। ध्यान दें कि यदि आप ऐसा करते हैं, भले ही :set expandtabआप चालू हों, आपको एक अनएक्सपेन्डेड टैब कैरेक्टर मिलता है।

<Tab>मानचित्र के समान प्रभाव का उपयोग करके प्राप्त किया जाता है :set smarttab, जो स्मार्ट व्यवहार करने के लिए एक पंक्ति के सामने बैकस्पेस का कारण बनता है।

में smarttabमोड, जब Tabएक लाइन के शुरू में नहीं किया जाता है, यह कोई विशेष अर्थ नहीं है। यह मेरे उपरोक्त मानचित्रण से अलग Tabहै Ctrl-T, क्योंकि Ctrl-Tएक पंक्ति में (कहीं भी सम्मिलित मोड में) उपयोग किया जाना उस रेखा के इंडेंटेशन को बढ़ा देगा।

अन्य उपयोगी मैपिंग हो सकती है:

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

अब हम कुछ लाइनों का चयन कर सकते हैं, और Tabउन्हें खत्म करने के लिए हिट कर सकते हैं । या फिर Tabअपना इंडेंटेशन बढ़ाने के लिए एक लाइन (कमांड मोड में) पर दो बार मारा ।

आप उचित खरोज प्रबंधन आदेशों का उपयोग करते हैं, तो सब कुछ तीन मापदंडों के द्वारा नियंत्रित किया जाता है: shiftwidth, tabstopऔर expandtab

shiftwidthपैरामीटर अपने खरोज आकार को नियंत्रित करता; यदि आप चार अंतरिक्ष संकेत, उपयोग :set shiftwidth=4, या संक्षिप्त नाम चाहते हैं :set sw=4

यदि केवल यह किया जाता है, तो रिक्त स्थान और टैब के मिश्रण का उपयोग करके इंडेंटेशन बनाया जाएगा, क्योंकि noexpandtabडिफ़ॉल्ट है। उपयोग:set expandtab । यह टैब वर्णों का कारण बनता है जो आप रिक्त स्थान में विस्तार करने के लिए बफर में टाइप करते हैं, और केवल रिक्त स्थान का उपयोग करने के लिए विम-प्रबंधित इंडेंटेशन के लिए।

कब expandtabहै, और यदि आप सभी उचित Vim तंत्रों के माध्यम से अपने इंडेंटेशन का प्रबंधन करते हैं, तो मूल्य tabstopअप्रासंगिक हो जाता है। यह नियंत्रित करता है कि फ़ाइल में होने पर टैब कैसे दिखाई देते हैं। यदि आपके पास है set tabstop=8 expandtabऔर फिर उपयोग करने वाली फ़ाइल में एक हार्ड टैब चुपके है Ctrl-VTab, तो यह हमेशा की तरह अगले 8-कॉलम-आधारित टैब स्थिति के लिए एक संरेखण पैदा करेगा।


आपके सभी मैपिंग को गैर-पुनरावर्ती संस्करण का उपयोग करना चाहिए। मैपिंग गो <C-t>शाब्दिक के बजाय उस वाक्य रचना का उपयोग कर सकता है। अंत में, <Tab>सामान्य मोड में मैपिंग भी मैप होगी <C-i>(वे एक ही चरित्र हैं), इसलिए मैं अनुशंसा नहीं करता कि (आप vim कार्यक्षमता का एक निफ्टी टुकड़ा खो दें
डी बेन नोबल

@ D.BenKnoble मैं इसमें से किसी की भी सिफारिश नहीं करता; मैं स्वयं Ctrl-T, Ctrl-D और <> का उपयोग करता हूं। इरादा के रूप में विम का उपयोग कर रहा है। अन्य संपादकों में टैब का उपयोग करने वाले लोग शायद इसे पसंद न करें, बस।
काज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.