Emacs पर बहुत प्रिंटिंग एक्सएमएल फाइलें

मैं अपनी एक्सएमएल फाइलों (एनएक्सएमएल-मोड) को संपादित करने के लिए emacs का उपयोग करता हूं और मशीन द्वारा जेनरेट की गई फाइलों में टैग की कोई सुंदर स्वरूपण नहीं होती है।

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

क्या उधर रास्ता है? या लिनक्स पर कम से कम कुछ संपादक जो इसे कर सकते हैं।

0
ro fr bn

14 उत्तर

I use nXML mode for editing and Tidy when I want to format and indent xml or HTML. There is also an Emacs interface to Tidy.

0
जोड़ा
2013 tidy.el के अंत तक संस्करण: 20111222.1756 <कोड> गलत प्रकार तर्क: stringp, nil के साथ Emacs 24 पर चलाने में विफल रहता है
जोड़ा लेखक keiw, स्रोत
@keiw शायद ऐसा इसलिए है क्योंकि आप इसे एक बफर में कर रहे हैं जिसमें फ़ाइल का नाम नहीं है। एक ही त्रुटि मिल गई और कम से कम मेरी तरफ उस पर इसका पता लगाया।
जोड़ा लेखक Alf, स्रोत

मैंने जेसन वियर्स का संस्करण लिया और xmlns घोषणाओं को अपनी लाइनों पर रखने के लिए तर्क जोड़ा। यह मानता है कि आपके पास xmlns = और xmlns है: बिना किसी हस्तक्षेप वाले व्हाइटस्पेस के।

(defun cheeso-pretty-print-xml-region (begin end)
  "Pretty format xml markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this.  The function inserts linebreaks to separate tags that have
nothing but whitespace between them.  It then indents the markup
by using nxml's indentation rules."
  (interactive "r")
  (save-excursion
    (nxml-mode)
    ;; split  or , but not 
    (goto-char begin)
    (while (search-forward-regexp ">[ \t]*<[^/]" end t)
      (backward-char 2) (insert "\n") (incf end))
    ;; split  and 
    (goto-char begin)
    (while (search-forward-regexp "<.*?/.*?>[ \t]*<" end t)
      (backward-char) (insert "\n") (incf end))
    ;; put xml namespace decls on newline
    (goto-char begin)
    (while (search-forward-regexp "\\(<\\([a-zA-Z][-:A-Za-z0-9]*\\)\\|['\"]\\) \\(xmlns[=:]\\)" end t)
      (goto-char (match-end 0))
      (backward-char 6) (insert "\n") (incf end))
    (indent-region begin end nil)
    (normal-mode))
  (message "All indented!"))
0
जोड़ा

साफ एक अच्छा तरीका की तरह दिखता है। इसे देखना चाहिए। अगर इसका वास्तव में मुझे प्रदान की जाने वाली सभी सुविधाओं की ज़रूरत है तो इसका उपयोग करेंगे।

वैसे भी, यह समस्या मुझे लगभग एक सप्ताह तक घबरा रही थी और मैं ठीक से खोज नहीं कर रहा था। पोस्ट करने के बाद, मैंने एक साइट को खोजना शुरू कर दिया elisp समारोह जो यह बहुत अच्छा करता है। लेखक टिडी का उपयोग करने का भी सुझाव देते हैं।

जवाब के लिए धन्यवाद मार्सेल <स्ट्राइक> (बहुत बुरा मेरे पास आपको ऊपर उठाने के लिए पर्याप्त अंक नहीं हैं) ।

