Patch 8.1.1585
Problem:    :let-heredoc does not trim enough.
Solution:   Trim indent from the contents based on the indent of the first
            line.  Use let-heredoc in more tests.
Files:      runtime/doc/eval.txt, src/eval.c, src/testdir/test_balloon.vim,
            src/testdir/test_cindent.vim, src/testdir/test_const.vim,
            src/testdir/test_debugger.vim, src/testdir/test_functions.vim,
            src/testdir/test_goto.vim, src/testdir/test_gui.vim,
            src/testdir/test_highlight.vim, src/testdir/test_join.vim,
            src/testdir/test_let.vim, src/testdir/test_memory_usage.vim,
            src/testdir/test_messages.vim,
            src/testdir/test_mksession_utf8.vim, src/testdir/test_normal.vim,
            src/testdir/test_popup.vim, src/testdir/test_popupwin.vim,
            src/testdir/test_profile.vim, src/testdir/test_quickfix.vim,
            src/testdir/test_xxd.vim


*** ../vim-8.1.1584/runtime/doc/eval.txt        2019-06-22 01:40:38.173537408 
+0200
--- runtime/doc/eval.txt        2019-06-24 00:46:28.386980521 +0200
***************
*** 11564,11576 ****
                        If {marker} is not supplied, then "." is used as the
                        default marker.
  
!                       Any white space characters in the lines of text are
!                       preserved.  If "trim" is specified before {marker},
!                       then all the leading indentation exactly matching the
!                       leading indentation before `let` is stripped from the
!                       input lines and the line containing {marker}.  Note
!                       that the difference between space and tab matters
!                       here.
  
                        If {var-name} didn't exist yet, it is created.
                        Cannot be followed by another command, but can be
--- 11565,11588 ----
                        If {marker} is not supplied, then "." is used as the
                        default marker.
  
!                       Without "trim" any white space characters in the lines
!                       of text are preserved.  If "trim" is specified before
!                       {marker}, then indentation is stripped so you can do: >
!                               let text =<< trim END
!                                  if ok
!                                    echo 'done'
!                                  endif
!                               END
! <                     Results in: ["if ok", "  echo 'done'", "endif"]
!                       The marker must line up with "let" and the indentation
!                       of the first line is removed from all the text lines.
!                       Specifically: all the leading indentation exactly
!                       matching the leading indentation of the first
!                       non-empty text line is stripped from the input lines.
!                       All leading indentation exactly matching the leading
!                       indentation before `let` is stripped from the line
!                       containing {marker}.  Note that the difference between
!                       space and tab matters here.
  
                        If {var-name} didn't exist yet, it is created.
                        Cannot be followed by another command, but can be
*** ../vim-8.1.1584/src/eval.c  2019-06-23 01:46:11.836059807 +0200
--- src/eval.c  2019-06-24 00:46:28.386980521 +0200
***************
*** 1254,1260 ****
      char_u    *marker;
      list_T    *l;
      char_u    *p;
!     int               indent_len = 0;
  
      if (eap->getline == NULL)
      {
--- 1254,1262 ----
      char_u    *marker;
      list_T    *l;
      char_u    *p;
!     int               marker_indent_len = 0;
!     int               text_indent_len = 0;
!     char_u    *text_indent = NULL;
  
      if (eap->getline == NULL)
      {
***************
*** 1268,1282 ****
      {
        cmd = skipwhite(cmd + 4);
  
!       // Trim the indentation from all the lines in the here document
        // The amount of indentation trimmed is the same as the indentation of
!       // the :let command line.
        p = *eap->cmdlinep;
        while (VIM_ISWHITE(*p))
        {
            p++;
!           indent_len++;
        }
      }
  
      // The marker is the next word.  Default marker is "."
--- 1270,1286 ----
      {
        cmd = skipwhite(cmd + 4);
  
!       // Trim the indentation from all the lines in the here document.
        // The amount of indentation trimmed is the same as the indentation of
!       // the first line after the :let command line.  To find the end marker
!       // the indent of the :let command line is trimmed.
        p = *eap->cmdlinep;
        while (VIM_ISWHITE(*p))
        {
            p++;
!           marker_indent_len++;
        }
+       text_indent_len = -1;
      }
  
      // The marker is the next word.  Default marker is "."
***************
*** 1300,1330 ****
  
      for (;;)
      {
!       int     i = 0;
  
        theline = eap->getline(NUL, eap->cookie, 0);
-       if (theline != NULL && indent_len > 0)
-       {
-           // trim the indent matching the first line
-           if (STRNCMP(theline, *eap->cmdlinep, indent_len) == 0)
-               i = indent_len;
-       }
- 
        if (theline == NULL)
        {
            semsg(_("E990: Missing end marker '%s'"), marker);
            break;
        }
!       if (STRCMP(marker, theline + i) == 0)
        {
            vim_free(theline);
            break;
        }
  
!       if (list_append_string(l, theline + i, -1) == FAIL)
            break;
        vim_free(theline);
      }
  
      return l;
  }
--- 1304,1353 ----
  
      for (;;)
      {
!       int     mi = 0;
!       int     ti = 0;
  
        theline = eap->getline(NUL, eap->cookie, 0);
        if (theline == NULL)
        {
            semsg(_("E990: Missing end marker '%s'"), marker);
            break;
        }
! 
!       // with "trim": skip the indent matching the :let line to find the
!       // marker
!       if (marker_indent_len > 0
!               && STRNCMP(theline, *eap->cmdlinep, marker_indent_len) == 0)
!           mi = marker_indent_len;
!       if (STRCMP(marker, theline + mi) == 0)
        {
            vim_free(theline);
            break;
        }
  
!       if (text_indent_len == -1 && *theline != NUL)
!       {
!           // set the text indent from the first line.
!           p = theline;
!           text_indent_len = 0;
!           while (VIM_ISWHITE(*p))
!           {
!               p++;
!               text_indent_len++;
!           }
!           text_indent = vim_strnsave(theline, text_indent_len);
!       }
!       // with "trim": skip the indent matching the first line
!       if (text_indent != NULL)
!           for (ti = 0; ti < text_indent_len; ++ti)
!               if (theline[ti] != text_indent[ti])
!                   break;
! 
!       if (list_append_string(l, theline + ti, -1) == FAIL)
            break;
        vim_free(theline);
      }
+     vim_free(text_indent);
  
      return l;
  }
*** ../vim-8.1.1584/src/testdir/test_balloon.vim        2019-06-15 
17:57:43.968724059 +0200
--- src/testdir/test_balloon.vim        2019-06-24 00:46:28.386980521 +0200
***************
*** 13,19 ****
    throw 'Skipped: cannot make screendumps'
  endif
  
! let s:common_script =<< [CODE]
    call setline(1, ["one one one", "two tXo two", "three three three"])
    set balloonevalterm balloonexpr=MyBalloonExpr() balloondelay=100
    func MyBalloonExpr()
--- 13,19 ----
    throw 'Skipped: cannot make screendumps'
  endif
  
! let s:common_script =<< trim [CODE]
    call setline(1, ["one one one", "two tXo two", "three three three"])
    set balloonevalterm balloonexpr=MyBalloonExpr() balloondelay=100
    func MyBalloonExpr()
*** ../vim-8.1.1584/src/testdir/test_cindent.vim        2019-05-31 
20:02:47.567231180 +0200
--- src/testdir/test_cindent.vim        2019-06-24 00:46:28.386980521 +0200
***************
*** 18,40 ****
    " Test for cino-E
  
    let without_ind =<< trim [CODE]
!   #ifdef __cplusplus
!   extern "C" {
!   #endif
!   int func_a(void);
!   #ifdef __cplusplus
!   }
!   #endif
    [CODE]
  
    let with_ind =<< trim [CODE]
!   #ifdef __cplusplus
!   extern "C" {
!   #endif
!       int func_a(void);
!   #ifdef __cplusplus
!   }
!   #endif
    [CODE]
    new
    setlocal cindent cinoptions=E0
--- 18,40 ----
    " Test for cino-E
  
    let without_ind =<< trim [CODE]
!     #ifdef __cplusplus
!     extern "C" {
!     #endif
!     int func_a(void);
!     #ifdef __cplusplus
!     }
!     #endif
    [CODE]
  
    let with_ind =<< trim [CODE]
!     #ifdef __cplusplus
!     extern "C" {
!     #endif
!       int func_a(void);
!     #ifdef __cplusplus
!     }
!     #endif
    [CODE]
    new
    setlocal cindent cinoptions=E0
***************
*** 89,118 ****
    endfunc
    setl expandtab sw=8 indentkeys+=; indentexpr=MyIndentFunction()
    let testinput =<< trim [CODE]
!   var_a = something()
!   b = something()
    [CODE]
    call setline(1, testinput)
    call cursor(1, 1)
    call feedkeys("^\<c-v>j$A;\<esc>", 'tnix')
!   let expected =<< trim [CODE]
!           var_a = something();
!   b = something();
!   [CODE]
    call assert_equal(expected, getline(1, '$'))
  
    %d
!   let testinput =<< trim [CODE]
!                   var_a = something()
!                   b = something()
!   [CODE]
    call setline(1, testinput)
    call cursor(1, 1)
    call feedkeys("^\<c-v>j$A;\<esc>", 'tnix')
!   let expected =<< trim [CODE]
!           var_a = something();
!                   b = something()
!   [CODE]
    call assert_equal(expected, getline(1, '$'))
    bw!
  endfunc
--- 89,118 ----
    endfunc
    setl expandtab sw=8 indentkeys+=; indentexpr=MyIndentFunction()
    let testinput =<< trim [CODE]
!     var_a = something()
!     b = something()
    [CODE]
    call setline(1, testinput)
    call cursor(1, 1)
    call feedkeys("^\<c-v>j$A;\<esc>", 'tnix')
!   let expected =<< [CODE]
!         var_a = something();
! b = something();
! [CODE]
    call assert_equal(expected, getline(1, '$'))
  
    %d
!   let testinput =<< [CODE]
!                 var_a = something()
!                 b = something()
! [CODE]
    call setline(1, testinput)
    call cursor(1, 1)
    call feedkeys("^\<c-v>j$A;\<esc>", 'tnix')
!   let expected =<< [CODE]
!         var_a = something();
!                 b = something()
! [CODE]
    call assert_equal(expected, getline(1, '$'))
    bw!
  endfunc
***************
*** 2069,2082 ****
    let &wm = &columns - 20
  
    let code =<< trim [CODE]
