Bagaimana cara membuat / memformat buffer XML?

17

Saya punya file dengan xml semua dalam satu baris. Apakah fungsionalitas sudah ada untuk memformat ulang buffer ini agar terbaca oleh pengguna?

wdkrnls
sumber
4
FWIW pertanyaan ini ditanyakan pada stackoverflow: stackoverflow.com/questions/12492/…
YoungFrog

Jawaban:

24

Apakah fungsionalitas sudah ada untuk memformat ulang buffer ini agar terbaca oleh pengguna?

Tentu saja, dan Anda punya banyak pilihan. Saya mungkin akan memasukkannya ke program eksternal menggunakan:

C-x h C-u M-| xmllint --format - RET

Program ini dilengkapi dengan libxml2. Anda juga bisa menggunakannya tidy. Berikut daftar alat pemformatan xml commandline: /programming/16090869/how-to-pretty-print-xml-from-the-command-line

Anda juga bisa melakukan pencarian dan ganti lalu indentasi:

M-% > < RET > C-q C-j < RET ! C-M-\

Trik rapi: Anda dapat menyalin dan menempelkan string di atas ke M-:( eval-expression) seperti ini:

(execute-kbd-macro (kbd "M-% > < RET > C-q C-j < RET ! C-M-\\"))
pengasuh
sumber
Jawaban yang bagus, tetapi berhati-hatilah karena perintah seperti yang ditulis sekarang akan menggantikan konten buffer dengan output dari perintah shell. Ini karena C-uawalan.
Fredrik Husman
3
Jawaban berarti emacs tidak dapat melakukannya.
Sergey Kostrukov
13

Built-in yang sgml-modememiliki perintah untuk melakukan hal ini: sgml-pretty-print. Jika Anda berada di nxml-modedalamnya sepertinya Anda perlu beralih ke yang sgml-modepertama. Anda bisa menulis perintah untuk sementara beralih ke mode sgml, menjalankan pretty-print, lalu beralih kembali ke mode nxml.

Sebagai contoh, berikut adalah perintah yang akan cukup mencetak wilayah, opsional dengan pengisian otomatis diaktifkan:

(defun xml-pretty-print (beg end &optional arg)
  "Reformat the region between BEG and END.
    With optional ARG, also auto-fill."
  (interactive "*r\nP")
  (let ((fill (or (bound-and-true-p auto-fill-function) -1)))
    (sgml-mode)
    (when arg (auto-fill-mode))
    (sgml-pretty-print beg end)
    (nxml-mode)
    (auto-fill-mode fill)))
glukas
sumber
7

tulis ini ke Anda ~/.emacs.d/init.el:

(require 'sgml-mode)

(defun ninrod/reformat-xml ()
  (interactive)
  (save-excursion
    (sgml-pretty-print (point-min) (point-max))
    (indent-region (point-min) (point-max))))

muat ulang emacs, lalu panggil M-x reformat-xmlbuffer xml yang diformat dengan buruk.

sumber: https://davidcapello.com/blog/emacs/reformat-xml-on-emacs/

ninrod
sumber
0

Mengikuti petunjuk dari jawaban di atas, dan dengan asumsi Anda telah tidymenginstal variasi dapat menjadi:

`C-x h M-| tidy -quiet -xml -utf8 -indent -`

Ini akan membuka buffer baru *Shell Command Output*alih-alih secara langsung mengganti konten buffer. Setelah memeriksa hasilnya, ganti konten lama dengan yang baru dengan:

C-x h M-insert-buffer

pilih default yang disarankan yang mungkin akan menjadi *Shell Command Output*. Anda dapat menyimpan perintah untuk nanti dengan keyboard makro:

C-x ( C-x h M-| tidy -quiet -xml -utf8 -indent - C-x)
C-x C-k n pretty-xml

Dengan ini, Anda dapat menjalankan M-x pretty-xmluntuk memformat ulang buffer.

Fredrik Husman
sumber
0

Tandai xml Anda dan lakukan:

M-x sgml-pretty-print

Atau jalankan saja perintah tanpa daerah yang ditandai untuk membasahi seluruh buffer.

draxil
sumber