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.dimoiu@keysight.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Cezar Dimoiu
2026-01-08 20:05:07 +00:00
committed by Christian Brabandt
parent 4895ae8c0c
commit 9179ddc060
3 changed files with 28 additions and 2 deletions

View File

@@ -18,3 +18,11 @@ map: |
line1
line2
# END_INDENT
# START_INDENT
list:
- element1:
foo: bar
- element2:
foo: bar
# END_INDENT

View File

@@ -18,3 +18,11 @@ map: |
line1
line2
# END_INDENT
# START_INDENT
list:
- element1:
foo: bar
- element2:
foo: bar
# END_INDENT

View File

@@ -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 =~# '\v[:-]\ [|>]%(\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