!   {
! 
!   /* this is
!    * a real serious important big
!    * comment
!    */
!       /* insert " about life, the universe, and the rest" after "serious" */
!   }
    [CODE]
  
    call append(0, code)
--- 2069,2082 ----
    let &wm = &columns - 20
  
    let code =<< trim [CODE]
!     {
!   
!     /* this is
!      * a real serious important big
!      * comment
!      */
!       /* insert " about life, the universe, and the rest" after "serious" */
!     }
    [CODE]
  
    call append(0, code)
***************
*** 3243,3274 ****
    setl cindent ts=4 sw=4
    setl cino=+20
  
!   let code =<< trim [CODE]
!       void
!   foo()
!   {
!       if (a)
!       {
!       } else
!               asdf;
!   }
!   [CODE]
  
    call append(0, code)
    normal gg
    normal ]]=][
  
!   let expected =<< trim [CODE]
!       void
!   foo()
!   {
!       if (a)
!       {
!       } else
!               asdf;
!   }
  
!   [CODE]
  
    call assert_equal(expected, getline(1, '$'))
    enew! | close
--- 3243,3274 ----
    setl cindent ts=4 sw=4
    setl cino=+20
  
!   let code =<< [CODE]
!       void
! foo()
! {
!       if (a)
!       {
!       } else
!               asdf;
! }
! [CODE]
  
    call append(0, code)
    normal gg
    normal ]]=][
  
!   let expected =<< [CODE]
!       void
! foo()
! {
!       if (a)
!       {
!       } else
!               asdf;
! }
  
! [CODE]
  
    call assert_equal(expected, getline(1, '$'))
    enew! | close
***************
*** 3461,3467 ****
    normal =][
  
    let expected =<< trim [CODE]
! 
        void
    func(int a
    #if defined(FOO)
--- 3461,3467 ----
    normal =][
  
    let expected =<< trim [CODE]
!   
        void
    func(int a
    #if defined(FOO)
*** ../vim-8.1.1584/src/testdir/test_const.vim  2019-06-16 15:41:54.730684164 
+0200
--- src/testdir/test_const.vim  2019-06-24 00:46:28.386980521 +0200
***************
*** 18,24 ****
      const n = v:null
      const bl = 0zC0FFEE
      const here =<< trim EOS
!     hello
      EOS
  
      call assert_true(exists('i'))
--- 18,24 ----
      const n = v:null
      const bl = 0zC0FFEE
      const here =<< trim EOS
!       hello
      EOS
  
      call assert_true(exists('i'))
***************
*** 84,90 ****
      const l:n = v:null
      const l:bl = 0zC0FFEE
      const l:here =<< trim EOS
!     hello
      EOS
  
      call assert_fails('let l:i = 1', 'E741:')
--- 84,90 ----
      const l:n = v:null
      const l:bl = 0zC0FFEE
      const l:here =<< trim EOS
!       hello
      EOS
  
      call assert_fails('let l:i = 1', 'E741:')
*** ../vim-8.1.1584/src/testdir/test_debugger.vim       2019-06-06 
16:12:05.923134646 +0200
--- src/testdir/test_debugger.vim       2019-06-24 00:46:28.386980521 +0200
***************
*** 26,52 ****
    endif
  
    " Create a Vim script with some functions
!   call writefile([
!             \ 'func Foo()',
!             \ '  let var1 = 1',
!             \ '  let var2 = Bar(var1) + 9',
!             \ '  return var2',
!             \ 'endfunc',
!             \ 'func Bar(var)',
!             \ '  let var1 = 2 + a:var',
!             \ '  let var2 = Bazz(var1) + 4',
!             \ '  return var2',
!             \ 'endfunc',
!             \ 'func Bazz(var)',
!             \ '  try',
!             \ '    let var1 = 3 + a:var',
!             \ '    let var3 = "another var"',
!             \ '    let var3 = "value2"',
!             \ '  catch',
!             \ '    let var4 = "exception"',
!             \ '  endtry',
!             \ '  return var1',
!             \ 'endfunc'], 'Xtest.vim')
  
    " Start Vim in a terminal
    let buf = RunVimInTerminal('-S Xtest.vim', {})
--- 26,54 ----
    endif
  
    " Create a Vim script with some functions
!   let lines =<< trim END
!       func Foo()
!         let var1 = 1
!         let var2 = Bar(var1) + 9
!         return var2
!       endfunc
!       func Bar(var)
!         let var1 = 2 + a:var
!         let var2 = Bazz(var1) + 4
!         return var2
!       endfunc
!       func Bazz(var)
!         try
!           let var1 = 3 + a:var
!           let var3 = "another var"
!           let var3 = "value2"
!         catch
!           let var4 = "exception"
!         endtry
!         return var1
!       endfunc
!   END
!   call writefile(lines, 'Xtest.vim')
  
    " Start Vim in a terminal
    let buf = RunVimInTerminal('-S Xtest.vim', {})
***************
*** 294,304 ****
    " Tests for :breakadd file and :breakadd here
    " Breakpoints should be set before sourcing the file
  
!   call writefile([
!             \ 'let var1 = 10',
!             \ 'let var2 = 20',
!             \ 'let var3 = 30',
!             \ 'let var4 = 40'], 'Xtest.vim')
  
    " Start Vim in a terminal
    let buf = RunVimInTerminal('Xtest.vim', {})
--- 296,308 ----
    " Tests for :breakadd file and :breakadd here
    " Breakpoints should be set before sourcing the file
  
!   let lines =<< trim END
!       let var1 = 10
!       let var2 = 20
!       let var3 = 30
!       let var4 = 40
!   END
!   call writefile(lines, 'Xtest.vim')
  
    " Start Vim in a terminal
    let buf = RunVimInTerminal('Xtest.vim', {})
*** ../vim-8.1.1584/src/testdir/test_functions.vim      2019-06-18 
23:07:34.705315692 +0200
--- src/testdir/test_functions.vim      2019-06-24 00:46:28.386980521 +0200
***************
*** 277,289 ****
    if executable('cscript')
      new Xfile
      wq
!     call writefile([
!     \ 'Set fs = CreateObject("Scripting.FileSystemObject")',
!     \ 'Set ws = WScript.CreateObject("WScript.Shell")',
!     \ 'Set shortcut = ws.CreateShortcut("Xlink.lnk")',
!     \ 'shortcut.TargetPath = fs.BuildPath(ws.CurrentDirectory, "Xfile")', 
!     \ 'shortcut.Save'
!     \], 'link.vbs')
      silent !cscript link.vbs
      call delete('link.vbs')
      call assert_equal(s:normalize_fname(getcwd() . '\Xfile'), 
s:normalize_fname(resolve('./Xlink.lnk')))
--- 277,290 ----
    if executable('cscript')
      new Xfile
      wq
!     let lines =<< trim END
!       Set fs = CreateObject("Scripting.FileSystemObject")
!       Set ws = WScript.CreateObject("WScript.Shell")
!       Set shortcut = ws.CreateShortcut("Xlink.lnk")
!       shortcut.TargetPath = fs.BuildPath(ws.CurrentDirectory, "Xfile")
!       shortcut.Save
!     END
!     call writefile(lines, 'link.vbs')
      silent !cscript link.vbs
      call delete('link.vbs')
      call assert_equal(s:normalize_fname(getcwd() . '\Xfile'), 
s:normalize_fname(resolve('./Xlink.lnk')))
*** ../vim-8.1.1584/src/testdir/test_goto.vim   2019-05-20 22:12:30.720442793 
+0200
--- src/testdir/test_goto.vim   2019-06-24 00:46:28.386980521 +0200
***************
*** 16,27 ****
  
  func Test_gD()
    let lines =<< trim [CODE]
!   int x;
! 
!   int func(void)
!   {
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gD', lines, 1, 5)
--- 16,27 ----
  
  func Test_gD()
    let lines =<< trim [CODE]
!     int x;
!   
!     int func(void)
!     {
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gD', lines, 1, 5)
***************
*** 29,40 ****
  
  func Test_gD_too()
    let lines =<< trim [CODE]
-   Filename x;
- 
-   int Filename
-   int func() {
      Filename x;
!     return x;
    [CODE]
  
    call XTest_goto_decl('gD', lines, 1, 10)
--- 29,40 ----
  
  func Test_gD_too()
    let lines =<< trim [CODE]
      Filename x;
!   
!     int Filename
!     int func() {
!       Filename x;
!       return x;
    [CODE]
  
    call XTest_goto_decl('gD', lines, 1, 10)
***************
*** 42,54 ****
  
  func Test_gD_comment()
    let lines =<< trim [CODE]
!   /* int x; */
!   int x;
! 
!   int func(void)
!   {
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gD', lines, 2, 5)
--- 42,54 ----
  
  func Test_gD_comment()
    let lines =<< trim [CODE]
!     /* int x; */
!     int x;
!   
!     int func(void)
!     {
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gD', lines, 2, 5)
***************
*** 56,68 ****
  
  func Test_gD_inline_comment()
    let lines =<< trim [CODE]
!   int y /* , x */;
!   int x;
! 
!   int func(void)
!   {
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gD', lines, 2, 5)
--- 56,68 ----
  
  func Test_gD_inline_comment()
    let lines =<< trim [CODE]
!     int y /* , x */;
!     int x;
!   
!     int func(void)
!     {
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gD', lines, 2, 5)
***************
*** 70,82 ****
  
  func Test_gD_string()
    let lines =<< trim [CODE]
!   char *s[] = "x";
!   int x = 1;
! 
!   int func(void)
!   {
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gD', lines, 2, 5)
--- 70,82 ----
  
  func Test_gD_string()
    let lines =<< trim [CODE]
!     char *s[] = "x";
!     int x = 1;
!   
!     int func(void)
!     {
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gD', lines, 2, 5)
***************
*** 84,95 ****
  
  func Test_gD_string_same_line()
    let lines =<< trim [CODE]
!   char *s[] = "x", int x = 1;
! 
!   int func(void)
!   {
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gD', lines, 1, 22)
--- 84,95 ----
  
  func Test_gD_string_same_line()
    let lines =<< trim [CODE]
!     char *s[] = "x", int x = 1;
!   
!     int func(void)
!     {
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gD', lines, 1, 22)
***************
*** 97,109 ****
  
  func Test_gD_char()
    let lines =<< trim [CODE]
!   char c = 'x';
!   int x = 1;
! 
!   int func(void)
!   {
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gD', lines, 2, 5)
--- 97,109 ----
  
  func Test_gD_char()
    let lines =<< trim [CODE]
!     char c = 'x';
!     int x = 1;
!   
!     int func(void)
!     {
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gD', lines, 2, 5)
***************
*** 111,122 ****
  
  func Test_gd()
    let lines =<< trim [CODE]
!   int x;
! 
!   int func(int x)
!   {
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 3, 14)
--- 111,122 ----
  
  func Test_gd()
    let lines =<< trim [CODE]
!     int x;
!   
!     int func(int x)
!     {
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 3, 14)
***************
*** 124,138 ****
  
  func Test_gd_not_local()
    let lines =<< trim [CODE]
!   int func1(void)
!   {
!     return x;
!   }
! 
!   int func2(int x)
!   {
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 3, 10)
--- 124,138 ----
  
  func Test_gd_not_local()
    let lines =<< trim [CODE]
!     int func1(void)
!     {
!       return x;
!     }
!   
!     int func2(int x)
!     {
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 3, 10)
***************
*** 140,150 ****
  
  func Test_gd_kr_style()
    let lines =<< trim [CODE]
!   int func(x)
!     int x;
!   {
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 2, 7)
--- 140,150 ----
  
  func Test_gd_kr_style()
    let lines =<< trim [CODE]
!     int func(x)
!       int x;
!     {
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 2, 7)
***************
*** 152,166 ****
  
  func Test_gd_missing_braces()
    let lines =<< trim [CODE]
!   def func1(a)
!     a + 1
!   end
! 
!   a = 1
! 
!   def func2()
!     return a
!   end
    [CODE]
  
    call XTest_goto_decl('gd', lines, 1, 11)
--- 152,166 ----
  
  func Test_gd_missing_braces()
    let lines =<< trim [CODE]
!     def func1(a)
!       a + 1
!     end
!   
!     a = 1
!   
!     def func2()
!       return a
!     end
    [CODE]
  
    call XTest_goto_decl('gd', lines, 1, 11)
***************
*** 168,179 ****
  
  func Test_gd_comment()
    let lines =<< trim [CODE]
!   int func(void)
!   {
!     /* int x; */
!     int x;
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 4, 7)
--- 168,179 ----
  
  func Test_gd_comment()
    let lines =<< trim [CODE]
!     int func(void)
!     {
!       /* int x; */
!       int x;
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 4, 7)
***************
*** 181,192 ****
  
  func Test_gd_comment_in_string()
    let lines =<< trim [CODE]
!   int func(void)
!   {
!     char *s ="//"; int x;
!     int x;
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 3, 22)
--- 181,192 ----
  
  func Test_gd_comment_in_string()
    let lines =<< trim [CODE]
!     int func(void)
!     {
!       char *s ="//"; int x;
!       int x;
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 3, 22)
***************
*** 195,206 ****
  func Test_gd_string_in_comment()
    set comments=
    let lines =<< trim [CODE]
!   int func(void)
!   {
!     /* " */ int x;
!     int x;
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 3, 15)
--- 195,206 ----
  func Test_gd_string_in_comment()
    set comments=
    let lines =<< trim [CODE]
!     int func(void)
!     {
!       /* " */ int x;
!       int x;
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 3, 15)
***************
*** 209,218 ****
  
  func Test_gd_inline_comment()
    let lines =<< trim [CODE]
!   int func(/* x is an int */ int x)
!   {
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 1, 32)
--- 209,218 ----
  
  func Test_gd_inline_comment()
    let lines =<< trim [CODE]
!     int func(/* x is an int */ int x)
!     {
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 1, 32)
***************
*** 220,229 ****
  
  func Test_gd_inline_comment_only()
    let lines =<< trim [CODE]
!   int func(void) /* one lonely x */
!   {
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 3, 10)
--- 220,229 ----
  
  func Test_gd_inline_comment_only()
    let lines =<< trim [CODE]
!     int func(void) /* one lonely x */
!     {
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 3, 10)
***************
*** 231,246 ****
  
  func Test_gd_inline_comment_body()
    let lines =<< trim [CODE]
!   int func(void)
!   {
!     int y /* , x */;
! 
!     for (/* int x = 0 */; y < 2; y++);
! 
!     int x = 0;
! 
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 7, 7)
--- 231,246 ----
  
  func Test_gd_inline_comment_body()
    let lines =<< trim [CODE]
!     int func(void)
!     {
!       int y /* , x */;
!   
!       for (/* int x = 0 */; y < 2; y++);
!   
!       int x = 0;
!   
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 7, 7)
***************
*** 248,257 ****
  
  func Test_gd_trailing_multiline_comment()
    let lines =<< trim [CODE]
!   int func(int x) /* x is an int */
!   {
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 1, 14)
--- 248,257 ----
  
  func Test_gd_trailing_multiline_comment()
    let lines =<< trim [CODE]
!     int func(int x) /* x is an int */
!     {
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 1, 14)
***************
*** 259,268 ****
  
  func Test_gd_trailing_comment()
    let lines =<< trim [CODE]
!   int func(int x) // x is an int
!   {
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 1, 14)
--- 259,268 ----
  
  func Test_gd_trailing_comment()
    let lines =<< trim [CODE]
!     int func(int x) // x is an int
!     {
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 1, 14)
***************
*** 270,294 ****
  
  func Test_gd_string()
    let lines =<< trim [CODE]
!   int func(void)
!   {
!     char *s = "x";
!     int x = 1;
! 
!     return x;
!   }
    [CODE]
    call XTest_goto_decl('gd', lines, 4, 7)
  endfunc
  
  func Test_gd_string_only()
    let lines =<< trim [CODE]
!   int func(void)
!   {
!     char *s = "x";
! 
!     return x;
!   }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 5, 10)
--- 270,294 ----
  
  func Test_gd_string()
    let lines =<< trim [CODE]
!     int func(void)
!     {
!       char *s = "x";
!       int x = 1;
!   
!       return x;
!     }
    [CODE]
    call XTest_goto_decl('gd', lines, 4, 7)
  endfunc
  
  func Test_gd_string_only()
    let lines =<< trim [CODE]
!     int func(void)
!     {
!       char *s = "x";
!   
!       return x;
!     }
    [CODE]
  
    call XTest_goto_decl('gd', lines, 5, 10)
***************
*** 311,331 ****
  func Test_gd_local_block()
    let lines =<< trim [CODE]
      int main()
-   {
-     char *a = "NOT NULL";
-     if(a)
-     {
-       char *b = a;
-       printf("%s\n", b);
-     }
-     else
      {
!       char *b = "NULL";
!       return b;
      }
- 
-     return 0;
-   }
    [CODE]
  
    call XTest_goto_decl('1gd', lines, 11, 11)
--- 311,331 ----
  func Test_gd_local_block()
    let lines =<< trim [CODE]
      int main()
      {
!       char *a = "NOT NULL";
!       if(a)
!       {
!         char *b = a;
!         printf("%s\n", b);
!       }
!       else
!       {
!         char *b = "NULL";
!         return b;
!       }
!   
!       return 0;
      }
    [CODE]
  
    call XTest_goto_decl('1gd', lines, 11, 11)
*** ../vim-8.1.1584/src/testdir/test_gui.vim    2019-06-15 17:57:43.968724059 
+0200
--- src/testdir/test_gui.vim    2019-06-24 00:46:28.386980521 +0200
***************
*** 792,801 ****
  func Test_gui_dash_g()
    let cmd = GetVimCommand('Xscriptgui')
    call writefile([""], "Xtestgui")
!   call writefile([
!       \ 'au GUIEnter * call writefile(["insertmode: " . &insertmode], 
"Xtestgui")',
!       \ 'au GUIEnter * qall',
!       \ ], 'Xscriptgui')
    call system(cmd . ' -g')
    call WaitForAssert({-> assert_equal(['insertmode: 0'], 
readfile('Xtestgui'))})
  
--- 792,802 ----
  func Test_gui_dash_g()
    let cmd = GetVimCommand('Xscriptgui')
    call writefile([""], "Xtestgui")
!   let lines =<< trim END
!       au GUIEnter * call writefile(["insertmode: " . &insertmode], "Xtestgui")
!       au GUIEnter * qall
!   END
!   call writefile(lines, 'Xscriptgui')
    call system(cmd . ' -g')
    call WaitForAssert({-> assert_equal(['insertmode: 0'], 
readfile('Xtestgui'))})
  
***************
*** 807,816 ****
  func Test_gui_dash_y()
    let cmd = GetVimCommand('Xscriptgui')
    call writefile([""], "Xtestgui")
!   call writefile([
!       \ 'au GUIEnter * call writefile(["insertmode: " . &insertmode], 
"Xtestgui")',
!       \ 'au GUIEnter * qall',
!       \ ], 'Xscriptgui')
    call system(cmd . ' -y')
    call WaitForAssert({-> assert_equal(['insertmode: 1'], 
readfile('Xtestgui'))})
  
--- 808,818 ----
  func Test_gui_dash_y()
    let cmd = GetVimCommand('Xscriptgui')
    call writefile([""], "Xtestgui")
!   let lines =<< trim END
!       au GUIEnter * call writefile(["insertmode: " . &insertmode], "Xtestgui")
!       au GUIEnter * qall
!   END
!   call writefile(lines, 'Xscriptgui')
    call system(cmd . ' -y')
    call WaitForAssert({-> assert_equal(['insertmode: 1'], 
readfile('Xtestgui'))})
  
*** ../vim-8.1.1584/src/testdir/test_highlight.vim      2019-06-06 
16:12:05.923134646 +0200
--- src/testdir/test_highlight.vim      2019-06-24 00:46:28.386980521 +0200
***************
*** 578,589 ****
      throw 'Skipped: cannot make screendumps'
    endif
  
!   call writefile([
!       \ 'set cursorline cursorcolumn rnu',
!       \ 'call setline(1, ["","1111111111","22222222222","3 here 3",""])',
!       \ 'set wincolor=Pmenu',
!       \ '/here',
!       \ ], 'Xtest_wincolor')
    let buf = RunVimInTerminal('-S Xtest_wincolor', {'rows': 8})
    call term_wait(buf)
    call term_sendkeys(buf, "2G5lvj")
--- 578,590 ----
      throw 'Skipped: cannot make screendumps'
    endif
  
!   let lines =<< trim END
!       set cursorline cursorcolumn rnu
!       call setline(1, ["","1111111111","22222222222","3 here 3",""])
!       set wincolor=Pmenu
!       /here
!   END
!   call writefile(lines, 'Xtest_wincolor')
    let buf = RunVimInTerminal('-S Xtest_wincolor', {'rows': 8})
    call term_wait(buf)
    call term_sendkeys(buf, "2G5lvj")
*** ../vim-8.1.1584/src/testdir/test_join.vim   2019-05-20 22:12:30.720442793 
+0200
--- src/testdir/test_join.vim   2019-06-24 00:46:28.386980521 +0200
***************
*** 100,121 ****
  
    " Expected output
    let expected =<< trim [DATA]
!   asdfasdf. asdf
!   asdfasdf. asdf
!   asdfasdf.  asdf
!   asdfasdf.   asdf
!   asdfasdf.   asdf
!   asdfasdf.    asdf
!   asdfasdf.           asdf
!   asdfasdf asdf
!   asdfasdf asdf
!   asdfasdf  asdf
!   asdfasdf    asdf
!   asdfasdf     asdf
!   asdfasdf    asdf
!   asdfasdf            asdf
!   zx cvn. as dfg? hjkl iop! ert ernop
!   zx cvn. as dfg? hjkl iop! ert ernop
    [DATA]
  
    call assert_equal(expected, getline(1, '$'))
--- 100,121 ----
  
    " Expected output
    let expected =<< trim [DATA]
!     asdfasdf. asdf
!     asdfasdf. asdf
!     asdfasdf.  asdf
!     asdfasdf. asdf
!     asdfasdf.         asdf
!     asdfasdf.  asdf
!     asdfasdf.         asdf
!     asdfasdf asdf
!     asdfasdf asdf
!     asdfasdf  asdf
!     asdfasdf  asdf
!     asdfasdf   asdf
!     asdfasdf  asdf
!     asdfasdf          asdf
!     zx cvn. as dfg? hjkl iop! ert ernop
!     zx cvn. as dfg? hjkl iop! ert ernop
    [DATA]
  
    call assert_equal(expected, getline(1, '$'))
***************
*** 142,163 ****
  
    " Expected output
    let expected =<< trim [DATA]
!   asdfasdf.  asdf
!   asdfasdf.  asdf
!   asdfasdf.  asdf
!   asdfasdf.   asdf
!   asdfasdf.   asdf
!   asdfasdf.    asdf
!   asdfasdf.           asdf
!   asdfasdf asdf
!   asdfasdf asdf
!   asdfasdf  asdf
!   asdfasdf    asdf
!   asdfasdf     asdf
!   asdfasdf    asdf
!   asdfasdf            asdf
!   zx cvn.  as dfg?  hjkl iop!  ert  enop
!   zx cvn.  as dfg? hjkl iop! ert ernop
  
    [DATA]
  
--- 142,163 ----
  
    " Expected output
    let expected =<< trim [DATA]
!     asdfasdf.  asdf
!     asdfasdf.  asdf
!     asdfasdf.  asdf
!     asdfasdf. asdf
!     asdfasdf.         asdf
!     asdfasdf.  asdf
!     asdfasdf.         asdf
!     asdfasdf asdf
!     asdfasdf asdf
!     asdfasdf  asdf
!     asdfasdf  asdf
!     asdfasdf   asdf
!     asdfasdf  asdf
!     asdfasdf          asdf
!     zx cvn.  as dfg?  hjkl iop!  ert  enop
!     zx cvn.  as dfg? hjkl iop! ert ernop
  
    [DATA]
  
***************
*** 176,196 ****
  
    " Expected output
    let expected =<< trim [DATA]
!   asdfasdf.  asdf
!   asdfasdf.  asdf
!   asdfasdf.  asdf
!   asdfasdf.   asdf
!   asdfasdf.   asdf
!   asdfasdf.    asdf
!   asdfasdf.           asdf
!   asdfasdf asdf
!   asdfasdf asdf
!   asdfasdf  asdf
!   asdfasdf    asdf
!   asdfasdf     asdf
!   asdfasdf    asdf
!   asdfasdf            asdf
!   zx cvn.  as dfg? hjkl iop! ert  a
    [DATA]
  
    call assert_equal(expected, getline(1, '$'))
--- 176,196 ----
  
    " Expected output
    let expected =<< trim [DATA]
!     asdfasdf.  asdf
!     asdfasdf.  asdf
!     asdfasdf.  asdf
!     asdfasdf. asdf
!     asdfasdf.         asdf
!     asdfasdf.  asdf
!     asdfasdf.         asdf
!     asdfasdf asdf
!     asdfasdf asdf
!     asdfasdf  asdf
!     asdfasdf  asdf
!     asdfasdf   asdf
!     asdfasdf  asdf
!     asdfasdf          asdf
!     zx cvn.  as dfg? hjkl iop! ert  a
    [DATA]
  
    call assert_equal(expected, getline(1, '$'))
***************
*** 255,272 ****
  
    " Expected output
    let expected =<< trim [CODE]
! {
! /* Make sure the previous comment leader is not removed. */
! /* Make sure the previous comment leader is not removed. */
! // Should the next comment leader be left alone? Yes.
! // Should the next comment leader be left alone? Yes.
! /* Here the comment leader should be left intact. */ // And so should this 
one.
! /* Here the comment leader should be left intact. */ // And so should this 
one.
! if (condition) // Remove the next comment leader! OK, I will.
! action();
! if (condition) // Remove the next comment leader! OK, I will.
! action();
! }
    [CODE]
  
    call assert_equal(expected, getline(1, '$'))
--- 255,272 ----
  
    " Expected output
    let expected =<< trim [CODE]
!     {
!     /* Make sure the previous comment leader is not removed. */
!     /* Make sure the previous comment leader is not removed. */
!     // Should the next comment leader be left alone? Yes.
!     // Should the next comment leader be left alone? Yes.
!     /* Here the comment leader should be left intact. */ // And so should 
this one.
!     /* Here the comment leader should be left intact. */ // And so should 
this one.
!     if (condition) // Remove the next comment leader! OK, I will.
!     action();
!     if (condition) // Remove the next comment leader! OK, I will.
!     action();
!     }
    [CODE]
  
    call assert_equal(expected, getline(1, '$'))
***************
*** 378,407 ****
    exe "normal oSome code!\<CR>// Make sure backspacing does not remove this 
comment leader.\<Esc>0i\<C-H>\<Esc>"
  
    " Expected output
!   let expected =<< [CODE]
! {
! /* Make sure the previous comment leader is not removed.  */
! /* Make sure the previous comment leader is not removed.  */
! /* List: item1 foo bar baz foo bar baz item2 foo bar baz foo bar baz */
! /* List: item1 foo bar baz foo bar baz item2 foo bar baz foo bar baz */
! // Should the next comment leader be left alone?  Yes.
! // Should the next comment leader be left alone?  Yes.
! /* Here the comment leader should be left intact. */ // And so should this 
one.
! /* Here the comment leader should be left intact. */ // And so should this 
one.
! if (condition) // Remove the next comment leader!  OK, I will.
!     action();
! if (condition) // Remove the next comment leader!  OK, I will.
!     action();
! int i = 7 /* foo *// 3 // comment
!  ;
! int i = 7 /* foo *// 3 // comment
!  ;
! ># Note that the last character of the ending comment leader (left angle 
bracket) is a comment leader itself. Make sure that this comment leader is not 
removed from the next line #< < On this line a new comment is opened which 
spans 2 lines. This comment should retain its comment leader.
! ># Note that the last character of the ending comment leader (left angle 
bracket) is a comment leader itself. Make sure that this comment leader is not 
removed from the next line #< < On this line a new comment is opened which 
spans 2 lines. This comment should retain its comment leader.
! 
! Some code!// Make sure backspacing does not remove this comment leader.
! }
! [CODE]
  
    call assert_equal(expected, getline(1, '$'))
    close!
--- 378,407 ----
    exe "normal oSome code!\<CR>// Make sure backspacing does not remove this 
comment leader.\<Esc>0i\<C-H>\<Esc>"
  
    " Expected output
!   let expected =<< trim [CODE]
!     {
!     /* Make sure the previous comment leader is not removed.  */
!     /* Make sure the previous comment leader is not removed.  */
!     /* List: item1 foo bar baz foo bar baz item2 foo bar baz foo bar baz */
!     /* List: item1 foo bar baz foo bar baz item2 foo bar baz foo bar baz */
!     // Should the next comment leader be left alone?  Yes.
!     // Should the next comment leader be left alone?  Yes.
!     /* Here the comment leader should be left intact. */ // And so should 
this one.
!     /* Here the comment leader should be left intact. */ // And so should 
this one.
!     if (condition) // Remove the next comment leader!  OK, I will.
!         action();
!     if (condition) // Remove the next comment leader!  OK, I will.
!         action();
!     int i = 7 /* foo *// 3 // comment
!      ;
!     int i = 7 /* foo *// 3 // comment
!      ;
!     ># Note that the last character of the ending comment leader (left angle 
bracket) is a comment leader itself. Make sure that this comment leader is not 
removed from the next line #< < On this line a new comment is opened which 
spans 2 lines. This comment should retain its comment leader.
!     ># Note that the last character of the ending comment leader (left angle 
bracket) is a comment leader itself. Make sure that this comment leader is not 
removed from the next line #< < On this line a new comment is opened which 
spans 2 lines. This comment should retain its comment leader.
!     
!     Some code!// Make sure backspacing does not remove this comment leader.
!     }
!   [CODE]
  
    call assert_equal(expected, getline(1, '$'))
    close!
*** ../vim-8.1.1584/src/testdir/test_let.vim    2019-05-19 21:37:14.189063500 
+0200
--- src/testdir/test_let.vim    2019-06-24 00:46:28.386980521 +0200
***************
*** 210,219 ****
        END
    call assert_equal(['Line1', '  Line2', "\tLine3", ' END'], var1)
  
    let var1 =<< trim
      Line1
    .
!   call assert_equal(['  Line1'], var1)
  
    " ignore "endfunc"
    let var1 =<< END
--- 210,227 ----
        END
    call assert_equal(['Line1', '  Line2', "\tLine3", ' END'], var1)
  
+   let var1 =<< trim !!!
+       Line1
+        line2
+               Line3
+       !!!
+   !!!
+   call assert_equal(['Line1', ' line2', "\tLine3", '!!!',], var1)
+ 
    let var1 =<< trim
      Line1
    .
!   call assert_equal(['Line1'], var1)
  
    " ignore "endfunc"
    let var1 =<< END
*** ../vim-8.1.1584/src/testdir/test_memory_usage.vim   2019-06-15 
17:57:43.972724036 +0200
--- src/testdir/test_memory_usage.vim   2019-06-24 00:46:28.386980521 +0200
***************
*** 85,98 ****
    " Case: if a local variable captures a:000, funccall object will be free
    " just after it finishes.
    let testfile = 'Xtest.vim'
!   call writefile([
!         \ 'func s:f(...)',
!         \ '  let x = a:000',
!         \ 'endfunc',
!         \ 'for _ in range(10000)',
!         \ '  call s:f(0)',
!         \ 'endfor',
!         \ ], testfile)
  
    let vim = s:vim_new()
    call vim.start('--clean', '-c', 'set noswapfile', testfile)
--- 85,99 ----
    " Case: if a local variable captures a:000, funccall object will be free
    " just after it finishes.
    let testfile = 'Xtest.vim'
!   let lines =<< trim END
!         func s:f(...)
!           let x = a:000
!         endfunc
!         for _ in range(10000)
!           call s:f(0)
!         endfor
!   END
!   call writefile(lines, testfile)
  
    let vim = s:vim_new()
    call vim.start('--clean', '-c', 'set noswapfile', testfile)
***************
*** 122,135 ****
    " free until garbage collector runs, but after that memory usage doesn't
    " increase so much even when rerun Xtest.vim since system memory caches.
    let testfile = 'Xtest.vim'
!   call writefile([
!         \ 'func s:f()',
!         \ '  let x = l:',
!         \ 'endfunc',
!         \ 'for _ in range(10000)',
!         \ '  call s:f()',
!         \ 'endfor',
!         \ ], testfile)
  
    let vim = s:vim_new()
    call vim.start('--clean', '-c', 'set noswapfile', testfile)
--- 123,137 ----
    " free until garbage collector runs, but after that memory usage doesn't
    " increase so much even when rerun Xtest.vim since system memory caches.
    let testfile = 'Xtest.vim'
!   let lines =<< trim END
!         func s:f()
!           let x = l:
!         endfunc
!         for _ in range(10000)
!           call s:f()
!         endfor
!   END
!   call writefile(lines, testfile)
  
    let vim = s:vim_new()
    call vim.start('--clean', '-c', 'set noswapfile', testfile)
*** ../vim-8.1.1584/src/testdir/test_messages.vim       2019-04-20 
23:38:02.189504258 +0200
--- src/testdir/test_messages.vim       2019-06-24 00:46:28.386980521 +0200
***************
*** 102,114 ****
  
    " Set custom statusline built by user-defined function.
    let testfile = 'Xtest.vim'
!   call writefile([
!         \ 'func StatusLine() abort',
!         \ '  return ""',
!         \ 'endfunc',
!         \ 'set statusline=%!StatusLine()',
!         \ 'set laststatus=2',
!         \ ], testfile)
  
    let rows = 10
    let buf = term_start([GetVimProg(), '--clean', '-S', testfile], 
{'term_rows': rows})
--- 102,115 ----
  
    " Set custom statusline built by user-defined function.
    let testfile = 'Xtest.vim'
!   let lines =<< trim END
!         func StatusLine() abort
!           return ""
!         endfunc
!         set statusline=%!StatusLine()
!         set laststatus=2
!   END
!   call writefile(lines, testfile)
  
    let rows = 10
    let buf = term_start([GetVimProg(), '--clean', '-S', testfile], 
{'term_rows': rows})
***************
*** 133,142 ****
  
    " Set custom statusline built by user-defined function.
    let testfile = 'Xtest.vim'
!   call writefile([
!         \ 'set laststatus=2',
!         \ 'inoremap <Esc> <Esc>00',
!         \ ], testfile)
  
    let rows = 10
    let buf = term_start([GetVimProg(), '--clean', '-S', testfile], 
{'term_rows': rows})
--- 134,144 ----
  
    " Set custom statusline built by user-defined function.
    let testfile = 'Xtest.vim'
!   let lines =<< trim END
!         set laststatus=2
!         inoremap <Esc> <Esc>00
!   END
!   call writefile(lines, testfile)
  
    let rows = 10
    let buf = term_start([GetVimProg(), '--clean', '-S', testfile], 
{'term_rows': rows})
*** ../vim-8.1.1584/src/testdir/test_mksession_utf8.vim 2019-06-15 
17:57:43.972724036 +0200
--- src/testdir/test_mksession_utf8.vim 2019-06-24 00:46:28.386980521 +0200
***************
*** 65,96 ****
    mksession! test_mks.out
    let li = filter(readfile('test_mks.out'), 'v:val =~# "\\(^ *normal! 0\\|^ 
*exe ''normal!\\)"')
    let expected =<< trim [DATA]
-   normal! 016|
-   normal! 016|
-   normal! 016|
-   normal! 08|
-   normal! 08|
-   normal! 016|
-   normal! 016|
-   normal! 016|
-     exe 'normal! ' . s:c . '|zs' . 16 . '|'
      normal! 016|
-     exe 'normal! ' . s:c . '|zs' . 16 . '|'
      normal! 016|
-     exe 'normal! ' . s:c . '|zs' . 16 . '|'
      normal! 016|
-     exe 'normal! ' . s:c . '|zs' . 8 . '|'
      normal! 08|
-     exe 'normal! ' . s:c . '|zs' . 8 . '|'
      normal! 08|
-     exe 'normal! ' . s:c . '|zs' . 16 . '|'
      normal! 016|
-     exe 'normal! ' . s:c . '|zs' . 16 . '|'
      normal! 016|
-     exe 'normal! ' . s:c . '|zs' . 16 . '|'
-     normal! 016|
-     exe 'normal! ' . s:c . '|zs' . 16 . '|'
      normal! 016|
    [DATA]
  
    call assert_equal(expected, li)
--- 65,96 ----
    mksession! test_mks.out
    let li = filter(readfile('test_mks.out'), 'v:val =~# "\\(^ *normal! 0\\|^ 
*exe ''normal!\\)"')
    let expected =<< trim [DATA]
      normal! 016|
      normal! 016|
      normal! 016|
      normal! 08|
      normal! 08|
      normal! 016|
      normal! 016|
      normal! 016|
+       exe 'normal! ' . s:c . '|zs' . 16 . '|'
+       normal! 016|
+       exe 'normal! ' . s:c . '|zs' . 16 . '|'
+       normal! 016|
+       exe 'normal! ' . s:c . '|zs' . 16 . '|'
+       normal! 016|
+       exe 'normal! ' . s:c . '|zs' . 8 . '|'
+       normal! 08|
+       exe 'normal! ' . s:c . '|zs' . 8 . '|'
+       normal! 08|
+       exe 'normal! ' . s:c . '|zs' . 16 . '|'
+       normal! 016|
+       exe 'normal! ' . s:c . '|zs' . 16 . '|'
+       normal! 016|
+       exe 'normal! ' . s:c . '|zs' . 16 . '|'
+       normal! 016|
+       exe 'normal! ' . s:c . '|zs' . 16 . '|'
+       normal! 016|
    [DATA]
  
    call assert_equal(expected, li)
*** ../vim-8.1.1584/src/testdir/test_normal.vim 2019-05-20 22:12:30.720442793 
+0200
--- src/testdir/test_normal.vim 2019-06-24 00:46:28.390980503 +0200
***************
*** 1556,1589 ****
  fun! Test_normal29_brace()
    " basic test for { and } movements
    let text =<< trim [DATA]
!   A paragraph begins after each empty line, and also at each of a set of
!   paragraph macros, specified by the pairs of characters in the 'paragraphs'
!   option.  The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which corresponds 
to
!   the macros ".IP", ".LP", etc.  (These are nroff macros, so the dot must be 
in
!   the first column).  A section boundary is also a paragraph boundary.
!   Note that a blank line (only containing white space) is NOT a paragraph
!   boundary.
! 
! 
!   Also note that this does not include a '{' or '}' in the first column.  When
!   the '{' flag is in 'cpoptions' then '{' in the first column is used as a
!   paragraph boundary |posix|.
!   {
!   This is no paragraph
!   unless the '{' is set
!   in 'cpoptions'
!   }
!   .IP
!   The nroff macros IP separates a paragraph
!   That means, it must be a '.'
!   followed by IP
!   .LPIt does not matter, if afterwards some
!   more characters follow.
!   .SHAlso section boundaries from the nroff
!   macros terminate a paragraph. That means
!   a character like this:
!   .NH
!   End of text here
    [DATA]
  
    new
--- 1556,1589 ----
  fun! Test_normal29_brace()
    " basic test for { and } movements
    let text =<< trim [DATA]
!     A paragraph begins after each empty line, and also at each of a set of
!     paragraph macros, specified by the pairs of characters in the 'paragraphs'
!     option.  The default is "IPLPPPQPP TPHPLIPpLpItpplpipbp", which 
corresponds to
!     the macros ".IP", ".LP", etc.  (These are nroff macros, so the dot must 
be in
!     the first column).  A section boundary is also a paragraph boundary.
!     Note that a blank line (only containing white space) is NOT a paragraph
!     boundary.
! 
! 
!     Also note that this does not include a '{' or '}' in the first column.  
When
!     the '{' flag is in 'cpoptions' then '{' in the first column is used as a
!     paragraph boundary |posix|.
!     {
!     This is no paragraph
!     unless the '{' is set
!     in 'cpoptions'
!     }
!     .IP
!     The nroff macros IP separates a paragraph
!     That means, it must be a '.'
!     followed by IP
!     .LPIt does not matter, if afterwards some
!     more characters follow.
!     .SHAlso section boundaries from the nroff
!     macros terminate a paragraph. That means
!     a character like this:
!     .NH
!     End of text here
    [DATA]
  
    new
***************
*** 1592,1608 ****
    norm! 0d2}
  
    let expected =<< trim [DATA]
!   .IP
!   The nroff macros IP separates a paragraph
!   That means, it must be a '.'
!   followed by IP
!   .LPIt does not matter, if afterwards some
!   more characters follow.
!   .SHAlso section boundaries from the nroff
!   macros terminate a paragraph. That means
!   a character like this:
!   .NH
!   End of text here
  
    [DATA]
    call assert_equal(expected, getline(1, '$'))
--- 1592,1608 ----
    norm! 0d2}
  
    let expected =<< trim [DATA]
!     .IP
!     The nroff macros IP separates a paragraph
!     That means, it must be a '.'
!     followed by IP
!     .LPIt does not matter, if afterwards some
!     more characters follow.
!     .SHAlso section boundaries from the nroff
!     macros terminate a paragraph. That means
!     a character like this:
!     .NH
!     End of text here
  
    [DATA]
    call assert_equal(expected, getline(1, '$'))
***************
*** 1610,1623 ****
    norm! 0d}
  
    let expected =<< trim [DATA]
!   .LPIt does not matter, if afterwards some
!   more characters follow.
!   .SHAlso section boundaries from the nroff
!   macros terminate a paragraph. That means
!   a character like this:
!   .NH
!   End of text here
! 
    [DATA]
    call assert_equal(expected, getline(1, '$'))
  
--- 1610,1623 ----
    norm! 0d}
  
    let expected =<< trim [DATA]
!     .LPIt does not matter, if afterwards some
!     more characters follow.
!     .SHAlso section boundaries from the nroff
!     macros terminate a paragraph. That means
!     a character like this:
!     .NH
!     End of text here
!   
    [DATA]
    call assert_equal(expected, getline(1, '$'))
  
***************
*** 1625,1635 ****
    norm! d{
  
    let expected =<< trim [DATA]
!   .LPIt does not matter, if afterwards some
!   more characters follow.
!   .SHAlso section boundaries from the nroff
!   macros terminate a paragraph. That means
!   a character like this:
  
    [DATA]
    call assert_equal(expected, getline(1, '$'))
--- 1625,1635 ----
    norm! d{
  
    let expected =<< trim [DATA]
!     .LPIt does not matter, if afterwards some
!     more characters follow.
!     .SHAlso section boundaries from the nroff
!     macros terminate a paragraph. That means
!     a character like this:
  
    [DATA]
    call assert_equal(expected, getline(1, '$'))
***************
*** 1637,1644 ****
    norm! d{
  
    let expected =<< trim [DATA]
!   .LPIt does not matter, if afterwards some
!   more characters follow.
  
    [DATA]
    call assert_equal(expected, getline(1, '$'))
--- 1637,1644 ----
    norm! d{
  
    let expected =<< trim [DATA]
!     .LPIt does not matter, if afterwards some
!     more characters follow.
  
    [DATA]
    call assert_equal(expected, getline(1, '$'))
***************
*** 1651,1672 ****
    norm! 0d2}
  
    let expected =<< trim [DATA]
!   {
!   This is no paragraph
!   unless the '{' is set
!   in 'cpoptions'
!   }
!   .IP
!   The nroff macros IP separates a paragraph
!   That means, it must be a '.'
!   followed by IP
!   .LPIt does not matter, if afterwards some
!   more characters follow.
!   .SHAlso section boundaries from the nroff
!   macros terminate a paragraph. That means
!   a character like this:
!   .NH
!   End of text here
  
    [DATA]
    call assert_equal(expected, getline(1, '$'))
--- 1651,1672 ----
    norm! 0d2}
  
    let expected =<< trim [DATA]
!     {
!     This is no paragraph
!     unless the '{' is set
!     in 'cpoptions'
!     }
!     .IP
!     The nroff macros IP separates a paragraph
!     That means, it must be a '.'
!     followed by IP
!     .LPIt does not matter, if afterwards some
!     more characters follow.
!     .SHAlso section boundaries from the nroff
!     macros terminate a paragraph. That means
!     a character like this:
!     .NH
!     End of text here
  
    [DATA]
    call assert_equal(expected, getline(1, '$'))
***************
*** 1675,1696 ****
    norm! d}
  
    let expected =<< trim [DATA]
!   {
!   This is no paragraph
!   unless the '{' is set
!   in 'cpoptions'
!   }
!   .IP
!   The nroff macros IP separates a paragraph
!   That means, it must be a '.'
!   followed by IP
!   .LPIt does not matter, if afterwards some
!   more characters follow.
!   .SHAlso section boundaries from the nroff
!   macros terminate a paragraph. That means
!   a character like this:
!   .NH
!   End of text here
  
    [DATA]
    call assert_equal(expected, getline(1, '$'))
--- 1675,1696 ----
    norm! d}
  
    let expected =<< trim [DATA]
!     {
!     This is no paragraph
!     unless the '{' is set
!     in 'cpoptions'
!     }
!     .IP
!     The nroff macros IP separates a paragraph
!     That means, it must be a '.'
!     followed by IP
!     .LPIt does not matter, if afterwards some
!     more characters follow.
!     .SHAlso section boundaries from the nroff
!     macros terminate a paragraph. That means
!     a character like this:
!     .NH
!     End of text here
  
    [DATA]
    call assert_equal(expected, getline(1, '$'))
***************
*** 1699,1709 ****
    norm! d5}
  
    let expected =<< trim [DATA]
!   {
!   This is no paragraph
!   unless the '{' is set
!   in 'cpoptions'
!   }
  
    [DATA]
    call assert_equal(expected, getline(1, '$'))
--- 1699,1709 ----
    norm! d5}
  
    let expected =<< trim [DATA]
!     {
!     This is no paragraph
!     unless the '{' is set
!     in 'cpoptions'
!     }
  
    [DATA]
    call assert_equal(expected, getline(1, '$'))
*** ../vim-8.1.1584/src/testdir/test_popup.vim  2019-06-06 16:12:05.923134646 
+0200
--- src/testdir/test_popup.vim  2019-06-24 00:46:28.390980503 +0200
***************
*** 737,748 ****
    if !CanRunVimInTerminal()
      throw 'Skipped: cannot make screendumps'
    endif
!   call writefile([
!     \ 'set previewheight=9',
!     \ 'silent! pedit',
!     \ 'call setline(1, map(repeat(["ab"], 10), "v:val. v:key"))',
!     \ 'exec "norm! G\<C-E>\<C-E>"',
!       \ ], 'Xscript')
    let buf = RunVimInTerminal('-S Xscript', {})
  
    " Test that popup and previewwindow do not overlap.
--- 737,749 ----
    if !CanRunVimInTerminal()
      throw 'Skipped: cannot make screendumps'
    endif
!   let lines =<< trim END
!     set previewheight=9
!     silent! pedit
!     call setline(1, map(repeat(["ab"], 10), "v:val. v:key"))
!     exec "norm! G\<C-E>\<C-E>"
!   END
!   call writefile(lines, 'Xscript')
    let buf = RunVimInTerminal('-S Xscript', {})
  
    " Test that popup and previewwindow do not overlap.
***************
*** 799,809 ****
    if !CanRunVimInTerminal()
      throw 'Skipped: cannot make screendumps'
    endif
!   call writefile([
!       \ '123456789_123456789_123456789_a',
!       \ '123456789_123456789_123456789_b',
!       \ '            123',
!       \ ], 'Xtest')
    let buf = RunVimInTerminal('Xtest', {})
    call term_sendkeys(buf, ":vsplit\<CR>")
  
--- 800,811 ----
    if !CanRunVimInTerminal()
      throw 'Skipped: cannot make screendumps'
    endif
!   let lines =<< trim END
!     123456789_123456789_123456789_a
!     123456789_123456789_123456789_b
!                 123
!   END
!   call writefile(lines, 'Xtest')
    let buf = RunVimInTerminal('Xtest', {})
    call term_sendkeys(buf, ":vsplit\<CR>")
  
***************
*** 842,852 ****
      throw 'Skipped: cannot make screendumps and/or menu feature missing'
    endif
  
!   call writefile([
!       \ 'one two three four five',
!       \ 'and one two Xthree four five',
!       \ 'one more two three four five',
!       \ ], 'Xtest')
    let buf = RunVimInTerminal('Xtest', {})
    call term_sendkeys(buf, ":source $VIMRUNTIME/menu.vim\<CR>")
    call term_sendkeys(buf, "/X\<CR>:popup PopUp\<CR>")
--- 844,855 ----
      throw 'Skipped: cannot make screendumps and/or menu feature missing'
    endif
  
!   let lines =<< trim END
!       one two three four five
!       and one two Xthree four five
!       one more two three four five
!   END
!   call writefile(lines, 'Xtest')
    let buf = RunVimInTerminal('Xtest', {})
    call term_sendkeys(buf, ":source $VIMRUNTIME/menu.vim\<CR>")
    call term_sendkeys(buf, "/X\<CR>:popup PopUp\<CR>")
*** ../vim-8.1.1584/src/testdir/test_popupwin.vim       2019-06-20 
03:45:31.175536929 +0200
--- src/testdir/test_popupwin.vim       2019-06-24 00:46:28.390980503 +0200
***************
*** 9,24 ****
    if !CanRunVimInTerminal()
      throw 'Skipped: cannot make screendumps'
    endif
!   call writefile([
!       \ "call setline(1, range(1, 100))",
!       \ "hi PopupColor1 ctermbg=lightblue",
!       \ "hi PopupColor2 ctermbg=lightcyan",
!       \ "hi Comment ctermfg=red",
!       \ "call prop_type_add('comment', {'highlight': 'Comment'})",
!       \ "let winid = popup_create('hello there', {'line': 3, 'col': 11, 
'minwidth': 20, 'highlight': 'PopupColor1'})",
!       \ "let winid2 = popup_create(['another one', 'another two', 'another 
three'], {'line': 3, 'col': 25, 'minwidth': 20})",
!       \ "call setwinvar(winid2, '&wincolor', 'PopupColor2')",
!       \], 'XtestPopup')
    let buf = RunVimInTerminal('-S XtestPopup', {'rows': 10})
    call VerifyScreenDump(buf, 'Test_popupwin_01', {})
  
--- 9,25 ----
    if !CanRunVimInTerminal()
      throw 'Skipped: cannot make screendumps'
    endif
!   let lines =<< trim END
!       call setline(1, range(1, 100))
!       hi PopupColor1 ctermbg=lightblue
!       hi PopupColor2 ctermbg=lightcyan
!       hi Comment ctermfg=red
!       call prop_type_add('comment', {'highlight': 'Comment'})
!       let winid = popup_create('hello there', {'line': 3, 'col': 11, 
'minwidth': 20, 'highlight': 'PopupColor1'})
!       let winid2 = popup_create(['another one', 'another two', 'another 
three'], {'line': 3, 'col': 25, 'minwidth': 20})
!       call setwinvar(winid2, '&wincolor', 'PopupColor2')
!   END
!   call writefile(lines, 'XtestPopup')
    let buf = RunVimInTerminal('-S XtestPopup', {'rows': 10})
    call VerifyScreenDump(buf, 'Test_popupwin_01', {})
  
***************
*** 80,95 ****
    endif
  
    for iter in range(0, 1)
!     call writefile([iter == 1 ? '' : 'set enc=latin1',
!         \ "call setline(1, range(1, 100))",
!         \ "call popup_create('hello border', {'line': 2, 'col': 3, 'border': 
[]})",
!         \ "call popup_create('hello padding', {'line': 2, 'col': 23, 
'padding': []})",
!         \ "call popup_create('hello both', {'line': 2, 'col': 43, 'border': 
[], 'padding': []})",
!         \ "call popup_create('border TL', {'line': 6, 'col': 3, 'border': [1, 
0, 0, 4]})",
!         \ "call popup_create('paddings', {'line': 6, 'col': 23, 'padding': 
[1, 3, 2, 4]})",
!         \ "call popup_create('wrapped longer text', {'line': 8, 'col': 55, 
'padding': [0, 3, 0, 3], 'border': [0, 1, 0, 1]})",
!         \ "call popup_create('right aligned text', {'line': 11, 'col': 56, 
'wrap': 0, 'padding': [0, 3, 0, 3], 'border': [0, 1, 0, 1]})",
!         \], 'XtestPopupBorder')
      let buf = RunVimInTerminal('-S XtestPopupBorder', {'rows': 15})
      call VerifyScreenDump(buf, 'Test_popupwin_2' .. iter, {})
  
