]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
runtime(xml): update XML runtime files
authorChristian Brabandt <cb@256bit.org>
Wed, 7 Jan 2026 21:54:51 +0000 (21:54 +0000)
committerChristian Brabandt <cb@256bit.org>
Wed, 7 Jan 2026 21:54:51 +0000 (21:54 +0000)
closes: #19112

Signed-off-by: Christian Brabandt <cb@256bit.org>
runtime/autoload/xmlformat.vim
runtime/ftplugin/xml.vim
runtime/indent/xml.vim

index c89c8784b90bea62465812c52cf277e4b46457dc..c541e65755a5ba07017689fa8a43759c98568893 100644 (file)
@@ -1,5 +1,5 @@
 " Vim plugin for formatting XML
-" Last Change: 2020 Jan 06
+" Last Change: 2023 March 15th
 "     Version: 0.3
 "      Author: Christian Brabandt <cb@256bit.org>
 "  Repository: https://github.com/chrisbra/vim-xml-ftplugin
@@ -37,13 +37,17 @@ func! xmlformat#Format() abort
     " Keep empty input lines?
     if empty(line)
       call add(result, '')
+      let current += 1
       continue
     elseif line !~# '<[/]\?[^>]*>'
-      let nextmatch = match(list, '<[/]\?[^>]*>', current)
-      if nextmatch > -1 
-        let line .= ' '. join(list[(current + 1):(nextmatch-1)], " ")
-        call remove(list, current+1, nextmatch-1)
+      let nextmatch = match(list, '^\s*$\|<[/]\?[^>]*>', current)
+      if nextmatch > -1
+        let lineEnd = nextmatch
+      else
+        let lineEnd = len(list)
       endif
+      let line .= ' '. join(list[(current + 1):(lineEnd-1)], " ")
+      call remove(list, current+1, lineEnd-1)
     endif
     " split on `>`, but don't split on very first opening <
     " this means, items can be like ['<tag>', 'tag content</tag>']
@@ -79,9 +83,13 @@ func! xmlformat#Format() abort
           if s:EndTag(t[1])
             call s:DecreaseIndent()
           endif
-          "for y in t[1:]
-            let result+=s:FormatContent(t[1:])
-          "endfor
+          let result+=s:FormatContent(t[1:])
+          if s:IsTag(t[1])
+            let lastitem = t[1]
+            continue
+          endif
+        elseif s:IsComment(item)
+          let result+=s:FormatContent([item])
         else
           call add(result, s:Indent(item))
         endif
@@ -94,7 +102,7 @@ func! xmlformat#Format() abort
   if !empty(result)
     let lastprevline = getline(v:lnum + count_orig)
     let delete_lastline = v:lnum + count_orig - 1 == line('$')
-    exe v:lnum. ",". (v:lnum + count_orig - 1). 'd'
+    exe 'silent ' .. v:lnum. ",". (v:lnum + count_orig - 1). 'd'
     call append(v:lnum - 1, result)
     " Might need to remove the last line, if it became empty because of the
     " append() call
index 83c528eff23e7c5965f3c3552b7a104fc3f57303..6256d171ed7b3e62bad82980bb1b7aa22daf4f11 100644 (file)
@@ -1,12 +1,11 @@
 " Vim filetype plugin file
 "     Language:        xml
 "   Maintainer:        Christian Brabandt <cb@256bit.org>
-" Last Changed: Dec 07th, 2018
-"              2024 Jan 14 by Vim Project (browsefilter)
-"              2024 May 23 by Riley Bruins <ribru17@gmail.com> ('commentstring')
-"   Repository: https://github.com/chrisbra/vim-xml-ftplugin
-" Previous Maintainer: Dan Sharp
-"          URL:                      http://dwsharp.users.sourceforge.net/vim/ftplugin
+" Last Changed:        2024 May 24
+"   Repository:        https://github.com/chrisbra/vim-xml-ftplugin
+" Previously
+"    Maintainer:       Dan Sharp <dwsharp at users dot sourceforge dot net>
+"    URL:              http://dwsharp.users.sourceforge.net/vim/ftplugin
 
 if exists("b:did_ftplugin") | finish | endif
 let b:did_ftplugin = 1
@@ -54,12 +53,8 @@ command! -nargs=? XMLent call xmlcomplete#CreateEntConnection(<f-args>)
 if (has("gui_win32") || has("gui_gtk")) && !exists("b:browsefilter")
     let  b:browsefilter="XML Files (*.xml)\t*.xml\n" .
     \ "DTD Files (*.dtd)\t*.dtd\n" .
-    \ "XSD Files (*.xsd)\t*.xsd\n"
-    if has("win32")
-       let b:browsefilter .= "All Files (*.*)\t*\n"
-    else
-       let b:browsefilter .= "All Files (*)\t*\n"
-    endif
+    \ "XSD Files (*.xsd)\t*.xsd\n" .
+    \ "All Files (*.*)\t*.*\n"
 endif
 
 " Undo the stuff we changed.
index 5bf53ad1f8f5d56b86802c24775e5102a782c651..db71fc03ca11ebdd53c607278e9e1f08a5930fc7 100644 (file)
@@ -88,7 +88,9 @@ endfun
 
 " [-- return the sum of indents of a:lnum --]
 fun! <SID>XmlIndentSum(line, style, add)
-    if <SID>IsXMLContinuation(a:line) && a:style == 0 && !<SID>IsXMLEmptyClosingTag(a:line)
+    if <SID>IsXMLContinuation(a:line) &&
+        \ a:style == 0 &&
+        \ !<SID>IsXMLEmptyClosingTag(a:line)
         " no complete tag, add one additional indent level
         " but only for the current line
         return a:add + shiftwidth()
@@ -157,6 +159,17 @@ fun! XmlIndentGet(lnum, use_syntax_check)
             " no extra indent, looks like a text continuation line
            return pind
         endif
+    elseif empty(syn_name_start) && syn_name_end =~? 'xmlTag'
+        " Special case: such a line, shouldn't be indented, just because it
+        " ends with a tag
+        " 'foobar <i>inline tags</i>'
+        if (match(curline, '<\([:a-zA-Z_]\+\)[^>]*>.*</\1>') > -1)
+            return pind
+        endif
+    endif
+
+    if curline =~ '^\s*</[a-zA-Z_]>'
+        return <SID>ReturnIndentForMatchingTag(curline)
     endif
 
     " Get indent from previous tag line
@@ -181,6 +194,21 @@ func! <SID>IsXMLEmptyClosingTag(line)
     return a:line =~? '<[^>]*/>\s*$'
 endfunc
 
+func! <SID>ReturnIndentForMatchingTag(line)
+    " For a line with just a simple closing tag
+    " get the indent from a matching opening tag
+    if a:line =~? '^\s*</[a-z_]*>'
+        let _c = getcursorpos()
+        let pat = matchstr(a:line, '^\s*</\zs[a-z_]\+\ze>')
+        " position cursor before the opening tag
+        norm! 0
+        " get the indent from the matching opening tag
+        let match_line = searchpair('<' .. pat .. '>', '', '</' .. pat .. '>', 'bn')
+        call setpos('.', _c)
+        return indent(match_line)
+    endif
+endfunc
+
 " return indent for a commented line,
 " the middle part might be indented one additional level
 func! <SID>XmlIndentComment(lnum)