web-dev-qa-db-ja.com

emacsはHTMLの大きな塊を再インデントできますか?

EmacsでHTMLを編集するときに、マークアップのblobを自動的に整形して、次のように変更する方法はありますか。

  <table>
  <tr>
<td>blah</td></tr></table>

...これに:

<table>
 <tr>
  <td>
   blah
  </td>
 </tr>
</table>
66
raldi

デフォルトでは、Emacs(22または23)で.htmlファイルにアクセスすると、html-modeに移動します。それはおそらくあなたが望むものではありません。あなたはおそらくnxml-modeを欲しがっています。 nxml-modeはEmacs 23にのみ付属しているようですが、以前のバージョンのemacs用に nXML Webサイト からダウンロードできます。 nxml-modeという名前のDebianおよびUbuntuパッケージもあります。 nxml-modeは次のように入力できます。

M-x nxml-mode

Nxmlモードのドキュメントは次の方法で表示できます。

C-h i g (nxml-mode) RET

そうは言っても、xhtmlの例を再フォーマットするには、おそらく Tidy のようなものを使用する必要があります。 nxml-modeがあなたを

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head></head>
<body>
<table>
  <tr>
<td>blah</td></tr></table>
</body>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head></head>
  <body>
    <table>
      <tr>
    <td>blah</td></tr></table>
</body>
</html>

しかし、私はあなたが望むように特定のxmlタグで改行を行うためのより一般的な機能を見ていません。 C-jは適切なインデントで新しい行を挿入するため、簡単なマクロを実行したり、テーブルを実行するdefunをハックしたりできる場合があります。

28
jfm3

できるよ sgml-pretty-print その後 indent-for-tab同じ領域/バッファ上。ただし、htmlモードまたはnxmlモードの場合。

sgml-pretty-printは適切な場所に改行を追加し、indent-for-tabニースインデントを追加します。一緒にそれらは適切にフォーマットされたhtml/xmlにつながります。

95
vava

http://www.delorie.com/gnu/docs/emacs/emacs_277.html

修正したい領域を選択した後。 (バッファー全体を選択するには、C-x hを使用します)

C-M-q

括弧で囲まれた1つのグループ内のすべての行をインデントします(indent-sexp)。

C-M-\

リージョン内のすべての行をインデントします(indent-region)。

13
Jay

私はxmlに対してこれを行う関数を自分で作成しました。これはnxml-modeでうまく機能します。 HTMLでもかなりうまくいくはずです:

(defun jta-reformat-xml ()
  "Reformats xml to make it readable (respects current selection)."
  (interactive)
  (save-excursion
    (let ((beg (point-min))
          (end (point-max)))
      (if (and mark-active transient-mark-mode)
          (progn
            (setq beg (min (point) (mark)))
            (setq end (max (point) (mark))))
        (widen))
      (setq end (copy-marker end t))
      (goto-char beg)
      (while (re-search-forward ">\\s-*<" end t)
        (replace-match ">\n<" t t))
      (goto-char beg)
      (indent-region beg end nil))))
10
jtahlborn

あなたは正規表現を置き換えることができます

 M-x replace-regexp

 \(</[^>]+>\)

 \1C-q-j

バッファ全体をインデントする

 C-x h
 M-x indent-region
8
nevcx

この質問はかなり古いですが、私はさまざまな答えに本当に満足していませんでした。比較的新しいバージョンのemacs(私は24.4.1を実行しています)を実行している場合、HTMLファイルを再インデントする簡単な方法は次のとおりです。

  • emacsでファイルを開く
  • ファイル全体をC-x hでマークします(注:マークされているものを確認したい場合は、(setq transient-mark-mode t).emacsファイルに追加してください)
  • 実行M-x indent-region

この方法の良い点は、プラグインが不要(Conwayの提案)、正規表現の置換(nevcxの提案)も、モードの切り替え(jfm3の提案)も必要ないことです。ジェイの提案は正しい方向にあります。通常、C-M-qを実行すると、モードのルールに従ってインデントされます。たとえば、C-M-qは、私の経験ではjs-modeや他のいくつかのモードで機能します。ただし、html-modenxml-modeC-M-qを実装していないようです。

7
abhillman

現在ソースから構築しているemacs 25では、HTMLモードであると仮定して、
Ctrl-x
h

すべてを選択してから、 Tab

6
Aaron Hall

Tidy はあなたが望むことを行うことができますが、バッファ全体に対してのみ可能です(そして結果はXHTMLです)

M-x tidy-buffer
6
Chris Conway

次のコマンドを使用して、地域をxmllint(ある場合)にパイプできます。

M-|
Shell command on region: xmllint --format -

結果は、新しいバッファになります。

私はこれをXMLで行い、それは機能しますが、xmllintはHTMLまたはその他の不完全なXMLで機能するために特定の他のオプションが必要だと思います。 nxml-modeは、整形式のドキュメントがあるかどうかを通知します。

4
Geoff

これを行う最も簡単な方法は、コマンドラインを使用することです。

  • きちんとインストールされていることを確認してください
  • タイプtidy -i -m <<file_name>>

-mオプションは、新しく整理されたファイルを古いファイルに置き換えます。それが必要ない場合は、tidy -i -o <<tidied_file_name>> <<untidied_file_name>>と入力できます

-iはインデント用です。または、次のような設定を持つ.tidyrcファイルを作成できます。

indent: auto
indent-spaces: 2
wrap: 72
markup: yes
output-xml: no
input-xml: no
show-warnings: yes
numeric-entities: yes
quote-marks: yes
quote-nbsp: yes
quote-ampersand: no
break-before-br: no
uppercase-tags: no
uppercase-attributes: no

このようにすれば、tidy -o <<tidied_file_name>> <<untidied_file_name>>と入力するだけです。

詳細については、コマンドラインでman tidyと入力してください。

0
user1454331