--- 81,98 ----
    endif
  
    for iter in range(0, 1)
!     let lines =<< trim END
!         call setline(1, range(1, 100))
!         call popup_create('hello border', {'line': 2, 'col': 3, 'border': []})
!         call popup_create('hello padding', {'line': 2, 'col': 23, 'padding': 
[]})
!         call popup_create('hello both', {'line': 2, 'col': 43, 'border': [], 
'padding': []})
!         call popup_create('border TL', {'line': 6, 'col': 3, 'border': [1, 0, 
0, 4]})
!         call popup_create('paddings', {'line': 6, 'col': 23, 'padding': [1, 
3, 2, 4]})
!         call popup_create('wrapped longer text', {'line': 8, 'col': 55, 
'padding': [0, 3, 0, 3], 'border': [0, 1, 0, 1]})
!         call popup_create('right aligned text', {'line': 11, 'col': 56, 
'wrap': 0, 'padding': [0, 3, 0, 3], 'border': [0, 1, 0, 1]})
!     END
!     call insert(lines, iter == 1 ? '' : 'set enc=latin1')
!     call writefile(lines, 'XtestPopupBorder')
      let buf = RunVimInTerminal('-S XtestPopupBorder', {'rows': 15})
      call VerifyScreenDump(buf, 'Test_popupwin_2' .. iter, {})
  
