Wie kann ich beliebige Tags im nxml-Modus falten?

1077
Sean Allred

Ich würde gerne klappen

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

in

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

oder

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

nxml-modekann bestimmte Elemente bereits umreißen . Wie kann ich nxml-modebereit sein, jedes Element zu skizzieren ?

3
Die Gliederungsfunktion erfordert einen definitiven Anfangsregexp und einen endgültigen Endregexp. Wenn niemand in naher Zukunft eine Lösung anbietet, dann greife ich ein. In der Zwischenzeit stellen Sie bitte eine Liste aller beginnenden und zerreißenden regulären Ausdrücke der Regionen zusammen, die Sie falten möchten. Diese werden benötigt, um eine benutzerdefinierte Fold-Funktion (falls eine solche Funktion noch nicht vorhanden ist) für Ihre `nxml zu erstellen -mode` Projekt. Sie können auch einen Blick auf die Hide-Show-Bibliothek werfen: http://www.emacswiki.org/emacs/HideShow und https://www.gnu.org/software/emacs/manual/html_node/emacs/Hideshow .html lawlist vor 10 Jahren 0
@lawlist Das Problem dabei - so wie ich es mit klassischen regulären Ausdrücken feststellen kann - ist, dass reguläre Ausdrücke verschachtelte Dinge nicht wirklich verarbeiten können. Das heißt, 'xsl:. *' Sollte alles abdecken, was ich gerne verschachteln möchte, obwohl die Möglichkeit, eine Liste solcher Tags zum Falten festzulegen, ideal wäre. Sean Allred vor 10 Jahren 0
Es sieht so aus, als könnte der Anfang von regexp verwendet werden, um die Endung von regexp abzuleiten, ähnlich einem früheren Beispiel, das ich für LaTeX entworfen habe: http://tex.stackexchange.com/a/161196/26911 So sehen Sie, ob jemand eine integrierte Lösung oder eine Diashow oder eine andere Methode hat. Wenn nicht, werde ich wahrscheinlich etwas auf der Grundlage des Entwurfs in dem Link, den ich erwähnt habe, zusammenstellen. Dieses Beispiel von mir sieht ziemlich nah an, was Sie wollen - Sie möchten vielleicht selbst einen Stich dagegen machen. lawlist vor 10 Jahren 0

1 Antwort auf die Frage

3
lawlist

Ursprünglicher Entwurf (23. Juli 2014): Erster Rohentwurf.

EDIT (23. Juli 2014): Zweiter Rohentwurf. Ein Zähler und eine While-Schleife wurden hinzugefügt, um zu versuchen, verschachtelte Situationen zu behandeln, die denselben regulären Ausdruck enthalten.

(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.")))) 
Probieren Sie es mit [transform.xsl] (https://github.com/vermiculus/stack-api/blob/master/transform.xsl) aus --- insbesondere mit dem `xsl: for-each` in Zeile 11 (aber interessanterweise) * nicht * das `xsl: for-each` in Zeile 43). Sean Allred vor 10 Jahren 0
Vielen Dank für den Testcode "transform.xsl". Ich muss darüber nachdenken, wie wir mit verschachtelten Situationen umgehen können, die den gleichen Regex enthalten. Zumindest haben wir einen halbfertigen ersten Entwurf, um uns anzufangen. lawlist vor 10 Jahren 1
@Sean Allred - Ich habe eine while-Schleife und einen Counter hinzugefügt, um zu versuchen, mit den verschachtelten Situationen umzugehen, die denselben regulären Ausdruck enthalten. Wenn Sie Zeit haben, können Sie es ausprobieren und versuchen, wenn Sie möchten. lawlist vor 10 Jahren 0