Как правильно отформатировать файл схемы XML в режиме emacs XML?

Я хочу автоматически форматировать файл определения схемы XML. Все обычные красивые печатные вещи: перенос строки после конечного элемента, отступы. Я видел этот ответ и this elisp, который дает мне основы. Однако помимо того, что там есть, я хотел бы, чтобы между атрибутами в угловых скобках был разрыв строки.

Вот так. До:

<s:schema elementFormDefault="qualified" targetNamespace="urn:Cheeso.2009.05.Finance/TransferObject/TransactionDetail/" xmlns:tns="urn:Cheeso.2009.05.Finance/TransferObject/TransactionDetail/"  xmlns:detail="urn:Cheeso.2009.05.Finance/TransferObject/TransactionDetail/"  xmlns:to="urn:Cheeso.2009.05.Finance/TransferObject/"  xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:address="urn:Cheeso.2009.05.Finance/TransferObject/Address/" xmlns:caller="urn:Cheeso.2009.05.Finance/TransferObject/Caller/" xmlns:gwy="urn:Cheeso.2009.05.Finance/TransferObject/Gateway/" xmlns:tender="urn:Cheeso.2009.05.Finance/TransferObject/Tender/"  >
 ...
</s:schema>

После:

<s:schema
    elementFormDefault = "qualified"
    targetNamespace    = "urn:Cheeso.2009.05.Finance/TransferObject/TransactionDetail/"
    xmlns:tns          = "urn:Cheeso.2009.05.Finance/TransferObject/TransactionDetail/"
    xmlns:detail       = "urn:Cheeso.2009.05.Finance/TransferObject/TransactionDetail/"
    xmlns:to           = "urn:Cheeso.2009.05.Finance/TransferObject/"
    xmlns:s            = "http://www.w3.org/2001/XMLSchema"
    xmlns:address      = "urn:Cheeso.2009.05.Finance/TransferObject/Address/"
    xmlns:caller       = "urn:Cheeso.2009.05.Finance/TransferObject/Caller/"
    xmlns:gwy          = "urn:Cheeso.2009.05.Finance/TransferObject/Gateway/"
    xmlns:tender       = "urn:Cheeso.2009.05.Finance/TransferObject/Tender/"  >
 ...
</s:schema>

Может ли кто-нибудь предложить какой-нибудь elisp, который может выровнять =?


person Cheeso    schedule 27.05.2009    source источник


Ответы (1)


Попробуйте что-нибудь вроде следующего:

(defun prettyprint-xml ()
  (interactive)
  (goto-char (point-min))
  (while (search-forward "=" (point-max) t)
    (search-forward "\"")
    (search-forward "\"")
    (forward-char)
    (newline-and-indent))
  (align-regexp (point-min) (point-max) "\#"))

Он может не делать именно то, что вы хотите (я только что его закодировал), но похоже, что он должен работать для случая, который вы показали.

person Nathaniel Flath    schedule 27.05.2009