***************
*** 97,116 ****
      call delete('XtestPopupBorder')
    endfor
  
!   call writefile([
!       \ "call setline(1, range(1, 100))",
!       \ "hi BlueColor ctermbg=lightblue",
!       \ "hi TopColor ctermbg=253",
!       \ "hi RightColor ctermbg=245",
!       \ "hi BottomColor ctermbg=240",
!       \ "hi LeftColor ctermbg=248",
!       \ "call popup_create('hello border', {'line': 2, 'col': 3, 'border': 
[], 'borderhighlight': ['BlueColor']})",
!       \ "call popup_create(['hello border', 'and more'], {'line': 2, 'col': 
23, 'border': [], 'borderhighlight': ['TopColor', 'RightColor', 'BottomColor', 
'LeftColor']})",
!       \ "call popup_create(['hello border', 'lines only'], {'line': 2, 'col': 
43, 'border': [], 'borderhighlight': ['BlueColor'], 'borderchars': ['x']})",
!       \ "call popup_create(['hello border', 'with corners'], {'line': 2, 
'col': 60, 'border': [], 'borderhighlight': ['BlueColor'], 'borderchars': ['x', 
'#']})",
!       \ "let winid = popup_create(['hello border', 'with numbers'], {'line': 
6, 'col': 3, 'border': [], 'borderhighlight': ['BlueColor'], 'borderchars': 
['0', '1', '2', '3', '4', '5', '6', '7']})",
!       \ "call popup_create(['hello border', 'just blanks'], {'line': 7, 
'col': 23, 'border': [], 'borderhighlight': ['BlueColor'], 'borderchars': [' 
']})",
!       \], 'XtestPopupBorder')
    let buf = RunVimInTerminal('-S XtestPopupBorder', {'rows': 12})
    call VerifyScreenDump(buf, 'Test_popupwin_22', {})
  
