ইম্যাক্সে এক্সটিএমএল ফাইলগুলি প্রিন্টিং


84

আমি আমার এক্সএমএল ফাইলগুলি (এনএক্সএমএল-মোড) সম্পাদনা করতে ইম্যাক্স ব্যবহার করি এবং মেশিন দ্বারা ফাইলগুলি তৈরি করা হয়েছিল তার ট্যাগগুলির কোনও সুন্দর বিন্যাস নেই।

আমি ইন্ডেন্টেশন সহ পুরো ফাইলটি মুদ্রণের জন্য এবং এটি সংরক্ষণ করে সন্ধান করেছি, তবে একটি স্বয়ংক্রিয় উপায় খুঁজে পাচ্ছিলাম না।

কোন উপায় আছে? অথবা লিনাক্সের কমপক্ষে কিছু সম্পাদক এটি করতে পারেন।

উত্তর:


25

আমি ব্যবহার nXML মোড সম্পাদনা এবং জন্য পরিপাটি যখন আমি বিন্যাস এবং ইন্ডেন্ট এক্সএমএল বা HTML করতে চাই। পরিপাটি করার জন্য একটি ইমাস ইন্টারফেসও রয়েছে।


2013 tidy.el সংস্করণ শেষের: 20111222,1756 সঙ্গে এ গিয়ে Emacs 24 চালানো ব্যর্থ হয়wrong type argument: stringp, nil
keiw

@ কেইউ সম্ভবত এটি কারণ আপনি এটি বাফারে করছেন যা কোনও ফাইলের নাম নেই। একই ত্রুটি পেয়েছি এবং এটি আমার পক্ষে কমপক্ষে এটির সন্ধান করেছে।
আলফ

110

এমনকি আপনার নিজের ফাংশনটি লেখার দরকার নেই - স্যাজএমএল-মোড (একটি জিএনইউ ইম্যাকস মডিউল) একটি বিল্ট ইন ইন প্রিন্টিং প্রিন্টিং রয়েছে (স্যাজএমএল-প্রিটি-প্রিন্ট ...) যা অঞ্চল সূচনা এবং শেষ যুক্তিগুলি গ্রহণ করে।

আপনি যদি এক্সএমএল কেটে পেস্ট করছেন এবং আপনি দেখতে পান যে আপনার টার্মিনালটি নির্বিচারে জায়গায় লাইনগুলি কাটাচ্ছে আপনি এই সুন্দর প্রিন্টারটি ব্যবহার করতে পারেন যা প্রথমে ভাঙা রেখাগুলি ঠিক করে।


4
(এস.জি.এম.এল. প্রিটি-প্রিন্ট (অঞ্চল-সূচনা) (অঞ্চল-সমাপ্তি))
স্কুটিপফ

7
sgml-modeসময়ের সাথে কীভাবে পরিবর্তন হতে পারে তা আমি নিশ্চিত নই । আজকে আমি প্রার্থনা C-x C-f foo.xml, M-x sgml-modeতারপর, M-x sgml-pretty-printএবং আমার XML ফাইল চমত্কার মুদ্রিত হয়। (ঠিক আছে, ইম্যাকস শেষ হওয়ার আগে বিশ সেকেন্ড বা তারও বেশি সময় ধরে ফাঁসি দেওয়া হয়েছিল the এটি প্রিন্ট করার আগে একটি লাইন ফাইল এবং পরে 720 লাইনের পরে ছিল))
ড্যাভলওয়াল

4
আসলে, C-x gঅঞ্চল হিসাবে পুরো বাফারটি নির্বাচন করতে আমাকেও করতে হয়েছিল ।
ডেভেলল

4
আমাকে এস.জি.এম.এল. মোডে স্যুইচও করতে হয়নি। এটি এনএক্সএমএল মোডে একটি এমএক্স কমান্ড ছিল!
nroose

4
ইমাস 26.2 ব্যবহার করে, আমি এনএক্সএমএল মোডে থাকতে পারি, পুরো বাফারটি নির্বাচন করতে পারি C-x hএবং তারপরে M-x sgml-pretty-print। এক্সএমএল এখন বেশ ফর্ম্যাট হবে
সুইডেনগিন

