EmacsでHTMLを編集するときに、マークアップのblobを自動的に整形して、次のように変更する方法はありますか。
<table>
<tr>
<td>blah</td></tr></table>
...これに:
<table>
<tr>
<td>
blah
</td>
</tr>
</table>
デフォルトでは、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
をハックしたりできる場合があります。
できるよ sgml-pretty-print
その後 indent-for-tab
同じ領域/バッファ上。ただし、htmlモードまたはnxmlモードの場合。
sgml-pretty-print
は適切な場所に改行を追加し、indent-for-tab
ニースインデントを追加します。一緒にそれらは適切にフォーマットされたhtml/xmlにつながります。
http://www.delorie.com/gnu/docs/emacs/emacs_277.html
修正したい領域を選択した後。 (バッファー全体を選択するには、C-x hを使用します)
C-M-q
括弧で囲まれた1つのグループ内のすべての行をインデントします(indent-sexp)。
C-M-\
リージョン内のすべての行をインデントします(indent-region)。
私は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))))
あなたは正規表現を置き換えることができます
M-x replace-regexp
\(</[^>]+>\)
\1C-q-j
バッファ全体をインデントする
C-x h
M-x indent-region
この質問はかなり古いですが、私はさまざまな答えに本当に満足していませんでした。比較的新しいバージョンのemacs(私は24.4.1を実行しています)を実行している場合、HTMLファイルを再インデントする簡単な方法は次のとおりです。
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-mode
もnxml-mode
もC-M-q
を実装していないようです。
現在ソースから構築しているemacs 25では、HTMLモードであると仮定して、
Ctrl-x
h
すべてを選択してから、 Tab。
Tidy はあなたが望むことを行うことができますが、バッファ全体に対してのみ可能です(そして結果はXHTMLです)
M-x tidy-buffer
次のコマンドを使用して、地域をxmllint(ある場合)にパイプできます。
M-|
Shell command on region: xmllint --format -
結果は、新しいバッファになります。
私はこれをXMLで行い、それは機能しますが、xmllintはHTMLまたはその他の不完全なXMLで機能するために特定の他のオプションが必要だと思います。 nxml-modeは、整形式のドキュメントがあるかどうかを通知します。
これを行う最も簡単な方法は、コマンドラインを使用することです。
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
と入力してください。