--- 100,120 ----
      call delete('XtestPopupBorder')
    endfor
  
!   let lines =<< trim END
!       call setline(1, range(1, 100))
!       hi BlueColor ctermbg=lightblue
!       hi TopColor ctermbg=253
!       hi RightColor ctermbg=245
!       hi BottomColor ctermbg=240
!       hi LeftColor ctermbg=248
!       call popup_create('hello border', {'line': 2, 'col': 3, 'border': [], 
'borderhighlight': ['BlueColor']})
!       call popup_create(['hello border', 'and more'], {'line': 2, 'col': 23, 
'border': [], 'borderhighlight': ['TopColor', 'RightColor', 'BottomColor', 
'LeftColor']})
!       call popup_create(['hello border', 'lines only'], {'line': 2, 'col': 
43, 'border': [], 'borderhighlight': ['BlueColor'], 'borderchars': ['x']})
!       call popup_create(['hello border', 'with corners'], {'line': 2, 'col': 
60, 'border': [], 'borderhighlight': ['BlueColor'], 'borderchars': ['x', '#']})
!       let winid = popup_create(['hello border', 'with numbers'], {'line': 6, 
'col': 3, 'border': [], 'borderhighlight': ['BlueColor'], 'borderchars': ['0', 
'1', '2', '3', '4', '5', '6', '7']})
!       call popup_create(['hello border', 'just blanks'], {'line': 7, 'col': 
23, 'border': [], 'borderhighlight': ['BlueColor'], 'borderchars': [' ']})
!   END
!   call writefile(lines, 'XtestPopupBorder')
    let buf = RunVimInTerminal('-S XtestPopupBorder', {'rows': 12})
    call VerifyScreenDump(buf, 'Test_popupwin_22', {})
  
