Function: nxml-dynamic-markup-word
nxml-dynamic-markup-word is an interactive and byte-compiled function
defined in nxml-mode.el.gz.
Signature
(nxml-dynamic-markup-word)
Documentation
Dynamically markup the word before point.
This attempts to find a tag to put around the word before point based on the contents of the current buffer. The end-tag will be inserted at point. The start-tag will be inserted at or before the beginning of the word before point; the contents of the current buffer is used to decide where.
It works in a similar way to M-/ (dabbrev-expand). It searches first
backwards from point, then forwards from point for an element whose
content is a string which matches the contents of the buffer before
point and which includes at least the word before point. It then
copies the start- and end-tags from that element and uses them to
surround the matching string before point.
Repeating M-x nxml-dynamic-markup-word (nxml-dynamic-markup-word) immediately after successful
M-x nxml-dynamic-markup-word (nxml-dynamic-markup-word) removes the previously inserted markup
and attempts to find another possible way to do the markup.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/nxml/nxml-mode.el.gz
(defun nxml-dynamic-markup-word ()
"Dynamically markup the word before point.
This attempts to find a tag to put around the word before point based
on the contents of the current buffer. The end-tag will be inserted at
point. The start-tag will be inserted at or before the beginning of
the word before point; the contents of the current buffer is used to
decide where.
It works in a similar way to \\[dabbrev-expand]. It searches first
backwards from point, then forwards from point for an element whose
content is a string which matches the contents of the buffer before
point and which includes at least the word before point. It then
copies the start- and end-tags from that element and uses them to
surround the matching string before point.
Repeating \\[nxml-dynamic-markup-word] immediately after successful
\\[nxml-dynamic-markup-word] removes the previously inserted markup
and attempts to find another possible way to do the markup."
(interactive "*")
(let (search-start-pos)
(if (and (integerp nxml-dynamic-markup-prev-pos)
(= nxml-dynamic-markup-prev-pos (point))
(eq last-command this-command)
nxml-dynamic-markup-prev-lengths)
(let* ((end-tag-open-pos
(- nxml-dynamic-markup-prev-pos
(nth 2 nxml-dynamic-markup-prev-lengths)))
(start-tag-close-pos
(- end-tag-open-pos
(nth 1 nxml-dynamic-markup-prev-lengths)))
(start-tag-open-pos
(- start-tag-close-pos
(nth 0 nxml-dynamic-markup-prev-lengths))))
(delete-region end-tag-open-pos nxml-dynamic-markup-prev-pos)
(delete-region start-tag-open-pos start-tag-close-pos)
(setq search-start-pos
(marker-position nxml-dynamic-markup-prev-found-marker)))
(clrhash nxml-dynamic-markup-prev-start-tags))
(setq nxml-dynamic-markup-prev-pos nil)
(setq nxml-dynamic-markup-prev-lengths nil)
(setq nxml-dynamic-markup-prev-found-marker nil)
(goto-char
(save-excursion
(let* ((pos (point))
(word (progn
(backward-word 1)
(unless (< (point) pos)
(error "No word to markup"))
(buffer-substring-no-properties (point) pos)))
(search (concat word "</"))
done)
(when search-start-pos
(goto-char search-start-pos))
(while (and (not done)
(or (and (< (point) pos)
(or (search-backward search nil t)
(progn (goto-char pos) nil)))
(search-forward search nil t)))
(goto-char (- (match-end 0) 2))
(setq done (nxml-try-copy-markup pos)))
(or done
(error (if (zerop (hash-table-count
nxml-dynamic-markup-prev-start-tags))
"No possible markup found for `%s'"
"No more markup possibilities found for `%s'")
word)))))))