@@ -1805,12 +1805,14 @@ VimLParser.prototype.parse_cmd_call = function() {
1805
1805
this . add_node ( node ) ;
1806
1806
}
1807
1807
1808
- VimLParser . prototype . parse_heredoc = function ( ) {
1808
+ VimLParser . prototype . parse_heredoc = function ( prefix ) {
1809
1809
var node = Node ( NODE_HEREDOC ) ;
1810
1810
node . pos = this . ea . cmdpos ;
1811
1811
node . op = "" ;
1812
1812
node . rlist = [ ] ;
1813
1813
node . body = [ ] ;
1814
+ // allow prefix to precede heredoc end marker if true
1815
+ var is_trim = FALSE ;
1814
1816
while ( TRUE ) {
1815
1817
this . reader . skip_white ( ) ;
1816
1818
var pos = this . reader . getpos ( ) ;
@@ -1827,6 +1829,9 @@ VimLParser.prototype.parse_heredoc = function() {
1827
1829
keynode . pos = pos ;
1828
1830
keynode . value = key ;
1829
1831
viml_add ( node . rlist , keynode ) ;
1832
+ if ( key == "trim" ) {
1833
+ var is_trim = TRUE ;
1834
+ }
1830
1835
}
1831
1836
}
1832
1837
if ( node . op == "" ) {
@@ -1839,7 +1844,7 @@ VimLParser.prototype.parse_heredoc = function() {
1839
1844
}
1840
1845
var pos = this . reader . getpos ( ) ;
1841
1846
var line = this . reader . getn ( - 1 ) ;
1842
- if ( line == node . op ) {
1847
+ if ( line == node . op || is_trim && line == prefix + node . op ) {
1843
1848
return node ;
1844
1849
}
1845
1850
var linenode = Node ( NODE_STRING ) ;
@@ -1894,7 +1899,30 @@ VimLParser.prototype.parse_cmd_let = function() {
1894
1899
this . reader . getn ( viml_len ( s2 ) ) ;
1895
1900
this . reader . skip_white ( ) ;
1896
1901
node . op = s2 ;
1897
- node . right = this . parse_heredoc ( ) ;
1902
+ // compute allowed prefix for heredoc end marker (e.g. EOF)
1903
+ var pos = this . reader . tell ( ) ;
1904
+ while ( this . reader . tell ( ) > 0 ) {
1905
+ if ( this . reader . peek ( ) == "<EOL>" ) {
1906
+ this . reader . seek_cur ( 1 ) ;
1907
+ break ;
1908
+ }
1909
+ this . reader . seek_cur ( - 1 ) ;
1910
+ }
1911
+ var prefix = "" ;
1912
+ while ( TRUE ) {
1913
+ var c = this . reader . getn ( 1 ) ;
1914
+ if ( c == ":" ) {
1915
+ // any presence of leading ':' disables prefix for heredoc end marker
1916
+ var prefix = "" ;
1917
+ break ;
1918
+ }
1919
+ else if ( ! iswhite ( c ) ) {
1920
+ break ;
1921
+ }
1922
+ prefix += c ;
1923
+ }
1924
+ this . reader . seek_set ( pos ) ;
1925
+ node . right = this . parse_heredoc ( prefix ) ;
1898
1926
this . add_node ( node ) ;
1899
1927
return ;
1900
1928
}
0 commit comments