我想在 Emacs 中打开一个 XML 文件并以一种特殊的方式处理它。(假设一个主要模式是自定义打开 XML 文件并对其进行处理并以特殊方式呈现)我想要做的是隐藏 XML 中的额外标记标签并仅向用户显示内容。谁能建议我该怎么做?
`<name id=22> Luke </name>`
=> 我只想显示“Luke”。
我想在 Emacs 中打开一个 XML 文件并以一种特殊的方式处理它。(假设一个主要模式是自定义打开 XML 文件并对其进行处理并以特殊方式呈现)我想要做的是隐藏 XML 中的额外标记标签并仅向用户显示内容。谁能建议我该怎么做?
`<name id=22> Luke </name>`
=> 我只想显示“Luke”。
一种方法是使用正则表达式从 XML 中提取元素信息,然后打开一个临时缓冲区进行查看,您可以将元素信息粘贴到该缓冲区中。我不确定缩小是否足够细化以隐藏标记并仅显示元素信息。
话虽如此,临时缓冲区方法的替代方法是提取元素信息,将其粘贴到文件底部,然后缩小到文件的该部分,以便源标记不可见。
下面的函数大致完成了我的想法:
(defun show-xml-entities ()
(interactive)
(save-excursion
(let ((old-max (point-max))) ;; save current end of buffer
(goto-char (point-min)) ;; go to beginning of buffer
(while (re-search-forward ">\\([^<>]+\\)<" nil t) ;; search for elements until not found
(when (> (length (match-string-no-properties 1)) 0) ;; if match is non-zero length
(setq temp (point-marker)) ;; save end of match
(goto-char (point-max)) ;; go to end of buffer
;; paste current match to end of buffer
(insert (concat (buffer-substring-no-properties (match-beginning 1) (match-end 1))))
(goto-char (marker-position temp)) ;; return to end of current match
)
)
(narrow-to-region old-max (point-max))) ;; narrow to newly pasted element text
)
)
逻辑步骤将是 - 计算起始缓冲区结束位置(point-max)和 sav 在 var 中循环 - 循环通过您的 XML,收集您的实体信息并将其粘贴在保存的位置之后 - 完成调用时(窄到区域的原始点-max(点最大值))。这将隐藏所有 XML,以便只有您的实体文本可见。
Mx sgml-hide-tags RET
请参阅菜单 SGML 部分查看更多相关命令