program story

Emacs에서 XML 파일 인쇄하기

inputbox 2020. 10. 6. 08:12
반응형

Emacs에서 XML 파일 인쇄하기


emacs를 사용하여 내 xml 파일 (nxml-mode)을 편집하고 컴퓨터에서 생성 된 파일에는 태그의 형식이 예쁘지 않습니다.

들여 쓰기로 전체 파일을 인쇄하고 저장하는 방법을 검색했지만 자동 방법을 찾을 수 없었습니다.

방법이 있습니까? 또는 그것을 할 수있는 리눅스에서 적어도 일부 편집기.


편집 에는 nXML 모드사용 하고 XML 또는 HTML의 서식을 지정하고 들여 쓰고 싶을 때는 Tidy 를 사용합니다. Tidy에 대한 Emacs 인터페이스 도 있습니다 .


sgml-mode (gnu emacs 코어 모듈)에는 영역 시작 및 끝 인수를받는 (sgml-pretty-print ...)라는 예쁜 인쇄 기능이 내장되어 있습니다.

xml을 잘라내어 붙여넣고 터미널이 임의의 위치에서 줄을 자르는 것을 발견하면 먼저 끊어진 줄을 수정 하는이 예쁜 프린터사용할 수 있습니다 .


새로운 줄 바꿈없이 들여 쓰기 만 필요한 경우 indent-region다음 키 입력으로 전체 버퍼에 명령을 적용 할 수 있습니다 .

C-x h
C-M-\

또한 여는 태그와 닫는 태그가 별도의 줄에 있도록 줄 바꿈을 도입해야하는 경우 Benjamin Ferrari가 작성한 다음과 같은 매우 멋진 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- |로 임의의 명령을 실행할 수 있습니다. xmllint가 설치된 경우 :

"M- | xmllint --format-"은 선택한 영역의 형식을 지정합니다.

"Cu 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는 버퍼의 끝 부분의 시작에서 물건에서 작동 할 수 있도록, 끝을 지정하지 않았다 (대신 지역의 말)
  • 이제 endCheeso가 언급했듯이 제대로 증가 합니다.
  • 사이에 브레이크를 삽입하여 <tag></tag>값을 수정합니다. 예, 기술적으로 여기에서 모든 값을 수정하고 있지만 빈 시작 / 끝이 훨씬 더 중요합니다. 이제이를 피하기 위해 약간 더 엄격한 두 개의 개별 검색을 사용합니다.

여전히 "외부 정리에 의존하지 않음"등이 있습니다. 그러나 매크로 가 필요 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!"))

한 가지 방법은 아래 형식의 것이 있으면

<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가 줄 들여 쓰기를하는 Saxon와 함께)를 실행하여 멋지고 예쁜 인쇄물을 얻으십시오. 공백을 유지하려는 요소의 경우 'programlisting yourElementName'에서와 같이 'programlisting'과 함께 이름을 추가하십시오.

HTH


I took Jason Viers' version and added logic to put xmlns declarations on their own lines. This assumes that you have xmlns= and xmlns: with no intervening whitespace.

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

Tidy looks like a good mode. Must look at it. Will use it if I really need all the features it offers.

Anyway, this problem was nagging me for about a week and I wasn't searching properly. After posting, I started searching and found one site with an elisp function which does it pretty good. The author also suggests using Tidy.

Thanks for answer Marcel (too bad I don't have enough points to upmod you) .

Will post about it soon on my blog. Here is a post about it (with a link to Marcel's site).


I use xml-reformat-tags from xml-parse.el. Usually you will want to have the point at the beginning of the file when running this command.

It's interesting that the file is incorporated into Emacspeak. When I was using Emacspeak on day-by-day basis, I thought xml-reformat-tags is an Emacs builtin. One day I lost it and had to make an internet search for that, and thus entered the wiki page mentioned above.

I'm attaching also my code to start xml-parse. Not sure if this is the best piece of Emacs code, but seems to work for me.

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

If you use spacemacs, just use command 'spacemacs/indent-region-or-buffer'.

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

as of 2017 emacs already comes with this capability by default, but you have to write this little function into your ~/.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))))

then just call M-x reformat-xml

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


I'm afraid I like Benjamin Ferrari version much better. The internal pretty print always places the end tag in a new line after the value, inserting unwanted CR in the tag values.

참고URL : https://stackoverflow.com/questions/12492/pretty-printing-xml-files-on-emacs

반응형