Skip to content

Commit 3cb0a93

Browse files
committed
allow leading spaces for heredoc end marker
1 parent 4f1e224 commit 3cb0a93

File tree

3 files changed

+130
-14
lines changed

3 files changed

+130
-14
lines changed

autoload/vimlparser.vim

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1509,13 +1509,15 @@ function! s:VimLParser.parse_cmd_call() abort
15091509
call self.add_node(node)
15101510
endfunction
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 ==# '='

js/vimlparser.js

Lines changed: 54 additions & 6 deletions
Large diffs are not rendered by default.

py/vimlparser.py

Lines changed: 44 additions & 5 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)