কীভাবে চমত্কার-ফর্ম্যাট কোড (স্বয়ংক্রিয়ভাবে সন্নিবেশ করা নিউলাইনগুলি, ইনডেন্ট ইত্যাদি)?


24

আমি ব্যবহার করছি spacemacsতবে সম্ভবত এটি ইমাস জ্ঞান যা এখানে প্রয়োজনীয়।

আমার একটি একক দীর্ঘ লাইনযুক্ত একটি জেএসওএন ফাইল রয়েছে, আসুন এই জাসনটি 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 =) ব্যবহার করি তবে পাঠ্যটি একেবারেই পরিবর্তিত হবে না।

আমি কীভাবে ইম্যাক্স থেকে এই দীর্ঘ লাইনটি ভাঙতে এবং এর মতো কিছু পাওয়ার জন্য পুনরায় পাঠাতে চাইতে পারি:

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

আমি কোনও জেএসএন-নির্দিষ্ট উত্তরের বিষয়ে আগ্রহী নই, উদাহরণস্বরূপ আমি বিশ্বাস করি যে ইন্টেলিজ এটি যে কোনও ভাষার পক্ষে সমর্থন করে (জাভা, জসন ...)। আমি মনে করি এটি যে কোনও ভাষার ইম্যাকের পক্ষে অর্জনযোগ্য for তবে এর জন্য সবচেয়ে জনপ্রিয় ভাষাটি বলা যাক let's

সম্পাদনা করে আমি M-x json-reformat-regionসেই spacemacsজাহাজগুলি আবিষ্কার করে এবং কাজ করে, তবে হ্যাঁ, আমি যে কোনও ভাষার জন্য এবং সর্বদা একই শর্টকাট সহ প্রধান মোডের উপর ভিত্তি করে তা চাই ...

EDIT2 ঠিক আছে তাই আমার উপসংহারে এটিকে বিভিন্ন ভাষায়, JSON এবং কমপক্ষে, সম্ভবত অন্যদের জন্য প্রয়োগ করা হয়েছে এবং এটি আরও বেশি (এক্সএমএল / এক্সএইচটিএমএল, যা গো-এফএমটি আছে এবং ঝনঝন ব্যবহার করা) সহজ হবে। তবে এমন কোনও জেনেরিক ফাংশন নাম নেই যা সমস্ত ভাষার জন্য এটি করবে। spacemacsবিভিন্ন ভাষার জন্য এটি স্তরগুলিতে প্রয়োগের জন্য এখানে জায়গা রয়েছে ... আমি কোনও এক্স / এইচটিএমএল বাস্তবায়ন পাইনি, যা আমাকে খানিকটা অবাক করে দেয়।


3
এইচটিএমএল / জেএস / CSS এর জন্য: web-beautiful.el। এটি আমি খুঁজে পেয়েছি সেরা, তবে এটি node.js. এর উপর নির্ভর করে
বৃদ্ধা

উত্তর:


10

দেখে মনে হচ্ছে fill-regionইন্ডেন্টেশনের চেয়ে আপনার ফাংশনটি বেশি প্রয়োজন ।

  • সেই লাইনটি নির্বাচন করুন এবং করুন M-x fill-region
  • একইটি নির্বাচন করুন, এখন একাধিক লাইনে বিভক্ত করুন এবং করুন M-x indent-region

এটি, যদিও, আপনার উদাহরণে দেখানো ঠিক পয়েন্টগুলিতে নতুন লাইন প্রবেশ করবে না। এটি কেবল ভরাট কলামগুলিতে লাইনটিকে ফিট করবে।


1
ভাল, এটা কিছু। আমি যা চেয়েছিলাম তা কোনওভাবেই অর্জনযোগ্য ছিল না। স্মার্ট আক্রমণাত্মক ইনডেন্টেশনের জন্য কারও কাছে যাদুকরী সমাধান থাকলে আমি আরও কিছুক্ষণ অপেক্ষা করব ... অন্য কিছু না এলে আমি এটিকে উত্তর হিসাবে চিহ্নিত করব।
এমমানুয়েল টাজরি

