題 如何用nxml模式折疊任意標籤?


我想棄牌

<type>
  <xsl:attribute name="multiplicity">
    <xsl:choose>
      <xsl:when test="collection = true">*</xsl:when>
      <xsl:otherwise>1</xsl:otherwise>
    </xsl:choose>
  </xsl:attribute>
  <xsl:value-of select="field_type"/>
</type>

<type>
  <xsl:attribute name="multiplicity">
    <xsl:choose>...</xsl:choose>
  </xsl:attribute>
  <xsl:value-of select="field_type"/>
</type>

要么

<type>
  <xsl:attribute name="multiplicity">...</xsl:attribute>
  <xsl:value-of select="field_type"/>
</type>

nxml-mode 可以概述 某些 元素已經。 我該如何設置 nxml-mode 願意勾勒出來 任何 元件?


3
2017-07-23 02:25


起源


輪廓特徵需要明確的開始正則表達式和明確的結束正則表達式。如果沒有人在不久的將來提供解決方案,那麼我將採取措施。在此期間,請匯總一份您希望折疊的區域的所有開始和結果正則表達式的列表 - 這對於您的創建自定義折疊功能(如果這樣的功能尚不存在)是必需的 nxml-mode 項目。您可能還想看一下隱藏展示庫: emacswiki.org/emacs/HideShow 和 gnu.org/software/emacs/manual/html_node/emacs/Hideshow.html - lawlist
@lawlist我可以用經典正則表達式來解決這個問題 - 正則表達式無法真正處理嵌套的東西。那說, xsl:.* 應該涵蓋我想要嵌套的所有內容,儘管定義折疊列表的能力是理想的。 - Sean Allred
看起來像開始的正則表達式可用於派生結束正則表達式,類似於我為LaTeX起草的先前示例: tex.stackexchange.com/a/161196/26911  我會在第二天左右檢查一下,看看是否有人有內置解決方案或隱藏秀或其他方法。如果沒有,我可能會根據我提到的鏈接中的草案將某些內容放在一起。我之前的例子看起來非常接近你想要的東西 - 你可能想在此期間自己嘗試一下。 - lawlist


答案:


初稿 (2014年7月23日):第一份草稿。

編輯 (2014年7月23日):第二次草稿。添加了一個計數器和while循環,試圖處理包含相同正則表達式的嵌套情境。

(defvar beg-xsl-regexp
  "\\(\<xsl:\\)\\([^ >]*\\)\\([^>]*\\)\\(\>\\)"
"Regexp matching the beginning of the folded region.")

(defun toggle-xsl-block ()
"When FLAG is non-nil, hide the region.  Otherwise make it visible.  For this
function to work, the cursor must be on the same line as the beginning regexp."
(interactive)
  (require 'outline)
  (cond
    ((or
        (looking-at beg-xsl-regexp)
        (let ((line-begin (save-excursion (beginning-of-line 1) (point))))
          (save-excursion
            (re-search-backward "\<" line-begin t)
            (looking-at beg-xsl-regexp)))
        (let ((line-begin (save-excursion (beginning-of-line 1) (point))))
          (save-excursion
            (re-search-backward "\<xsl:" line-begin t)
            (looking-at beg-xsl-regexp)))
        (let ((line-end (save-excursion (end-of-line 1) (point))))
          (save-excursion
            (re-search-forward "\<xsl:" line-end t)
            (backward-char 5)
            (looking-at beg-xsl-regexp))))
      (let* (
          congratulations
          (i 0)
          (beg-1 (match-beginning 0))
          (flag (not (get-char-property (match-end 0) 'invisible)))
          (begin-fold (match-end 0))
          end-fold
          (base-flag-match (regexp-quote
            (buffer-substring-no-properties (match-beginning 2) (match-end 2))))
          (beg-flag-match (concat "\<xsl:" base-flag-match))
          (end-flag-match (concat "\</xsl:" base-flag-match "\>"))
          (go-fish (concat "\</xsl:" base-flag-match "\>"))  )
        (save-excursion
          (when (save-excursion (re-search-forward end-flag-match nil t))
            (catch 'done
              (while t 
                (re-search-forward end-flag-match nil t)
                (when
                  (>
                    (save-excursion (re-search-backward beg-flag-match beg-1 t i) (point))
                    beg-1)
                  (setq i (1+ i)))
                (when
                  (=
                    (save-excursion (re-search-backward beg-flag-match beg-1 t i) (point))
                    beg-1)
                  (setq congratulations t)
                  (throw 'done nil)))))
          (if congratulations
            (progn
              (setq end-fold (point))
              (outline-flag-region begin-fold end-fold flag)
              (cond
                (flag
                  (overlay-put (make-overlay begin-fold end-fold) 'display "\u25be"))
                (t
                  (mapc 'delete-overlay (overlays-in begin-fold end-fold)))))
            (user-error "Error locating an ending match for:  %s." go-fish)))
        (if (> (point) begin-fold)
          (goto-char begin-fold)) ))
    (t
      (message "You are not on a line containing the beginning regexp."))))

3
2017-07-23 17:36



嘗試一下 transform.xsl ---特別是 xsl:for-each 在第11行(但有趣的是 不 該 xsl:for-each 在第43行)。 - Sean Allred
謝謝你的 transform.xsl 測試代碼。我需要考慮如何處理包含相同正則表達式的嵌套情境。至少我們有一份半工作的初稿讓我們開始。 - lawlist
@Sean Allred - 我添加了一個while循環和計數器來嘗試處理包含相同正則表達式的嵌套情境 - 只要你有空閒時間,你可以繼續嘗試,如果你願意的話。 - lawlist