@@ -1805,12 +1805,14 @@ VimLParser.prototype.parse_cmd_call = function() {
18051805 this . add_node ( node ) ;
18061806}
18071807
1808- VimLParser . prototype . parse_heredoc = function ( ) {
1808+ VimLParser . prototype . parse_heredoc = function ( prefix ) {
18091809 var node = Node ( NODE_HEREDOC ) ;
18101810 node . pos = this . ea . cmdpos ;
18111811 node . op = "" ;
18121812 node . rlist = [ ] ;
18131813 node . body = [ ] ;
1814+ // allow prefix to precede heredoc end marker if true
1815+ var is_trim = FALSE ;
18141816 while ( TRUE ) {
18151817 this . reader . skip_white ( ) ;
18161818 var pos = this . reader . getpos ( ) ;
@@ -1827,6 +1829,9 @@ VimLParser.prototype.parse_heredoc = function() {
18271829 keynode . pos = pos ;
18281830 keynode . value = key ;
18291831 viml_add ( node . rlist , keynode ) ;
1832+ if ( key == "trim" ) {
1833+ var is_trim = TRUE ;
1834+ }
18301835 }
18311836 }
18321837 if ( node . op == "" ) {
@@ -1839,7 +1844,7 @@ VimLParser.prototype.parse_heredoc = function() {
18391844 }
18401845 var pos = this . reader . getpos ( ) ;
18411846 var line = this . reader . getn ( - 1 ) ;
1842- if ( line == node . op ) {
1847+ if ( line == node . op || is_trim && line == prefix + node . op ) {
18431848 return node ;
18441849 }
18451850 var linenode = Node ( NODE_STRING ) ;
@@ -1894,7 +1899,30 @@ VimLParser.prototype.parse_cmd_let = function() {
18941899 this . reader . getn ( viml_len ( s2 ) ) ;
18951900 this . reader . skip_white ( ) ;
18961901 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 ) ;
18981926 this . add_node ( node ) ;
18991927 return ;
19001928 }
0 commit comments