कैसे सुंदर स्वरूप कोड (ऑटो-सम्मिलित newlines, इंडेंट, आदि)?


24

मैं उपयोग कर रहा हूं, spacemacsलेकिन संभवत: यह उस ज्ञान को खाली कर रहा है जो यहां आवश्यक है।

मेरे पास एक लंबी लाइन के साथ एक JSON फाइल है, मान लीजिए कि यह JSON json.org/example से है:

{"menu": {"id": "file", "value": "File", "popup": {"menuitem": [{"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"}]}}}

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

अगर मैं उपयोग spacemacs/indent-region-or-buffer( SPC j =) करता हूं तो टेक्स्ट बिल्कुल भी नहीं बदला जाता है।

मैं वास्तव में इस लंबी लाइन को तोड़ने के लिए emacs से कैसे पूछ सकता हूं और इस तरह से कुछ प्राप्त करने के लिए निर्भर करता है:

{"menu": {
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
}}

मुझे किसी JSON- विशिष्ट उत्तर में कोई दिलचस्पी नहीं है, उदाहरण के लिए, मुझे विश्वास है कि intelliJ किसी भी भाषा के लिए इसका समर्थन करता है (जावा, json ...)। मुझे लगता है कि यह किसी भी भाषा emacs के लिए प्राप्त करने के लिए एक प्रमुख विधा है, या चलो सबसे लोकप्रिय कहते हैं।

EDIT मैंने पाया M-x json-reformat-regionकि spacemacsजहाजों के साथ और काम करता है, लेकिन हां, मैं चाहूंगा कि किसी भी भाषा के लिए और हमेशा एक ही शॉर्टकट के साथ, प्रमुख उत्पादों पर आधारित ...

EDIT2 ठीक है तो मेरा निष्कर्ष यह है कि यह विभिन्न भाषाओं, JSON & lisp पर कम से कम, संभवतः दूसरों के लिए लागू किया गया है, और यह अभी और अधिक के लिए आसान होगा (XML / XHTML, गो-fmt है और क्लैंग का उपयोग करके भी)। हालांकि कोई सामान्य कार्य नाम नहीं है जो इसे सभी भाषाओं के लिए करेगा। spacemacsविभिन्न भाषाओं के लिए परतों में इसे लागू करने के लिए यहां जगह है ... मुझे हालांकि एक एक्स / एचटीएमएल कार्यान्वयन नहीं मिला, जो मुझे थोड़ा आश्चर्यचकित करता है।


3
HTML / जे एस / सीएसएस के लिए: web-beautiful.el। यह मैंने पाया सबसे अच्छा है, लेकिन यह नोड पर निर्भर करता है।
नानी

जवाबों:


10

ऐसा लगता है कि आपको fill-regionइंडेंटेशन से अधिक फ़ंक्शन की आवश्यकता है ।

  • उस लाइन का चयन करें और करें M-x fill-region
  • उसी का चयन करें, अब कई लाइनों में विभाजित करें, और करें M-x indent-region

हालांकि, आपके उदाहरण में दिखाए गए सटीक बिंदुओं पर नई लाइनें नहीं डाली जाएंगी। यह बस लाइन को भरण कॉलम में फिट कर देगा।


1
खैर, यह कुछ है। शायद जो मैं चाहता था, वह प्राप्त करने योग्य नहीं था। हो सकता है कि मैं थोड़ी देर प्रतीक्षा करूँ, अगर किसी के पास एक आक्रामक आक्रामक आक्रोश का जादुई समाधान है ... यदि और कुछ नहीं आता है तो मैं इसे उत्तर के रूप में चिह्नित करूँगा।
इमैनुएल टौजरी

