From: unknown Date: Fri, 2 Mar 2012 09:56:58 +0000 (+0100) Subject: nxml-mode extensions X-Git-Url: http://g0dil.de/git?p=emacs-init.git;a=commitdiff_plain;h=fb7d163ed6c8786df5b9fc7c59aa45966cedaa1e nxml-mode extensions --- diff --git a/setup/nxml.el b/setup/nxml.el index f756d1e..208e587 100644 --- a/setup/nxml.el +++ b/setup/nxml.el @@ -71,5 +71,139 @@ (hs-hide-block) (nxml-backward-up-element)) +(defun hs-nxml-hide-other () + (interactive) + (let ((p (point))) + (hs-hide-all) + (while (progn (goto-char p) (hs-already-hidden-p)) + (hs-nxml-enter)) + (hs-show-block) + (goto-char p) + (recenter-top-bottom))) + (define-key nxml-mode-map (kbd "\C-c ") 'hs-nxml-leave) (define-key nxml-mode-map (kbd "\C-c ") 'hs-nxml-enter) +(define-key nxml-mode-map (kbd "\C-c @ o") 'hs-nxml-hide-other) + +(defun nxml-complete-and-autoclose-element (use-region) + (interactive "P") + (let* ((start (if use-region (setq start (set-marker (make-marker) (region-beginning))))) + (end (setq use-region (set-marker (make-marker) (region-end)))) + (beg (and start (= (point) start)))) + (save-excursion + (insert " ")) + (nxml-complete) + (let ((name (xmltok-start-tag-local-name))) + (delete-char 1) + (if (and start end) + (progn + (if (not beg) + (progn + (delete-char (- (1+ (length name)))) + (goto-char start) + (insert "<" name ">")) + (insert ">")) + (goto-char end)) + (insert ">")) + (save-excursion + (insert ""))))) + +(define-key nxml-mode-map (kbd "\C-c ." ) 'nxml-complete-and-autoclose-element) +(define-key nxml-mode-map (kbd "\C-c\C-c") 'recompile) + +(defconst nxml-docbook-common-elements + '(("section" . ("para" "itemizedlist" "variablelist" "section" "bridgehead" "task" "procedure")) + ("para" . ("emphasis" "code" "replaceable")) + ("emphasis" . ("code")) + ("itemizedlist" . ("listitem")) + ("orderedlist" . ("listitem")) + ("variablelist" . ("varlistentry")) + ("varlistentry" . ("term" "listitem")) + ("term" . ("emphasis" "code")) + ("listitem" . ("para" "itemizedlist")) + ("task" . ("tasksummary" "procedure")) + ("tasksummary" . ("para")) + ("procedure" . ("step")) + ("step" . ("para" "procedure")) + ("mathphrase" . ("replaceable" "superscript" "subscript")) + ("title" . ("code" "replaceable")) + ("literallayout" . ("replaceable" "emphasis" "code")))) + +(defvar nxml-docbook-last-common-element nil) + +(defun nxml-docbook-make-common-element () + (interactive) + (let ((start (set-marker (make-marker) (point))) + (end (set-marker (make-marker) (point))) + do-region) + (when (or (region-active-p) + (and (eq real-last-command 'nxml-docbook-make-common-element) + (car nxml-docbook-last-common-element))) + (set-marker start (region-beginning)) + (set-marker end (region-end)) + (message "do-mark %s %s" start end) + (setq do-region t)) + (message "cycle? %s %s" real-last-command nxml-docbook-last-common-element) + (when (and (eq real-last-command 'nxml-docbook-make-common-element) + (cdr nxml-docbook-last-common-element)) + (delete-region (save-excursion (skip-chars-backward "^<") (1- (point))) start) + (delete-region end (save-excursion (skip-chars-forward "^>") (1+ (point))))) + (let* ((token-end (nxml-token-before)) + (start-tag-end + (save-excursion + (when (and (< (point) token-end) + (memq xmltok-type + '(cdata-section + processing-instruction + comment + start-tag + end-tag + empty-element))) + (setq nxml-docbook-last-common-element nil) + (error "Point is inside a %s" + (nxml-token-type-friendly-name xmltok-type))) + (nxml-scan-element-backward token-end t))) + (context (xmltok-start-tag-qname)) + (elements (cdr (assoc context nxml-docbook-common-elements))) + (index (if (and elements + (eq real-last-command 'nxml-docbook-make-common-element) + (cdr nxml-docbook-last-common-element)) + (1+ (cdr nxml-docbook-last-common-element)) + 0)) + (element (and elements (nth index elements)))) + (when (not elements) + (setq nxml-docbook-last-common-element nil) + (error "No common elements for %s" context)) + (if element + (progn + (goto-char start) + (insert-before-markers "<" element ">") + (goto-char end) + (insert "") + (goto-char end) + (setq nxml-docbook-last-common-element (cons do-region index))) + (setq nxml-docbook-last-common-element (cons do-region nil))) + (when do-region + (set-mark start) + (message "Fiddlesticks: %s %s %s" (mark t) mark-active (region-active-p)))))) + +(defun nxml-just-one-space-or-skip-end () + (interactive) + (if (looking-at "") + (forward-char 1)) + (just-one-space))) + +(define-key nxml-mode-map (kbd "M-RET") 'nxml-docbook-make-common-element) +(define-key nxml-mode-map (kbd "M-SPC") 'nxml-just-one-space-or-skip-end) + +(defun nxml-open-line () + (interactive) + (open-line 1) + (save-excursion + (forward-line 1) + (indent-according-to-mode)) + (newline-and-indent)) + +(define-key nxml-mode-map (kbd "M-o") 'nxml-open-line)