विम xml फ़ाइल इंडेंट


101

मैं विम सीख रहा हूं लेकिन मुझे लगा कि यह एक आसान काम है लेकिन मैं इसे काम नहीं कर सकता। मेरे पास ब्राउज़र SO है, लेकिन समाधान मेरे लिए काम नहीं कर रहे हैं।

मैं एक फ़ाइल (xml) को सही ढंग से इंडेंट करने की कोशिश कर रहा हूं। मेरे द्वारा उपयोग की जाने वाली कमांड है:

gg=G 

या ggVG = (इसने खुद को संभवत: कुछ अलग किया है;))

मेरा .vimrc है:

syntax on 
filetype plugin indent on 
set nu 

मूल, परिणाम और अपेक्षित आउटपुट क्या है?
इंगो करकट

क्या इसका उत्पादन होता :set ft? indentexpr?है filetype=xml indentexpr=XmlIndentGet(v:lnum,1)?
इंगो करकट

filetype = xml indentexpr = XmlIndentGet (v: lnum, 1)। हाँ
Haagenti


1
मैं इस नक्शे में बस थोड़ा सा जोड़ना और इसे बनाना पसंद करता हूं m'ggVG='', जो बस उस रेखा को बचाता है जो आप पर है और फ़ाइल को फिर से जमा करने के बाद इसे वापस ले जाता है।
होविस बिडल

जवाबों:


193

मुझे बेरी का जवाब पसंद है। हालाँकि, मुझे लगता है कि निम्नलिखित में और अधिक लचीला है कि आप अपनी vimrcफ़ाइल को बदलने की जरूरत नहीं है । इसके अलावा XML फ़ाइल के चुनिंदा भागों को प्रारूपित करना आसान है (कुछ मैं बहुत कुछ करने के लिए)।

सबसे पहले, उस XML को हाइलाइट करें जिसे आप प्रारूपित करना चाहते हैं।

फिर, सामान्य मोड में, टाइप करें ! xmllint --format -

नीचे आपकी कमांड-लाइन इस तरह दिखाई देगी:

:'<,'>!xmllint --format -

फिर एंट्री मारें।

तकनीकी व्याख्या

चयनित पाठ को xmllintकमांड में भेजा जाता है , फिर --format'एड', और परिणाम xmllintआपके चयनित पाठ के ऊपर रखे जाते हैं। -जो, इस मामले में, चयनित पाठ vim को भेजता है है - आदेश के अंत में मानक इनपुट प्राप्त करने के लिए है xmllint


6
यह निश्चित रूप से केवल तभी काम करता है जब आपके पास बाहरी उपकरण xmllint स्थापित हो और आपके पथ में जोड़ा गया हो।
पॉलीमोर्फिक्स

66
आदेश आसान बनाने के लिए, :%!xmllint --format -, %इस xml फ़ाइल की पूरी गुंजाइश है।
हकुनामी '

1
हर कोई उम्मीद क्यों करता है कि एक xmllint उपकरण है? उबंटू में 15.04 नहीं है और उपयुक्त भी एक नहीं मिल सकता है।
एरिकबवर्क

8
@ erikb85 पैकेज और पैकेज सामग्री की खोज करते समय apt-cache search, उपयोग न करें apt-getlibxml2-utilsलापता उपकरण है।
ParanoiaPuppy

@ काकनामी मेरी इच्छा है कि मैं उस प्रक्रिया को सरल बनाने के लिए आपको १००० बार उत्थान करूं
niken

69

अपनी xmlफ़ाइलों को इंडेंट करने के लिए किसी बाहरी प्रोग्राम का उपयोग करें । इस मामले में xmllint, मैंने चुना है , इसलिए कमांड को equalprgविकल्प पर सेट करें :

:set equalprg=xmllint\ --format\ -

अब आप निष्पादित कर सकते हैं

gg=G

xmllintअपनी xmlफ़ाइलों को प्रारूपित करने के लिए ।

इसे हर बार इस्तेमाल करने के लिए , autocommandइसे सेट करने के लिए एक का उपयोग करें ।

autocommand नीचे एक टिप्पणी से

au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null

यकीन नहीं है कि यह क्यों काम करता है इसलिए शुरुआती लेकिन मैं यह पता
लगाऊंगा

8
Xml फ़ाइलों को संपादित करते समय आप इसे सक्षम करने के लिए अपने .vimrc में निम्न का उपयोग कर सकते हैं - au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null। स्रोत - ku1ik.com/2011/09/08/…
studgeek

1
धन्यवाद! बड़ी XML फ़ाइलों और विम के साथ बहुत निराश, उदात्त में वे बहुत जल्दी (5000-10000 लाइनों और base64 डेटा) reindents, लेकिन विम में वे कई मिनट reindents। यह समाधान बड़ी XML फ़ाइलों के साथ समस्या को ठीक करता है। फिर से मैं विम के साथ खुश था।

यदि आप libxml2-utils
उबंटू

33

एक सरल समाधान जो मुझे पसंद है जिसमें किसी भी तीसरे पक्ष के उपकरण की आवश्यकता नहीं है, प्रत्येक उद्घाटन टैग '<...>' से पहले एक नई पंक्ति सम्मिलित करना है। तब आप मानक विम ऑटो-इंडेंटेशन का उपयोग कर सकते हैं। संक्षेप में:

  1. %s/</\r</g
  2. gg=G ऑटो इंडेंट करने के लिए

मैंने इसे एक बड़ी xml फ़ाइल के साथ आज़माया है और यह प्रक्रिया करने के लिए लंबा है।
ल्यूक एम

धन्यवाद। यह काफी आसान है और बाहरी उपकरणों की आवश्यकता के बिना काम करता है।
हवाई हमले