***************
*** 176,193 ****
    if !CanRunVimInTerminal()
      throw 'Skipped: cannot make screendumps'
    endif
!   call writefile([
!       \ "call setline(1, range(1, 100))",
!       \ "hi PopupColor ctermbg=lightblue",
!       \ "let winid = popup_create([",
!       \ "\\ '#include <stdio.h>',",
!       \ "\\ 'int main(void)',",
!       \ "\\ '{',",
!       \ "\\ '    printf(123);',",
!       \ "\\ '}',",
!       \ "\\], {'line': 3, 'col': 25, 'highlight': 'PopupColor'})",
!       \ "call win_execute(winid, 'set syntax=cpp')",
!       \], 'XtestPopup')
    let buf = RunVimInTerminal('-S XtestPopup', {'rows': 10})
    call VerifyScreenDump(buf, 'Test_popupwin_10', {})
  
--- 180,198 ----
    if !CanRunVimInTerminal()
      throw 'Skipped: cannot make screendumps'
    endif
!   let lines =<< trim END
!       call setline(1, range(1, 100))
!       hi PopupColor ctermbg=lightblue
!       let winid = popup_create([
!           \ '#include <stdio.h>',
!           \ 'int main(void)',
!           \ '{',
!           \ '    printf(123);',
!           \ '}',
!           \], {'line': 3, 'col': 25, 'highlight': 'PopupColor'})
!       call win_execute(winid, 'set syntax=cpp')
!   END
!   call writefile(lines, 'XtestPopup')
    let buf = RunVimInTerminal('-S XtestPopup', {'rows': 10})
    call VerifyScreenDump(buf, 'Test_popupwin_10', {})
  
