source

Emacs에서 XML 파일을 예쁘게 인쇄

lovecheck 2023. 10. 24. 21:25
반응형

Emacs에서 XML 파일을 예쁘게 인쇄

저는 제 xml 파일(nxml-mode)을 편집하기 위해 이맥스를 사용하는데, 컴퓨터에서 생성된 파일은 태그의 형식이 좋지 않습니다.

전체 파일을 들여쓰기로 예쁘게 인쇄해서 저장하려고 찾아봤지만 자동으로 방법을 찾을 수 없었습니다.

방법이 있습니까?아니면 최소한 리눅스에서 할 수 있는 편집자라도.

직접 함수를 작성할 필요도 없습니다. sgml-mode(gnuemacs 코어 모듈)에는 영역 시작 및 끝 인수를 사용하는 (sgml-pretty-print...)라는 예쁜 인쇄 기능이 내장되어 있습니다.

만약 당신이 xml을 자르고 붙이는데 당신의 단말기가 임의의 장소에서 선을 자르는 것을 발견한다면 당신은 먼저 선을 고치는 이 예쁜 프린터를 사용할 수 있습니다.

새 줄 바꿈을 도입하지 않고 꽤 들여쓰기만 필요한 경우에는 다음을 적용할 수 있습니다.indent-region명령을 다음 키 입력과 함께 전체 버퍼에 전달합니다.

C-x h
C-M-\

만약 당신이 열림과 닫힘 태그가 별도의 줄에 있도록 줄 바꿈을 도입해야 한다면, 당신은 벤자민 페라리가 쓴 다음의 아주 멋진 엘리스 기능을 사용할 수 있습니다.그의 블로그에서 발견했는데 여기서 재현해도 괜찮길 바랍니다.

(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") (setq end (1+ end)))
    (indent-region begin end))
  (message "Ah, much better!"))

이것은 Tidy와 같은 외부 도구에 의존하지 않습니다.

Emacs는 M-|로 임의의 명령을 실행할 수 있습니다. xmlint가 설치되어 있는 경우:

"M-| xmlint --format -"은 선택한 영역을 포맷합니다.

"C-u M-| xmlint --format -"는 동일한 작업을 수행하여 지역을 출력으로 대체합니다.

XML이나 HTML을 포맷하고 들여쓰기를 원할 때 편집할 때 nXML 모드를 사용하고 Tidy를 사용합니다. Tidy에 대한 Emacs 인터페이스도 있습니다.

라인브레이크 소개 후 예쁜 프린팅을 위해

M-x sgml-mode
M-x sgml-pretty-print

위의 팀 헬름슈테트 덕분에 저는 이렇게 했습니다.

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

빠르면서도 수월한대단히 고맙습니다.

벤저민 페라리 버전에 대한 몇 가지 수정사항은 다음과 같습니다.

  • search-forward-regexp끝을 지정하지 않았기 때문에 영역 시작부터 버퍼 끝까지(영역 끝의 instead) 작업을 수행합니다.
  • 이제 증분end치소가 지적한 것처럼 말입니다.
  • 그 사이에 단절을 삽입할 것입니다<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=

도움이 되길 바랍니다.

2017년 현재 emacs는 이미 기본적으로 이 기능과 함께 제공되지만, 당신은 이 작은 기능을 당신의 것에 써야 합니다.~/.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))))

그럼 그냥 전화해요M-x reformat-xml

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

  1. Emacs nxml-mode는 제시된 형식에서 작동할 수 있지만 행을 분할해야 합니다.
  2. 가치가 없는 긴 파일의 경우.이 스타일시트를 더 긴 파일에 대해 실행하면(IMHO가 선을 정확하게 들여놓는 이상적인 색슨) 예쁜 인쇄를 얻을 수 있습니다.공백을 유지하려는 요소의 경우 'ElementName 프로그램 목록'에서와 같이 'Program listing'과 함께 해당 요소의 이름을 추가합니다.

HTH

Jason Viers의 버전을 가져다가 논리를 추가하여 xmlns 선언을 그들 자신의 라인에 넣었습니다.공백이 없는 xmlns= 및 xmlns가 있다고 가정합니다.

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

깔끔해 보이네요.꼭 봐야 합니다.그것이 제공하는 모든 기능이 정말로 필요하다면 그것을 사용할 것입니다.

어쨌든, 이 문제는 일주일 정도 나에게 잔소리를 했고 나는 제대로 검색을 하지 않았습니다.글을 올린 후 검색을 시작해보니 elisp 기능이 있는 사이트가 꽤 잘 되어있습니다.또한 작가는 Tidy를 사용할 것을 제안합니다.

답변 감사합니다 Marcel (점이 부족해서 당신을 업그레이드 할 수 없어 안타깝습니다. .

조만간 블로그에 올릴 예정입니다. 여기 그것에 대한 게시물(마르셀 사이트 링크 포함)이 있습니다.

xml-parse.el에서 사용합니다.일반적으로 이 명령을 실행할 때 파일의 맨 앞에 점이 표시되기를 원합니다.

이맥스피크에 파일이 통합된 것이 흥미롭습니다.제가 이맥스피크를 일상적으로 사용할 때, 저는 생각했습니다.xml-reformat-tags내장된 Emacs입니다.어느 날 분실하여 인터넷 검색을 해야 했고, 위에 언급한 위키 페이지에 들어갔습니다.

xml-parse를 시작하기 위해 제 코드도 첨부합니다.이것이 이맥스 코드 중 가장 좋은 것인지는 잘 모르겠지만, 저에게는 잘 맞는 것 같습니다.

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

spacemac을 사용하는 경우 'spacemacs/indent-region-or-buffer' 명령만 사용하면 됩니다.

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

유감스럽게도 저는 벤자민 페라리 버전을 훨씬 더 좋아합니다.내부 예쁜 인쇄물은 항상 끝 태그를 값 뒤에 새 줄로 배치하여 태그 값에 원하지 않는 CR을 삽입합니다.

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

반응형