87

আপনার যদি নতুন কোনও লাইন-ব্রেক চালু না করে কেবল সুন্দর ইনডেন্টিংয়ের প্রয়োজন হয় তবে আপনি 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") (setq end (1+ end)))
    (indent-region begin end))
  (message "Ah, much better!"))

এটি পরিপাখির মতো বাহ্যিক সরঞ্জামের উপর নির্ভর করে না।


4
ধন্যবাদ, ভাল। উপরের প্রিটি-প্রিন্ট ডিফুন থেকে (এনএক্সএমএল-মোড) অপসারণ করলে এটি এমএএমএস 22.2.1 এ অন্তর্নির্মিত স্যাজএমএল-মোডে কাজ করতে দেয়। তবে আমি এটি পুরো বাফার (পয়েন্ট-মিনিট) থেকে (পয়েন্ট-সর্বাধিক) করতে সংশোধন করেছি কারণ এটি আমার মূল জিনিস। এছাড়াও, একটি ত্রুটি: আপনি যে প্রতিটি নিউলাইন সন্নিবেশ করিয়েছেন, তার জন্য আপনার বৃদ্ধি শেষ হওয়া দরকার।
চিজো

আমি এই ফাংশনটি ইম্যাক্সে কীভাবে ব্যবহার করতে পারি? আমি স্ক্র্যাচ বাফারে ফাংশন কোডটি অনুলিপি করে পেষ্ট করেছি এবং এটি মূল্যায়ন করেছি। এখন, আমি এই ফাংশনটি কীভাবে প্রার্থনা করব?
আলেকজান্দ্রে রেকমেকার

4
ডিফুনটি মূল্যায়ন করার পরে, আপনি এটিকে অন্য কোনও ফাংশনের মতোই ডাকতে পারেন: এমএক্স বিএফ-প্রিটি-প্রিন্ট-এক্সএমএল-অঞ্চল। (আপনাকে অবশ্যই এটি সমস্ত টাইপ করতে হবে না: অবশ্যই ট্যাব সমাপ্তি ব্যবহার করুন: এমএক্স বিএফ <ট্যাব> যথেষ্ট হওয়া উচিত)) আপনি সম্ভবত প্রতিটি বার এটি ব্যবহার করতে চাইলে ফাংশনটি সংজ্ঞায়িত করতে চান না, তাই এটি অন্য কোথাও রেখে দিন যেখানে এটি প্রারম্ভকালে লোড করা হয়, যেমন ~ / .emacs.d / init.el
ক্রিশ্চিয়ান বার্গ

4
দীর্ঘ বৈশিষ্ট্য তালিকা ভাঙ্গার সম্পর্কে কীভাবে?
সিলিং

এটি চমত্কার, কারণ পরিপাটি অবৈধ চরিত্রের এনকোডিংগুলি সম্পর্কে অভিযোগ করে এবং ফাইলটি পুনরায় ফর্ম্যাট করার আগে আমাকে সেগুলি পরিষ্কার করতে চায় ! কখনও কখনও বিন্দুটি হল একটি ভাঙা এক্সএমএল ফাইলের কাঠামো দেখতে এবং পরিপাটি সাহায্য করতে অস্বীকার করবে।
টাউপান

35

এমাক্স এম- এর সাহায্যে নির্বিচার কমান্ড চালাতে পারে। আপনার যদি এক্সমিলিন্ট ইনস্টল থাকে:

"এম- | এক্সমিলিন্ট - ফর্ম্যাট -" নির্বাচিত অঞ্চলটি ফর্ম্যাট করবে

"কিউ এম- | এক্সমিলিন্ট - ফর্ম্যাট -" একই কাজ করবে, অঞ্চলটিকে আউটপুট দিয়ে প্রতিস্থাপন করবে