***************
*** 356,361 ****
--- 361,403 ----
    call delete('XtestPopupDrag')
  endfunc
  
+ func Test_popup_with_mask()
+   if !CanRunVimInTerminal()
+     throw 'Skipped: cannot make screendumps'
+   endif
+   let lines =<< trim END
+       call setline(1, repeat([join(range(1, 40), '')], 10))
+       hi PopupColor ctermbg=lightgrey
+       let winid = popup_create([
+           \ 'some text',
+           \ 'another line',
+           \], {
+           \ 'line': 2,
+           \ 'col': 10,
+           \ 'zindex': 90,
+           \ 'padding': [],
+           \ 'highlight': 'PopupColor',
+           \ 'mask': [[1,1,1,1], [-5,-1,4,4], [7,9,2,3], [2,4,3,3]]})
+       call popup_create([
+           \ 'xxxxxxxxx',
+           \ 'yyyyyyyyy',
+           \], {
+           \ 'line': 3,
+           \ 'col': 18,
+           \ 'zindex': 20})
+   END
+   call writefile(lines, 'XtestPopupMask')
+   let buf = RunVimInTerminal('-S XtestPopupMask', {'rows': 10})
+   call VerifyScreenDump(buf, 'Test_popupwin_mask_1', {})
+ 
+   call term_sendkeys(buf, ":call popup_move(winid, {'col': 11, 'line': 
3})\<CR>")
+   call VerifyScreenDump(buf, 'Test_popupwin_mask_2', {})
+ 
+   " clean up
+   call StopVimInTerminal(buf)
+   call delete('XtestPopupMask')
+ endfunc
+ 
  func Test_popup_select()
    if !CanRunVimInTerminal()
      throw 'Skipped: cannot make screendumps'
*** ../vim-8.1.1584/src/testdir/test_profile.vim        2019-06-15 
17:57:43.972724036 +0200
--- src/testdir/test_profile.vim        2019-06-24 00:46:28.390980503 +0200
***************
*** 310,322 ****
  
  func Test_profile_file()
    let lines =<< trim [CODE]
!   func! Foo()
!   endfunc
!   for i in range(10)
!     " a comment
      call Foo()
-   endfor
-   call Foo()
    [CODE]
  
    call writefile(lines, 'Xprofile_file.vim')
--- 310,322 ----
  
  func Test_profile_file()
    let lines =<< trim [CODE]