@EmmanuelTouzery जब तक आप चाहते हैं, तब तक थोड़ी सी समय-सीमा के साथ प्राप्त किया जा सकता है, जब तक कि नई लाइन डालने के नियम संगत हैं। आपके स्वरूपित परिणाम के उदाहरण में, मैं देखता हूं कि आपके पास एक नई पंक्ति नहीं है {, {"menu":लेकिन आपके पास एक के बाद एक {है {"id":। मुझे JSON का पता नहीं है और इसलिए आपके प्रारूपित उत्तर में संभवतः एक पैटर्न है जो मुझे याद आ रहा है। लेकिन अगर आप उस नई लाइन को डालने के लिए नियमों के एक सेट के साथ अपने प्रश्न को अपडेट कर सकते हैं, तो कोई व्यक्ति आपके इच्छित उत्तर के साथ आ सकता है।
कौशल मोदी

मैंने सोचा था कि भाषा-विशिष्ट नियमों सहित किसी भी भाषा के लिए अस्तित्व में होगा। उदाहरण के लिए {जावा के लिए पहली पंक्ति पर, सी # के लिए अगली पंक्ति पर, मान लीजिए, और इसी तरह।
इमैनुएल टौज़री

(दूसरे शब्दों में, कुछ भी, gofmtलेकिन किसी भी भाषा के लिए जैसा ) - gofmt.com
इमैनुएल टौज़री

19

json.elपैकेज प्रदान करता है json-pretty-print-buffer। यह वह है जो आपके उदाहरण के लिए पैदा करता है:

{
  "menu": {
    "popup": {
      "menuitem": [
        {
          "onclick": "CreateNewDoc()",
          "value": "New"
        },
        {
          "onclick": "OpenDoc()",
          "value": "Open"
        },
        {
          "onclick": "CloseDoc()",
          "value": "Close"
        }
      ]
    },
    "value": "File",
    "id": "file"
  }
}

मेरे लिए बहुत सभ्य लगता है।


2
हां वास्तव में मैंने github.com/gongo/json-reformat पर देखा कि "Emacs 24.4 से, json-pretty-printऔर json-pretty-print-buffer(इसी तरह के विनिर्देशों json-reformat-region) बंडल किया गया था।"। लेकिन मुझे लगा कि emacs में एक फ़ंक्शन हो सकता है जो सभी भाषाओं (प्रत्येक लोकप्रिय प्रमुख मोड भाषा के लिए विशिष्ट) के लिए काम करेगा, जो इसे बाहर निकालता है, ऐसा नहीं करता है।
इमैनुएल टौजरी

यह सही उत्तर है
जो हेमिंग

6

यहाँ टिप के अनुसार , आप अपनी Json फ़ाइल में किसी क्षेत्र को प्रारूपित करने के लिए बाहरी कमांड का उपयोग कर सकते हैं:

(defun json-format ()
  (interactive)
  (save-excursion
    (shell-command-on-region (region-beginning)
                             (region-end)
                             "python -m json.tool"
                             (buffer-name)
                             t)))

आप पूरे बफर को प्रारूपित करने के लिए इसे आसानी से बढ़ा सकते हैं:

(defun json-format ()
  (interactive)
  (save-excursion
    (shell-command-on-region (point-min)
                             (point-max)
                             "python -m json.tool"
                             (buffer-name) t))) 

Emacs के पास प्रोग्रामिंग लैंग्वेज ( लिस्प को छोड़कर ) के लिए फ़ॉर्मेटिंग टूल नहीं है , केवल इंडेंटेशन कमांड्स हैं।


1
मुझे M-x json-reformat-regionलगता है कि spacemacsजहाजों के साथ और काम करता है, लेकिन हां, मैं चाहूंगा कि किसी भी भाषा के लिए और हमेशा एक ही शॉर्टकट के साथ, प्रमुख मोड पर आधारित ... ऐसा लगता है कि यह समर्थित नहीं है, बहुत बुरा है ...
इमैनुएल टाउज़री

1
किसी भाषा को ठीक से प्रारूपित करने के लिए, आपको एक वास्तविक भाषा पार्सर की आवश्यकता होती है। Emacs में कुछ भाषाओं के लिए अंतर्निहित भाषा पार्सर्स हैं, लेकिन हाल ही में निर्मित लिस्प पार्सर का उपयोग कोड सुधार के लिए किया जाता है, जैसा कि ऊपर दिए गए डेमो के लिंक के रूप में किया गया है। यदि बाहरी स्वरूप मौजूद हैं, तो Emacs के साथ एकीकृत करना आसान है clang-format
Tu Do

2

इस विशिष्ट परिदृश्य json-pretty-printके लिए json के हाइलाइट किए गए गांठ को पहले से दर्शाया जाएगा।


1

BTW, SMIE को उनके इंडेंटेशन इंजन के रूप में उपयोग करने वाले प्रमुख तरीकों के लिए, auto-fill-modeसमर्थन के रूप में आपके लिए इसके लिए आवश्यक कुछ हिस्सा है । मुझे लगता है कि कोई अच्छा काम नहीं करेगा fill-paragraphया fill-regionनहीं करेगा, लेकिन यदि आप अपना कोड एक ही लाइन पर रखते हैं, तो उस लाइन के अंत में जाएं और क्या M-: (smie-auto-fill)यह समझदार परिणाम देना चाहिए (शायद एक लंबे समय तक खिंचाव, सही नहीं)।

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