6
मैं पसंद करता हूं %s/></>\r</g, ताकि प्रत्येक पाठ तत्व एक ही पंक्ति पर बना रहे।
निकोला मुसाती

2
@ नोइकोलामुट्टी या यदि कभी-कभी टैग के बीच रिक्त स्थान होते हैं,%s/> *</>\r</g
आर्थर टक्का

11

यह एक बार हासिल करना आसान है ~ / .vimrc ठीक से सेटअप है।

निम्नलिखित विकल्पों को ~ / .vimrc में सेट करें:

filetype indent on
set smartindent

यह आपको फ़ाइल के शीर्ष पर कर्सर ले जाने और अंत में इंडेंट करने की अनुमति देता है: gg = G

आप दृश्य मोड के साथ वांछित पाठ का चयन कर सकते हैं और इसे इंडेंट करने के लिए = हिट कर सकते हैं।


2
मुझे लगता है इसके .vimrcबजाय यह होगा .bashrc
बिरयानी

1
ओह। बिल्कुल सही। तय किया कि धन्यवाद।
जेरेडराज

हर टैग एक पंक्ति में होने पर काम करेगा। यदि XML में स्थान नहीं है और न ही अंत लाइनें हैं, तो यह कुछ भी नहीं करेगा।
जोस रामोन

यह हमेशा मेरे लिए काम किया है जब तक मार्कअप वैध है।
जेरेडराज

यदि आपका मार्कअप नहीं है (होशपूर्वक?) अलग-अलग पंक्तियों पर, तो आप इसे धीरे-धीरे बदल सकते हैं:% s / </ \ r </ g और फिर:% s / \ n \ n / \ r /
jarederaj

11

संक्षिप्त उत्तर: matchit.vim चालू करें । आप जोड़ सकते हैं packadd matchitआपके लिए .vimrc, या का उपयोग vim-समझदार है, जो यह डिफ़ॉल्ट रूप से सक्षम बनाता है।

लंबा उत्तर: मैंने विम में ऑटो-इंडेंट एक्सएमएल के लिए कई रणनीतियों की कोशिश की है, जिसमें विम विकी पर चर्चा की गई एक्समिंट दृष्टिकोण भी शामिल है । के साथ समस्या यह xmllint(और इस तरह के रूप में अन्य बाहरी CLI उपकरण के साथ एक ही दृष्टिकोण xmlformatऔर tidy, भी) है कि वे सभी खाली नई-पंक्तियों बाहर फैलाएंगे पर जोर देते है। यदि आप चाहते हैं कि आपके XML को खाली लाइनों, टिप्पणियों और / या अन्य जानबूझकर स्वरूपण को हटाने के बिना, तो xmllintसबसे अच्छा विकल्प नहीं है।

यह पता चला है कि विम का समतुल्य (=) कमांड पहले से ही XML का समर्थन करता है, जब तक कि matchit.vim स्क्रिप्ट सक्षम है। इसे सक्षम करने का एक सुपर आसान तरीका है, टॉपोप की विम-समझदार को अपनाना । एक और अपने को जोड़ने के packadd matchitलिए है .vimrc। तब, XML स्वरूपण बॉक्स से "बस काम" करेगा।


1
अधिक सटीक होने के लिए, ऐसा लगता matchit.vimहै कि वास्तविक समाधान है। आप vimrcइस लाइन को जोड़कर इसे अपने में सक्षम कर सकते हैं :packadd matchit
क्रिश्चियन रोंडो

1
धन्यवाद ईसाई; मैंने उस माचिस को स्पष्ट करने के लिए उत्तर को अपडेट कर दिया। इस समस्या का हल क्या है।
ctrueden

अपविटेड क्योंकि इसने मेरे लिए सबसे अच्छा काम किया। हालाँकि, मैं ईसाई के सुझाव (पैकडेड माचिस) को संक्षिप्त उत्तर में जोड़ने का सुझाव दूंगा क्योंकि यह बहुत सरल है और यह काम करता है (कम से कम मेरे लिए)
चिह्नित करें

@ चिह्न मैंने ईसाई के सुझाव को शामिल करने के लिए उत्तर को अपडेट किया।
ctrueden

4

VIM में, मैं निम्नलिखित कमांड का उपयोग करके संपूर्ण फ़ाइल (हार्ड टैब का उपयोग करके) को ऑटो-इंडेंट करता हूं:

:%!XMLLINT_INDENT="^I" xmllint --format -

^Iएकल वर्ण आप के माध्यम से उत्पन्न है: CTRL+ v, CTRL+i


1

मुझे भी यही समस्या थी। यह पता चला, कि लाइन

set viewdir=~\.vim\views\

मेरे .vimrcकारण समस्या है। बस सुनिश्चित करें, आपके पास यह नहीं है।


1

जेसी होगन का उत्तर अच्छा है, लेकिन मैं अधिक सरल उत्तर देना चाहूंगा:

जब आप vim में होते हैं और आपकी XML फाइल खुल जाती है, तो सामान्य मोड में इसे लिखें:

:%!xmllint --format %

उसके बाद Enter दबाएँ। आपकी सभी XML फाइल फॉर्मेट हो जाएगी।

याद रखें कि आपको पहले xmllint स्थापित करना चाहिए था ।


0

उन लोगों के लिए, जो coc.nvimप्लगइन का उपयोग कर रहे हैं , आप अपनी इनफ़ॉर्म फ़ाइल में प्रारूप कुंजी को मैप coc-xmlकरके स्थापित कर सकते हैं :। अब से, आप न केवल xml फ़ाइल को प्रारूपित कर सकते हैं बल्कि अन्य फ़ाइल को बहुत आसान कर सकते हैं:CocInstall coc-xmlnmap <silent> fm <Plug>(coc-format)

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