!     func! Foo()
!     endfunc
!     for i in range(10)
!       " a comment
!       call Foo()
!     endfor
      call Foo()
    [CODE]
  
    call writefile(lines, 'Xprofile_file.vim')
*** ../vim-8.1.1584/src/testdir/test_quickfix.vim       2019-06-15 
17:57:43.972724036 +0200
--- src/testdir/test_quickfix.vim       2019-06-24 00:46:28.390980503 +0200
***************
*** 818,884 ****
      endif
  
      let l =<< trim [DATA]
!     "Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.
!     "Xtestfile", line 6 col 19; this is an error
!     gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include  version.c
!     Xtestfile:9: parse error before `asd'
!     make: *** [vim] Error 1
!     in file "Xtestfile" linenr 10: there is an error
! 
!     2 returned
!     "Xtestfile", line 11 col 1; this is an error
!     "Xtestfile", line 12 col 2; this is another error
!     "Xtestfile", line 14:10; this is an error in column 10
!     =Xtestfile=, line 15:10; this is another error, but in vcol 10 this time
!     "Xtestfile", linenr 16: yet another problem
!     Error in "Xtestfile" at line 17:
!     x should be a dot
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 17
!                 ^
!     Error in "Xtestfile" at line 18:
!     x should be a dot
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 18
!     .............^
!     Error in "Xtestfile" at line 19:
!     x should be a dot
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 19
!     --------------^
!     Error in "Xtestfile" at line 20:
!     x should be a dot
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 20
!              ^
! 
!     Does anyone know what is the problem and how to correction it?
!     "Xtestfile", line 21 col 9: What is the title of the quickfix window?
!     "Xtestfile", line 22 col 9: What is the title of the quickfix window?
      [DATA]
  
      call writefile(l, 'Xerrorfile1')
      call writefile(l[:-2], 'Xerrorfile2')
  
!     let m =<< trim [DATA]
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  2
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  3
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  4
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  5
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  6
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  7
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  8
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  9
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 10
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 11
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 12
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 13
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 14
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 15
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 16
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 17
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 18
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 19
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 20
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 21
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 22
!     [DATA]
      call writefile(m, 'Xtestfile')
  
      let save_efm = &efm
--- 818,884 ----
      endif
  
      let l =<< trim [DATA]
!       "Xtestfile", line 4.12: 1506-045 (S) Undeclared identifier fd_set.
!       "Xtestfile", line 6 col 19; this is an error
!       gcc -c -DHAVE_CONFIsing-prototypes -I/usr/X11R6/include  version.c
!       Xtestfile:9: parse error before `asd'
!       make: *** [vim] Error 1
!       in file "Xtestfile" linenr 10: there is an error
!   
!       2 returned
!       "Xtestfile", line 11 col 1; this is an error
!       "Xtestfile", line 12 col 2; this is another error
!       "Xtestfile", line 14:10; this is an error in column 10
!       =Xtestfile=, line 15:10; this is another error, but in vcol 10 this time
!       "Xtestfile", linenr 16: yet another problem
!       Error in "Xtestfile" at line 17:
!       x should be a dot
!               xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 17
!                   ^
!       Error in "Xtestfile" at line 18:
!       x should be a dot
!               xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 18
!       .............^
!       Error in "Xtestfile" at line 19:
!       x should be a dot
!               xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 19
!       --------------^
!       Error in "Xtestfile" at line 20:
!       x should be a dot
!               xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 20
!                      ^
!   
!       Does anyone know what is the problem and how to correction it?
!       "Xtestfile", line 21 col 9: What is the title of the quickfix window?
!       "Xtestfile", line 22 col 9: What is the title of the quickfix window?
      [DATA]
  
      call writefile(l, 'Xerrorfile1')
      call writefile(l[:-2], 'Xerrorfile2')
  
!     let m =<< [DATA]
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  2
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  3
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  4
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  5
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  6
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  7
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  8
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line  9
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 10
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 11
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 12
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 13
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 14
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 15
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 16
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 17
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 18
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 19
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 20
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 21
!       xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx    line 22
! [DATA]
      call writefile(m, 'Xtestfile')
  
      let save_efm = &efm
***************
*** 1092,1111 ****
  
    " Test for %P, %Q and %t format specifiers
    let lines =<< trim [DATA]
!   [Xtestfile1]
!   (1,17)  error: ';' missing
!   (21,2)  warning: variable 'z' not defined
!   (67,3)  error: end of file found before string ended
!   --
! 
!   [Xtestfile2]
!   --
! 
!   [Xtestfile3]
!   NEW compiler v1.1
!   (2,2)   warning: variable 'x' not defined
!   (67,3)  warning: 's' already defined
!   --
    [DATA]
  
    set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r
--- 1092,1111 ----
  
    " Test for %P, %Q and %t format specifiers
    let lines =<< trim [DATA]
!     [Xtestfile1]
!     (1,17)  error: ';' missing
!     (21,2)  warning: variable 'z' not defined
!     (67,3)  error: end of file found before string ended
!     --
! 
!     [Xtestfile2]
!     --
! 
!     [Xtestfile3]
!     NEW compiler v1.1
!     (2,2)   warning: variable 'x' not defined
!     (67,3)  warning: 's' already defined
!     --
    [DATA]
  
    set efm=%+P[%f]%r,(%l\\,%c)%*[\ ]%t%*[^:]:\ %m,%+Q--%r
***************
*** 1130,1139 ****
  
    " Tests for %E, %C and %Z format specifiers
    let lines =<< trim [DATA]
!   Error 275
!   line 42
!   column 3
!   ' ' expected after '--'
    [DATA]
  
    set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
--- 1130,1139 ----
  
    " Tests for %E, %C and %Z format specifiers
    let lines =<< trim [DATA]
!     Error 275
!     line 42
!     column 3
!     ' ' expected after '--'
    [DATA]
  
    set efm=%EError\ %n,%Cline\ %l,%Ccolumn\ %c,%Z%m
***************
*** 1147,1154 ****
  
    " Test for %>
    let lines =<< trim [DATA]
!   Error in line 147 of foo.c:
!   unknown variable 'i'
    [DATA]
  
    set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m
--- 1147,1154 ----
  
    " Test for %>
    let lines =<< trim [DATA]
!     Error in line 147 of foo.c:
!     unknown variable 'i'
    [DATA]
  
    set efm=unknown\ variable\ %m,%E%>Error\ in\ line\ %l\ of\ %f:,%Z%m
***************
*** 1160,1178 ****
  
    " Test for %A, %C and other formats
    let lines =<< trim [DATA]
!   ==============================================================
!   FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)
!   --------------------------------------------------------------
!   Traceback (most recent call last):
!     File "unittests/dbfacadeTest.py", line 89, in testFoo
!       self.assertEquals(34, dtid)
!     File "/usr/lib/python2.2/unittest.py", line 286, in
!    failUnlessEqual
!       raise self.failureException, \\
!   AssertionError: 34 != 33
! 
!   --------------------------------------------------------------
!   Ran 27 tests in 0.063s
    [DATA]
  
    set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
--- 1160,1178 ----
  
    " Test for %A, %C and other formats
    let lines =<< trim [DATA]
!     ==============================================================
!     FAIL: testGetTypeIdCachesResult (dbfacadeTest.DjsDBFacadeTest)
!     --------------------------------------------------------------
!     Traceback (most recent call last):
!       File "unittests/dbfacadeTest.py", line 89, in testFoo
!         self.assertEquals(34, dtid)
!       File "/usr/lib/python2.2/unittest.py", line 286, in
!      failUnlessEqual
!         raise self.failureException, \\
!     AssertionError: 34 != 33
!   
!     --------------------------------------------------------------
!     Ran 27 tests in 0.063s
    [DATA]
  
    set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
*** ../vim-8.1.1584/src/testdir/test_xxd.vim    2019-06-15 17:57:43.976724009 
+0200
--- src/testdir/test_xxd.vim    2019-06-24 00:46:28.390980503 +0200
***************
*** 96,105 ****
    exe '0r! ' . s:xxd_cmd . ' -i XXDfile'
    $d
    let expected =<< trim [CODE]
!   unsigned char XXDfile[] = {
!     0x54, 0x45, 0x53, 0x54, 0x61, 0x62, 0x63, 0x64, 0x30, 0x39, 0x0a
!   };
!   unsigned int XXDfile_len = 11;
    [CODE]
  
    call assert_equal(expected, getline(1,'$'), s:Mess(s:test))
--- 96,105 ----
    exe '0r! ' . s:xxd_cmd . ' -i XXDfile'
    $d
    let expected =<< trim [CODE]
!     unsigned char XXDfile[] = {
!       0x54, 0x45, 0x53, 0x54, 0x61, 0x62, 0x63, 0x64, 0x30, 0x39, 0x0a
!     };
!     unsigned int XXDfile_len = 11;
    [CODE]
  
    call assert_equal(expected, getline(1,'$'), s:Mess(s:test))
***************
*** 112,121 ****
      exe '0r! ' . s:xxd_cmd . ' -i ' . arg . ' XXDfile'
      $d
      let expected =<< trim [CODE]
!     unsigned char XXDFILE[] = {
!       0x54, 0x45, 0x53, 0x54, 0x61, 0x62, 0x63, 0x64, 0x30, 0x39, 0x0a
!     };
!     unsigned int XXDFILE_LEN = 11;
      [CODE]
      call assert_equal(expected, getline(1,'$'), s:Mess(s:test))
    endfor
--- 112,121 ----
      exe '0r! ' . s:xxd_cmd . ' -i ' . arg . ' XXDfile'
      $d
      let expected =<< trim [CODE]
!       unsigned char XXDFILE[] = {
!         0x54, 0x45, 0x53, 0x54, 0x61, 0x62, 0x63, 0x64, 0x30, 0x39, 0x0a
!       };
!       unsigned int XXDFILE_LEN = 11;
      [CODE]
      call assert_equal(expected, getline(1,'$'), s:Mess(s:test))
    endfor
*** ../vim-8.1.1584/src/version.c       2019-06-24 00:43:31.459691842 +0200
--- src/version.c       2019-06-24 00:48:43.374383221 +0200
***************
*** 779,780 ****
--- 779,782 ----
  {   /* Add new patch number below this line */
+ /**/
+     1585,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
258. When you want to see your girlfriend, you surf to her homepage.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/201906232258.x5NMwo7e032585%40masaka.moolenaar.net.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui