質問

私は emacs を使用して XML ファイル (nxml モード) を編集していますが、マシンによって生成されたファイルにはタグの整形がありません。

ファイル全体をインデントしてきれいに印刷して保存する方法を検索しましたが、自動的な方法を見つけることができませんでした。

方法はありますか?または、少なくともそれを実行できる Linux 上のエディター。

役に立ちましたか?

解決

私が使う nXMLモード 編集用と きちんとした XML または HTML をフォーマットしてインデントしたい場合。もあります Tidy への Emacs インターフェース。

他のヒント

独自の関数を記述する必要さえありません。sgml-mode (gnu emacs コア モジュール) には、領域の開始引数と終了引数を受け取る (sgml-pretty-print ...) と呼ばれる組み込みのきれいな印刷関数があります。

XMLをカットアンドペーストしていて、ターミナルが任意の場所で行を切断していることに気付いた場合は、これを使用できます かわいいプリンター これにより、最初に破線が修正されます。

新しい改行を導入せずに適切なインデントのみが必要な場合は、次のように適用できます。 indent-region 次のキーストロークでバッファ全体にコマンドを実行します。

C-x h
C-M-\

開始タグと終了タグが別々の行になるように改行を導入する必要がある場合は、次の非常に優れた elisp 関数を使用できます。 ベンジャミン・フェラーリ. 。彼のブログで見つけたので、ここに転載させていただいても大丈夫だと思います。

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

これは Tidy のような外部ツールに依存しません。

Emacs は M-| で任意のコマンドを実行できます。xmlint がインストールされている場合:

「M-| xmllint --format -」は選択した領域をフォーマットします

「C-u M-| xmllint --format -」も同様に実行され、リージョンが出力に置き換えられます。

上記の Tim Helmstedt のおかげで、私は次のように st を作成しました。

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

早くて簡単。どうもありがとう。

改行を導入してきれいに印刷する場合

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

ここでは、Benjamin Ferrari のバージョンに私が加えたいくつかの微調整を示します。

  • search-forward-regexp 終了を指定しなかったため、(領域の終わりではなく) 領域の始まりからバッファの終わりまでの内容が処理されます。
  • 増分するようになりました end Cheesoが指摘したように、正しく。
  • 間にブレークを挿入します <tag></tag>, 、値を変更します。はい、技術的にはここですべての値を変更していますが、空の開始/終了の方が重要である可能性が高くなります。これを回避するために、2 つの別々の、少し厳密な検索を使用するようになりました。

「外部の整理整頓に頼らない」などはまだあります。ただし、必要なのは 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!"))

1つの方法は、以下の形式で何かがある場合です

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

Emacs で試してください

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>

VIM では、次のようにしてこれを行うことができます

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

お役に立てれば。

  1. Emacs nxml-mode は提示された形式で動作しますが、行を分割する必要があります。
  2. 長いファイルの場合、それだけの価値はありません。このスタイルシート(理想的にはサクソンを使用して、iMhoが正しいラインインデントを取得します)を長いファイルに対して実行して、素敵なプリントを取得します。ホワイトスペースを保持したい要素の場合、「YourElementNameを掲載するプログラム」のように、「プログラムのように」「プログラム」と一緒に名前を追加します

HTH

私が取った ジェイソン・ヴィアーズのバージョン また、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 <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 つ見つけました。 elisp関数 それはかなり良いことです。著者はTidyの使用も推奨しています。

答えてくれてありがとう、マルセル (残念ながらアップグレードするのに十分なポイントがありません).

それについては近いうちに私のブログに投稿します。 がここにあります それについて投稿する (マルセルのサイトへのリンク付き)。

私が使う xml-reformat-tags から xml-parse.el. 。通常、このコマンドを実行するときは、ファイルの先頭にポイントを置く必要があります。

ファイルが組み込まれているのは興味深いです Emacspeak. 。Emacspeak を日常的に使っていたとき、私はこう思いました。 xml-reformat-tags Emacs の組み込みです。ある日、私はそれを紛失してしまい、インターネットで検索しなければならなくなり、上記の wiki ページにアクセスしました。

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

使用する場合 スペースマック, 、コマンド「spacemacs/indent-region-or-buffer」を使用するだけです。

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

残念ながら、私はベンジャミン・フェラーリ版の方がずっと好きです。内部プリティ プリントは常に値の後の新しい行に終了タグを配置し、タグ値に不要な CR を挿入します。

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

それから電話するだけです M-x reformat-xml

ソース: https://davidcapello.com/blog/emacs/reformat-xml-on-emacs/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top