runtime(yaml): update YAML indentation for mapping keys inside list items
Commit:
https://github.com/vim/vim/commit/9179ddc0608813e9dd7cf9ba856d61669d6f0e3a
Author: Cezar Dimoiu <
cezar....@keysight.com>
Date: Thu Jan 8 20:05:07 2026 +0000
runtime(yaml): update YAML indentation for mapping keys inside list items
When a list item contains a mapping key (e.g., '- element1:'), the
content under that key was incorrectly indented. The indent function
was not accounting for the '- ' prefix when calculating indentation
for nested content.
Example that now works correctly:
list:
- element1:
foo: bar # Now correctly at indent 6, not 4
The fix adds special handling in two places:
1. When previous line ends with ':' and starts with '- '
2. When looking up previous mapping key that is a list item
Fixes indentation to account for the 2-character '- ' prefix.
fixes: #18943
closes: #19133
Signed-off-by: Cezar Dimoiu <
cezar....@keysight.com>
Signed-off-by: Christian Brabandt <
c...@256bit.org>
diff --git a/runtime/indent/testdir/
yaml.in b/runtime/indent/testdir/
yaml.in
index bf99668da..32b56a73f 100644
--- a/runtime/indent/testdir/
yaml.in
+++ b/runtime/indent/testdir/
yaml.in
@@ -18,3 +18,11 @@ map: |
line1
line2
# END_INDENT
+
+# START_INDENT
+list:
+ - element1:
+ foo: bar
+ - element2:
+ foo: bar
+# END_INDENT
diff --git a/runtime/indent/testdir/yaml.ok b/runtime/indent/testdir/yaml.ok
index 8b38633e7..0bfabfc16 100644
--- a/runtime/indent/testdir/yaml.ok
+++ b/runtime/indent/testdir/yaml.ok
@@ -18,3 +18,11 @@ map: |
line1
line2
# END_INDENT
+
+# START_INDENT
+list:
+ - element1:
+ foo: bar
+ - element2:
+ foo: bar
+# END_INDENT
diff --git a/runtime/indent/yaml.vim b/runtime/indent/yaml.vim
index c38712745..fb0f055dc 100644
--- a/runtime/indent/yaml.vim
+++ b/runtime/indent/yaml.vim
@@ -5,6 +5,7 @@
" Last Change: 2022 Jun 17
" 2024 Feb 29 by Vim project: disable mulitline indent by default
" 2024 Aug 14 by Vim project: fix re-indenting when commenting out lines
+" 2026 Jan 08 by Vim project: fix object indentation in array
" Only load this indent file when no other was loaded.
if exists('b:did_indent')
@@ -114,7 +115,13 @@ function GetYAMLIndent(lnum)
"
" - |-
" Block scalar without indentation indicator
- return previndent+shiftwidth()
+ if prevline =~# '^\s*-\s.*:$'
+ " Special case: list item with mapping key (- key:)
+ " Need to account for the "- " prefix
+ return previndent + 2 + shiftwidth()
+ else
+ return previndent+shiftwidth()
+ endif
elseif prevline =~# ' [:-]\ [|>]%(\d+[+\-]?|[+\-]?\d+)%(\#.*|\s*)$'
" - |+2
" block scalar with indentation indicator
@@ -136,7 +143,10 @@ function GetYAMLIndent(lnum)
let prevmapline = s:FindPrevLEIndentedLineMatchingRegex(a:lnum,
\ s:mapkeyregex)
if getline(prevmapline) =~# '^\s*- '
- return indent(prevmapline) + 2
+ " Previous mapping key is in a list item (- key:)
+ " The key effectively starts at indent + 2 (after "- ")
+ " Content under it should be indented relative to the key position
+ return indent(prevmapline) + 2 + shiftwidth()
else
return indent(prevmapline)
endif