If u use Emacs 21 (maybe even 20.7) use this small, but efficient addition
to sgml/xml-mode.
sgml/xml-mode provides the colouring of the tags (it is xml after all) - the
hack provide indention and auto-completion of end tags.

Completion of the tags is not possible without a DTD, but for this I just
use hippie-expand or dabbrev-expand.

Hope it helps:

; The functions is "stolen"/modfied from xslide.el
;
; It adds support for indention of tags and automatic insertion of end
; tags in xml files (without the need for DTD's)
;
; Alternatively PSGML could be used but it seems to be overkill for regular
xml editing.
; e.g. it require a DTD for proper fontification and indention.

(defun xml-electric-tab ()
  "Function called when TAB is pressed in XML mode."
  (interactive)
  (save-excursion
    (beginning-of-line)
    (delete-horizontal-space)
    (if (looking-at "</")
 (indent-to (max 0 (- (xml-calculate-indent) 2)))
      (indent-to (xml-calculate-indent))))
  (if (and
       (bolp)
       (looking-at "[ \t]+"))
      (goto-char (match-end 0))))

(defun xml-calculate-indent ()
  "Calculate what the indent should be for the current line"
  (interactive)
  (save-excursion
    (if (re-search-backward "^\\([ \t]*\\)<" nil t)
 (goto-char (match-end 1))
      (beginning-of-line))
    (if (or
  (save-excursion
    (re-search-forward "\\(</[^<>]+>\\|<[^/][^<>]+/>\\)[ \t]*$"
         (save-excursion (end-of-line) (1+ (point)))
         t))
  (bobp))
 (current-column)
      (+ (current-column) 2))))

(defun xml-electric-return ()
  "Function called when enter/return is pressed in xml mode"
  (interactive)
  (insert "\n")
  (xml-electric-tab))

(defun xml-electric-less-than ()
  "Function called when \"<\" is pressed in xml mode"
  (interactive)
  (insert "<")
  (xml-electric-tab))

(defun xml-electric-slash ()
  "Function called when \"/\" is pressed in xml mode"
  (interactive)
  (insert "/")
  (xml-electric-tab)
  (if (looking-at "$")
      (let ((element-name
      (save-excursion
        (backward-char 2)
        (if (looking-at "</")
     (catch 'start-tag
       (while (re-search-backward "<" nil t)
         (cond
   ((looking-at "</\\([^/> \t]+\\)>")
;;    (message "End tag: %s" (match-string 1))
    (re-search-backward
     (concat "<" (match-string 1) "[ \t\n\r>]") nil t))
   ((looking-at "<\\(\\([^/>]\\|/[^>]\\)+\\)/>"))
;;    (message "Empty tag: %s" (match-string 1)))
   ((looking-at "<!--[^-]*\\(-[^-]+\\)*-->"))
   ((looking-at "<\\([^/> \t]+\\)")
;;    (message "Start tag: %s" (match-string 1))
    (throw 'start-tag (match-string 1)))
   ((bobp)
    (throw 'start-tag nil)))))
   nil))))
 (if element-name
     (insert (concat element-name ">"))))))

; register additional keybindings in xml
(add-hook 'sgml-mode-hook
          '(lambda ()
             (progn
               (define-key sgml-mode-map [tab]  'xml-electric-tab)
               (define-key sgml-mode-map "/"    'xml-electric-slash)
               (define-key sgml-mode-map "<"    'xml-electric-less-than)
               )
             )
          )



""Jeff Rancier"" <[EMAIL PROTECTED]> wrote in message
[EMAIL PROTECTED]">news:[EMAIL PROTECTED]...
> You could try http://xae.sunsite.dk
>
> Jeff
>
> -----Original Message-----
> From: Eric Chastan [mailto:[EMAIL PROTECTED]]
> Sent: Wednesday, December 12, 2001 3:52 AM
> To: [EMAIL PROTECTED]
> Subject: best mode to edit Ant files ?
>
>
> Hello,
>
> Do you know a good mode to edit Ant files (with colorization,
> indentation, completion ...) ?
>
> Eric.
>


Reply via email to