পুরো বাফার সামগ্রীটি প্রক্রিয়া করার জন্য অঞ্চল হিসাবে চিহ্নিত করতে সামনে Mx চিহ্ন-পুরো-বাফার ব্যবহার করুন।
হ্যারাল্ড

19

উপরের টিম হেলমেস্টেটকে ধন্যবাদ আমি এইভাবে তৈরি করেছি:

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

দ্রুত এবং সহজ অনেক ধন্যবাদ.


4
এটি আমাকে জিএনইউ ইমাকস 24-এ একটি ত্রুটি দিয়েছে, তাই আমি শেষ লাইনটি এতে পরিবর্তন করেছি:(indent-region 0 (count-lines (point-min) (point-max)))
জন জে ক্যামিলারি

19

লাইনের বিরতি প্রবর্তনের জন্য এবং তারপরে সুন্দর মুদ্রণের জন্য

M-x sgml-mode
M-x sgml-pretty-print

8

বেনিয়ামিন ফেরারির সংস্করণে আমি কয়েকটি টুইট করেছি:

  • এতে search-forward-regexpএকটি প্রান্ত নির্দিষ্ট করা হয়নি, সুতরাং এটি অঞ্চল থেকে শুরু করে বাফারের শেষে (অঞ্চলের শেষের পরিবর্তে) স্টাফগুলিতে চলবে
  • এখন endযথাযথভাবে ইনক্রিমেন্ট , যেমন চিসো উল্লেখ করেছে।
  • এটির মধ্যে একটি বিরতি প্রবেশ করানো হবে <tag></tag>, যা এর মান পরিবর্তন করে। হ্যাঁ, প্রযুক্তিগতভাবে আমরা এখানে সমস্ত কিছুর মান পরিবর্তন করছি, তবে একটি খালি শুরু / শেষ উল্লেখযোগ্য হওয়ার সম্ভাবনা বেশি। এটি এড়াতে এখন দুটি পৃথক, কিছুটা আরও কঠোর অনুসন্ধান ব্যবহার করে।

