@@ -1509,13 +1509,15 @@ function! s:VimLParser.parse_cmd_call() abort
15091509 call self .add_node (node)
15101510endfunction
15111511
1512- function ! s: VimLParser .parse_heredoc () abort
1512+ function ! s: VimLParser .parse_heredoc (prefix ) abort
15131513 let node = s: Node (s: NODE_HEREDOC )
15141514 let node.pos = self .ea .cmdpos
15151515 let node.op = ' '
15161516 let node.rlist = []
15171517 let node.body = []
15181518
1519+ " allow prefix to precede heredoc end marker if true
1520+ let is_trim = s: FALSE
15191521 while s: TRUE
15201522 call self .reader.skip_white ()
15211523 let pos = self .reader.getpos ()
@@ -1531,6 +1533,9 @@ function! s:VimLParser.parse_heredoc() abort
15311533 let keynode.pos = pos
15321534 let keynode.value = key
15331535 call add (node.rlist, keynode)
1536+ if key == # ' trim'
1537+ let is_trim = s: TRUE
1538+ endif
15341539 endif
15351540 endwhile
15361541 if node.op == # ' '
@@ -1543,7 +1548,7 @@ function! s:VimLParser.parse_heredoc() abort
15431548 endif
15441549 let pos = self .reader.getpos ()
15451550 let line = self .reader.getn (-1 )
1546- if line == # node.op
1551+ if line == # node.op || is_trim && line == # a: prefix . node. op
15471552 return node
15481553 endif
15491554 let linenode = s: Node (s: NODE_STRING )
@@ -1600,7 +1605,31 @@ function! s:VimLParser.parse_cmd_let() abort
16001605 call self .reader.getn (len (s2))
16011606 call self .reader.skip_white ()
16021607 let node.op = s2
1603- let node.right = self .parse_heredoc ()
1608+
1609+ " compute allowed prefix for heredoc end marker (e.g. EOF)
1610+ let pos = self .reader.tell ()
1611+ while self .reader.tell () > 0
1612+ if self .reader.peek () == # ' <EOL>'
1613+ call self .reader.seek_cur (1 )
1614+ break
1615+ endif
1616+ call self .reader.seek_cur (-1 )
1617+ endwhile
1618+ let prefix = ' '
1619+ while s: TRUE
1620+ let c = self .reader.getn (1 )
1621+ if c == # ' :'
1622+ " any presence of leading ':' disables prefix for heredoc end marker
1623+ let prefix = ' '
1624+ break
1625+ elseif ! s: iswhite (c )
1626+ break
1627+ endif
1628+ let prefix .= c
1629+ endwhile
1630+ call self .reader.seek_set (pos)
1631+
1632+ let node.right = self .parse_heredoc (prefix)
16041633 call self .add_node (node)
16051634 return
16061635 elseif s1 == # ' ='
0 commit comments