@ এমমানুয়েলটউজরি আপনি যেটি চান তা যতক্ষণ না লাইন সন্নিবেশ করার নিয়মগুলি সামঞ্জস্য থাকে ততক্ষণ ক্ষুদ্র এলিস্পের সাথে অর্জনযোগ্য। ফরম্যাট ফলাফলের আপনার উদাহরণে, আমি দেখছি তোমরা পর একটি newline হবে না {{"menu":কিন্তু আপনি একের পর এক আছে {মধ্যে {"id":। আমি জেএসনকে জানি না এবং তাই আপনার ফর্ম্যাট করা উত্তরে সম্ভবত এমন একটি প্যাটার্ন রয়েছে যা আমি মিস করছি। তবে আপনি যদি সেই নতুন লাইন সন্নিবেশ করানোর জন্য নিয়মের একটি সেট দিয়ে আপনার প্রশ্নটি আপডেট করতে পারেন, তবে আপনার উত্তরটি দিয়ে কেউ আসতে পারেন।
দক্ষ মোদী

আমি ভেবেছিলাম ভাষা-নির্দিষ্ট বিধিগুলি সহ যে কোনও ভাষার জন্যই এটি বিদ্যমান ছিল। উদাহরণস্বরূপ - জাভা জন্য প্রথম লাইনে, C # এর পরের লাইনে বলা যাক এবং আরও কিছু।
এমমানুয়েল টাজরি

(অন্য কথায়, 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 এ দেখেছি যে " ইমাস 24.4 থেকে, json-pretty-printএবং json-pretty-print-buffer(অনুরূপ বৈশিষ্ট্যগুলি json-reformat-region) বান্ডিল হয়েছিল।" তবে আমি ভেবেছিলাম যে ইমাসের একটি ফাংশন থাকতে পারে যা সমস্ত ভাষার জন্য কাজ করবে (প্রতিটি জনপ্রিয় প্রধান মোড ভাষার জন্য নির্দিষ্ট), এটি যেমনটি দেখা যাচ্ছে, তা নয়।
ইমানুয়েল টুজারি

এটি সঠিক উত্তর
জো হেইমিং

6

এখানে টিপ অনুসারে , আপনি আপনার জসন ফাইলে একটি অঞ্চল ফর্ম্যাট করতে বাহ্যিক কমান্ড ব্যবহার করতে পারেন:

(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))) 

ইমাক্সের প্রোগ্রামিং ভাষার ( লিস্প ব্যতীত ) বিন্যাসকরণ সরঞ্জাম নেই , কেবল ইনডেন্টেশন কমান্ড।


1
আমি আবিষ্কার M-x json-reformat-regionযে spacemacsও কাজ দিয়ে জাহাজ, তবে হ্যাঁ, আমি চাই যে কোন ভাষায় এবং সবসময় একই শর্টকাট, প্রধান মোড উপর ভিত্তি করে দিয়ে ... মনে হচ্ছে যে এই সমর্থিত নয়, খুব খারাপ ...
এমানুয়েল Touzery

1
কোনও ভাষা সঠিকভাবে ফর্ম্যাট করতে আপনার একটি প্রকৃত ভাষা পার্সার প্রয়োজন। ইমাক্স কিছু ভাষার জন্য অন্তর্নির্মিত ভাষার পার্সার রয়েছে তবে উপরের ডেমোটির লিঙ্ক হিসাবে সম্প্রতি কেবল বিল্ট-ইন লিস্প পার্সার কোড পুনর্নির্মাণের জন্য ব্যবহৃত হয়েছে। যদি বাইরের formatters বিদ্যমান, এটা এ গিয়ে Emacs অর্থাত সাথে সংহত করা সহজ clang-format
তু

2

এই নির্দিষ্ট দৃশ্যের জন্য json-pretty-printজসন হাইলাইটেড লম্পটকে প্রিটিটিফাই করবে।


1

বিটিডাব্লু, এসএমআইইকে তাদের ইনডেন্টেশন ইঞ্জিন হিসাবে ব্যবহার করার জন্য মোডের মোডগুলির জন্য, auto-fill-modeসমর্থন আকারে আপনার যা প্রয়োজন তা কিছু অংশ রয়েছে । আমি মনে করি fill-paragraphবা fill-regionএকটি ভাল কাজ করবে না, তবে আপনি যদি নিজের কোডটি একটি লাইনে রেখে দেন, তবে সেই লাইনের শেষ প্রান্তে যান এবং M-: (smie-auto-fill)এটির বুদ্ধিমান ফলাফল দেওয়া উচিত (সম্ভবত দীর্ঘ দীর্ঘায়িত দ্বারা নিখুঁত নয়)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.