এখনও "বাহ্যিক পরিশ্রমের উপর নির্ভর করে না" ইত্যাদি রয়েছে তবে যাইহোক, এর clজন্য incfম্যাক্রোর প্রয়োজন হয় না ।

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 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 <foo><foo> or </foo><foo>, but not <foo></foo>
    (while (search-forward-regexp ">[ \t]*<[^/]" end t)
      (backward-char 2) (insert "\n") (incf end))
    ;; split <foo/></foo> and </foo></foo>
    (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!"))

5

করার একটি উপায় হ'ল যদি নীচের বিন্যাসে আপনার কিছু থাকে

<abc>     <abc><abc>   <abc></abc> </abc></abc>       </abc>

ইমাসে, চেষ্টা করুন

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

এটি নীচে XML উদাহরণের উপরে ইন্ডেন্ট করবে

<abc>
  <abc>
    <abc>
      <abc>
      </abc>
    </abc>
  </abc>
</abc>

ভিআইএম-এ আপনি এটি করতে পারেন

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

আশাকরি এটা সাহায্য করবে.


2
  1. ইমাসস এনএক্সএমএল-মোড উপস্থাপিত ফর্ম্যাটটিতে কাজ করতে পারে তবে আপনাকে লাইনগুলি বিভক্ত করতে হবে।
  2. দীর্ঘতর ফাইলের জন্য যা কেবল এটি মূল্যবান নয়। একটি দুর্দান্ত সুন্দর মুদ্রণ পেতে দীর্ঘতর ফাইলগুলির বিরুদ্ধে এই স্টাইলশিটটি (আদর্শভাবে স্যাকসনের সাথে যা আইএমএইচও ডানদিকে লাইন ইনডেন্ট পায়) চালান। যে কোনও উপাদানগুলিতে আপনি সাদা স্থান ধরে রাখতে চান সেখানে 'প্রোগ্রামলিস্টিং ইলিটনেম'-এর মতো' প্রোগ্রামলিস্টিং'-এর পাশাপাশি তাদের নাম যুক্ত করুন For

এইচটিএইচ


2

আমি জেসন ভাইয়ার্স সংস্করণ নিয়েছি এবং তাদের নিজস্ব লাইনে এক্সএমএনএলস ঘোষণা রাখতে যুক্তি যুক্ত করেছি। এটি ধরে নিয়েছে যে আপনার 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 <foo><bar> or </foo><bar>, but not <foo></foo>
    (goto-char begin)
    (while (search-forward-regexp ">[ \t]*<[^/]" end t)
      (backward-char 2) (insert "\n") (incf end))
    ;; split <foo/></foo> and </foo></foo>
    (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!"))

1

পরিপাটি দেখতে বেশ ভাল মোডের মতো। এটি অবশ্যই দেখুন। আমার যদি এটি প্রস্তাবিত সমস্ত বৈশিষ্ট্যগুলির সত্যই প্রয়োজন হয় তবে এটি ব্যবহার করবে।

যাইহোক, এই সমস্যাটি আমাকে প্রায় এক সপ্তাহ ধরে অনড় করেছিল এবং আমি সঠিকভাবে অনুসন্ধান করছিলাম না। পোস্ট করার পরে, আমি অনুসন্ধান শুরু করেছি এবং একটি এলিজপ ফাংশন সহ একটি সাইট পেয়েছি যা এটি বেশ ভাল করে। লেখক পরিপাটি ব্যবহারের পরামর্শও দিয়েছেন।

উত্তরের জন্য ধন্যবাদ মার্সেল (খুব খারাপ আমার আপনাকে আপডম করার পর্যাপ্ত পয়েন্ট নেই)

শীঘ্রই এটি আমার ব্লগে পোস্ট করবে। এটি সম্পর্কে একটি পোস্ট এখানে (মার্সেলের সাইটের লিঙ্ক সহ)।


1

আমি এক্সএমএল-পার্স.এলxml-reformat-tags থেকে ব্যবহার করি । সাধারণত আপনি এই কমান্ডটি চালানোর সময় ফাইলের শুরুতে পয়েন্টটি রাখতে চান।

এটি আকর্ষণীয় যে ফাইলটি ইমাসস্পিকের সাথে সংযুক্ত করা হয়েছে । যখন আমি দিনের পর দিন Emacspeak ব্যবহার করছিলাম তখন আমি ভেবেছিলাম xml-reformat-tagsএকটি ইমাকস অন্তর্নির্মিত । একদিন আমি এটি হারিয়ে ফেলেছিলাম এবং তার জন্য একটি ইন্টারনেট অনুসন্ধান করতে হয়েছিল, এবং এভাবে উপরে উল্লিখিত উইকির পৃষ্ঠাতে প্রবেশ করলাম।

আমি এক্সএমএল-পার্স শুরু করতে আমার কোডও সংযুক্ত করছি। এটি ইমাস কোডের সেরা টুকরা কিনা তা নিশ্চিত নন তবে আমার পক্ষে কাজ করে বলে মনে হচ্ছে।

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

1

আপনি যদি স্পেসম্যাক ব্যবহার করেন তবে কেবল 'স্পেসম্যাকস / ইনডেন্ট-অঞ্চল-বা-বাফার' কমান্ডটি ব্যবহার করুন।

M-x spacemacs/indent-region-or-buffer

1

২০১ 2017 সালের হিসাবে ইমাস ইতিমধ্যে ডিফল্টরূপে এই ক্ষমতা নিয়ে আসে তবে আপনাকে এই সামান্য ফাংশনটি লিখতে হবে আপনার ~/.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))))

তারপর শুধু কল M-x reformat-xml

উত্স: https://davidcapello.com/blog/emacs/reformat-xml-on-emacs/


0

আমি ভয় করি যে আমি বেঞ্জামিন ফেরারি সংস্করণটি আরও ভাল পছন্দ করি। অভ্যন্তরীণ সুন্দর প্রিন্ট সর্বদা মানের পরে একটি নতুন লাইনে শেষ ট্যাগটি রাখে, ট্যাগ মানগুলিতে অযাচিত সিআর সন্নিবেশ করে।

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