The right way to do it would be to use an external program if the markup language presents a complex structure or particular edge cases, like the bunch of tools you can find for JSON.
Though YAML seems to be pretty straightforward Even if YAML seems to be pretty complex, I started with a one liner working on your snippet to end up with this Vim script you could place in ftplugin/yaml.vim
:
function! YAMLTree()
let l:list = []
let l:cur = getcurpos()[1]
" Retrieve the current line indentation
let l:indent = indent(l:cur) + 1
" Loop from the cursor position to the top of the file
for l:n in reverse(range(1, l:cur))
let l:i = indent(l:n)
let l:line = getline(l:n)
let l:key = substitute(l:line, '^\s*\(\<\w\+\>\):.*', "\\1", '')
" If the indentation decreased and the pattern matched
if (l:i < l:indent && l:key !=# l:line)
let l:list = add(l:list, l:key)
let l:indent = l:i
endif
endfor
let l:list = reverse(l:list)
echo join(l:list, ' -> ')
endfunction
nnoremap <F5> :call YAMLTree()<CR>
It loops on each line from the cursor to the top looking for a word \w+
between zero or more spaces \s*
and a colon :
, followed by anything. It also checks for indentation to recognize the keys hierarchy.
P.S. My first thought was about indent highlighting plugins like indentLine or vim-indent-guides. That's something I initially missed on Vim, but I think the heavy slow-down it can cause cured me.