Will post about it soon on my blog. Here is a post about it (with a link to Marcel's site).

0
जोड़ा

लाइन ब्रेक और फिर सुंदर प्रिंटिंग शुरू करने के लिए

M-x sgml-mode
M-x sgml-pretty-print
0
जोड़ा

मैं xml-reformat-tag का उपयोग करता हूं "nofollow"> एक्सएमएल-parse.el । आम तौर पर आप इस कमांड को चलाने के दौरान फ़ाइल की शुरुआत में बिंदु रखना चाहते हैं।

यह दिलचस्प है कि फ़ाइल को Emacspeak में शामिल किया गया है। जब मैं दिन-दर-दिन आधार पर Emacspeak का उपयोग कर रहा था, मैंने सोचा कि xml-reformat-tag एक Emacs अंतर्निहित है। एक दिन मैंने इसे खो दिया और इसके लिए इंटरनेट खोज करना पड़ा, और इस प्रकार ऊपर वर्णित विकी पेज में प्रवेश किया।

मैं xml-parse शुरू करने के लिए भी अपना कोड संलग्न कर रहा हूं। सुनिश्चित नहीं है कि यह Emacs कोड का सबसे अच्छा टुकड़ा है, लेकिन मेरे लिए काम करता प्रतीत होता है।

(if (file-exists-p "~/.emacs.d/packages/xml-parse.el")
  (let ((load-path load-path))
    (add-to-list 'load-path "~/.emacs.d/packages")
    (require 'xml-parse))
)
0
जोड़ा

बेंजामिन फेरारी के संस्करण में किए गए कुछ बदलाव यहां दिए गए हैं:

  • search-forward-regexp ने अंत निर्दिष्ट नहीं किया है, इसलिए यह क्षेत्र की शुरुआत से बफर के अंत तक (क्षेत्र के अंत के बजाय) सामग्री पर काम करेगा
  • अब चेसो ने नोट किया, जैसा कि end को ठीक से बढ़ाता है।
  • यह के बीच एक ब्रेक डालेगा, जो इसके मान को संशोधित करता है। हां, तकनीकी रूप से हम यहां सब कुछ के मूल्यों को संशोधित कर रहे हैं, लेकिन एक खाली प्रारंभ/अंत महत्वपूर्ण होने की संभावना अधिक है। अब इससे बचने के लिए दो अलग, थोड़ी अधिक सख्त खोजों का उपयोग करता है।

अभी भी "बाहरी साफ पर निर्भर नहीं है", आदि। हालांकि, incf मैक्रो के लिए cl की आवश्यकता होती है।

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; pretty print xml region
(defun pretty-print-xml-region (begin end)
  "Pretty format xml markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this.  The function inserts linebreaks to separate tags that have
nothing but whitespace between them.  It then indents the markup
by using nxml's indentation rules."
  (interactive "r")
  (save-excursion
    (nxml-mode)
    (goto-char begin)
    ;; split  or , but not 
    (while (search-forward-regexp ">[ \t]*<[^/]" end t)
      (backward-char 2) (insert "\n") (incf end))
    ;; split  and 
    (goto-char begin)
    (while (search-forward-regexp "<.*?/.*?>[ \t]*<" end t)
      (backward-char) (insert "\n") (incf end))
    (indent-region begin end nil)
    (normal-mode))
  (message "All indented!"))
0
जोड़ा

यदि आपको केवल नए लाइन-ब्रेक पेश किए बिना सुंदर इंडेंटिंग की आवश्यकता है, तो आप इन कीस्ट्रोक के साथ पूरे बफर में indent-region कमांड लागू कर सकते हैं:

C-x h
C-M-\

यदि आपको लाइन-ब्रेक पेश करने की भी आवश्यकता है, ताकि टैग खोलना और बंद करना अलग-अलग लाइनों पर हो, तो आप बेंजामिन फेरारी । मैंने इसे अपने ब्लॉग पर पाया और उम्मीद है कि मेरे लिए इसे पुन: पेश करना ठीक है:

(defun bf-pretty-print-xml-region (begin end)
  "Pretty format xml markup in region. You need to have nxml-mode
http://www.emacswiki.org/cgi-bin/wiki/NxmlMode installed to do
this.  The function inserts linebreaks to separate tags that have
nothing but whitespace between them.  It then indents the markup
by using nxml's indentation rules."
  (interactive "r")
  (save-excursion
      (nxml-mode)
      (goto-char begin)
      (while (search-forward-regexp "\>[ \\t]*\<" nil t) 
        (backward-char) (insert "\n"))
      (indent-region begin end))
    (message "Ah, much better!"))

यह टिडी जैसे बाहरी उपकरण पर भरोसा नहीं करता है।

0
जोड़ा
अच्छा defun, धन्यवाद। उपरोक्त सुंदर-प्रिंट डिफून से (एनएक्सएमएल-मोड) को हटाने से यह एसजीएमएल-मोड में काम करने की अनुमति देता है जो 22.2.1 emacs में अंतर्निहित है। लेकिन मैंने इसे पूरे बफर (पॉइंट-मिनट) (प्वाइंट-मैक्स) करने के लिए संशोधित किया क्योंकि यह मेरी मुख्य बात है। इसके अलावा, एक बग: आपके द्वारा डाली गई प्रत्येक नई लाइन के लिए, आपको अंत में वृद्धि की आवश्यकता होगी।
जोड़ा लेखक Cheeso, स्रोत
@ceving - stackoverflow.com/a/14589619/48082 देखें
जोड़ा लेखक Cheeso, स्रोत
लंबी विशेषता सूचियों को तोड़ने के बारे में कैसे?
जोड़ा लेखक ceving, स्रोत
डिफ्यून का मूल्यांकन करने के बाद, आप इसे किसी भी अन्य फ़ंक्शन की तरह आमंत्रित कर सकते हैं: एम-एक्स बीएफ-सुंदर-प्रिंट-एक्सएमएल-क्षेत्र। (आपको यह सब टाइप करना पड़ेगा, बेशक, टैब पूर्णता का उपयोग करें: एमएक्स बीएफ <टैब> पर्याप्त होना चाहिए।) आप शायद हर बार फ़ंक्शन को परिभाषित नहीं करना चाहते हैं, इसलिए इसे कहीं भी रखें जहां इसे स्टार्ट-टाइम पर लोड किया जाता है, उदाहरण के लिए ~/.emacs.d/init.el में
जोड़ा लेखक Christian Berg, स्रोत
मैं Emacs में इस फ़ंक्शन का उपयोग कैसे कर सकता हूं? मैंने स्क्रैच बफर में फ़ंक्शन कोड कॉपी और पेस्ट किया है और इसका मूल्यांकन किया है। अब, मैं इस समारोह को कैसे शुरू करूं?
जोड़ा लेखक Alexandre Rademaker, स्रोत
यह शानदार है, क्योंकि अजीब चरित्र एन्कोडिंग के बारे में साफ शिकायत करता है और चाहता है कि मैं उन्हें पहले साफ़ कर दूं, यह फ़ाइल को दोबारा सुधार देगा! कभी-कभी बिंदु टूटी हुई एक्सएमएल फ़ाइल की संरचना को देखना होता है और साफ मदद करने से इंकार कर देगा।
जोड़ा लेखक TauPan, स्रोत
  1. Emacs nxml-mode प्रस्तुत प्रारूप पर काम कर सकता है, लेकिन आपको लाइनों को विभाजित करना होगा।
  2. लंबी फ़ाइलों के लिए जो बस इसके लायक नहीं है। इस स्टाइलशीट को चलाएं (आदर्श रूप से सैक्सन के साथ जो आईएमएचओ को लाइन के बारे में लाइन इंडेंट्स मिलती है) लंबी फाइलों के खिलाफ एक अच्छा सुंदर प्रिंट पाने के लिए। किसी भी तत्व के लिए जहां आप सफेद जगह को बनाए रखना चाहते हैं 'प्रोग्रामलिस्टिंग' के साथ अपने नाम जोड़ें 'प्रोग्रामइस्टिंग आपके एलेमेंटनाम'
  3. में

HTH

0
जोड़ा

आपको अपने स्वयं के फ़ंक्शन को लिखने की भी आवश्यकता नहीं है - sgml-mode (एक gnu emacs कोर मॉड्यूल) में एक अंतर्निहित सुंदर प्रिंटिंग फ़ंक्शन है जिसे (sgml-pretty-print ...) कहा जाता है जो क्षेत्र को आरंभ और तर्क समाप्त करता है।

यदि आप एक्सएमएल काटने और पेस्ट कर रहे हैं और आपको लगता है कि आपका टर्मिनल अनियंत्रित स्थानों में लाइनों को काट रहा है तो आप इसका उपयोग कर सकते हैं सुंदर प्रिंटर जो पहले टूटी हुई रेखाओं को हल करता है।

0
जोड़ा
मुझे यकीन नहीं है कि समय के साथ sgml-mode कैसे बदल सकता है। आज, मैंने Cx Cf foo.xml , Mx sgml-mode , फिर Mx sgml-pretty-print और मेरी xml फ़ाइल को बहुत प्रिंट किया है । (ठीक है, emacs पूरा होने से पहले बीस सेकंड या उससे अधिक के लिए फांसी दी गई थी। यह सुंदर प्रिंट और 720 लाइनों के बाद एक लाइन फ़ाइल थी।)
जोड़ा लेखक daveloyall, स्रोत
असल में, मुझे एक क्षेत्र के रूप में पूरे बफर का चयन करने के लिए C-x g भी करना था।
जोड़ा लेखक daveloyall, स्रोत
मैं इस क्षेत्र को तर्क के रूप में पास करने वाले फ़ंक्शन को कैसे निष्पादित करूं?
जोड़ा लेखक Alexandre Rademaker, स्रोत
(एसजीएमएल-सुंदर-प्रिंट (क्षेत्र-शुरुआत) (क्षेत्र-अंत))
जोड़ा लेखक ScootyPuff, स्रोत

Emacs एम-| के साथ मनमाने ढंग से आदेश चला सकते हैं। यदि आपके पास xmllint इंस्टॉल है:

"एम- | xmllint --format -" चयनित क्षेत्र को प्रारूपित करेगा

"सी-यू एम- | xmllint --format -" ऐसा ही करेगा, क्षेत्र को आउटपुट के साथ बदल देगा

0
जोड़ा
क्षेत्र को प्रक्रिया के रूप में पूरे बफर सामग्री को चिह्नित करने के लिए सामने एम-एक्स मार्क-ऑल-बफर का उपयोग करें।
जोड़ा लेखक Harald, स्रोत
@bubak नीचे लिपि गए। धन्यवाद!
जोड़ा लेखक Tim Helmstedt, स्रोत

टिम हेल्मस्टेड के लिए धन्यवाद मैंने इस तरह बनाया:

(defun nxml-pretty-format ()
    (interactive)
    (save-excursion
        (shell-command-on-region (point-min) (point-max) "xmllint --format -" (buffer-name) t)
        (nxml-mode)
        (indent-region begin end)))

तेज़ और आसान बहुत धन्यवाद।

0
जोड़ा
इसने मुझे जीएनयू Emacs 24 पर एक त्रुटि दी, इसलिए मैंने अंतिम पंक्ति को बदल दिया: (इंडेंट-क्षेत्र 0 (गिनती-रेखाएं (बिंदु-मिनट) (बिंदु-अधिकतम))
जोड़ा लेखक John J. Camilleri, स्रोत

करने का एक तरीका है यदि आपके पास नीचे प्रारूप में कुछ है

                

Emacs में, कोशिश करें

M-x nxml-mode
M-x replace-regexp RET  > *< RET >C-q C-j< RET 
C-M-\ to indent

यह नीचे xml उदाहरण से ऊपर इंडेंट करेगा


  
    
      
      
    
  

वीआईएम में आप इसे कर सकते हैं

:set ft=xml
:%s/>\s*\r

उम्मीद है की यह मदद करेगा।

0
जोड़ा

यदि आप spacemacs का उपयोग करते हैं, तो बस 'spacemacs/indent-region-or-buffer' कमांड का उपयोग करें।

M-x spacemacs/indent-region-or-buffer
0
जोड़ा

2017 emacs के रूप में पहले से ही इस क्षमता के साथ डिफ़ॉल्ट रूप से आता है, लेकिन आपको इस छोटे से फ़ंक्शन को अपने ~/.emacs.d/init.el में लिखना होगा:

(require 'sgml-mode)

(defun reformat-xml ()
  (interactive)
  (save-excursion
    (sgml-pretty-print (point-min) (point-max))
    (indent-region (point-min) (point-max))))

then just call M-x reformat-xml

source: https://davidcapello.com/blog/emacs/reformat-xml-on-emacs/

0
जोड़ा