Patch 8.2.4565
Problem:    No command line completion for :breakadd and :breakdel.
Solution:   Add completion for :breakadd and :breakdel. (Yegappan Lakshmanan,
            closes #9950)
Files:      runtime/doc/builtin.txt, src/cmdexpand.c, src/spellsuggest.c,
            src/usercmd.c, src/vim.h, src/testdir/test_cmdline.vim,
            src/testdir/test_writefile.vim


*** ../vim-8.2.4564/runtime/doc/builtin.txt     2022-02-23 13:16:55.757541153 
+0000
--- runtime/doc/builtin.txt     2022-03-14 19:16:37.719994346 +0000
***************
*** 3220,3226 ****
                arglist         file names in argument list
                augroup         autocmd groups
                buffer          buffer names
!               behave          :behave suboptions
                color           color schemes
                command         Ex command
                cmdline         |cmdline-completion| result
--- 3230,3237 ----
                arglist         file names in argument list
                augroup         autocmd groups
                buffer          buffer names
!               behave          |:behave| suboptions
!               breakpoint      |:breakadd| and |:breakdel| suboptions
                color           color schemes
                command         Ex command
                cmdline         |cmdline-completion| result
***************
*** 3237,3243 ****
                function        function name
                help            help subjects
                highlight       highlight groups
!               history         :history suboptions
                locale          locale names (as output of locale -a)
                mapclear        buffer argument
                mapping         mapping name
--- 3248,3254 ----
                function        function name
                help            help subjects
                highlight       highlight groups
!               history         |:history| suboptions
                locale          locale names (as output of locale -a)
                mapclear        buffer argument
                mapping         mapping name
*** ../vim-8.2.4564/src/cmdexpand.c     2022-02-28 21:02:16.271053073 +0000
--- src/cmdexpand.c     2022-03-14 19:16:37.719994346 +0000
***************
*** 1602,1607 ****
--- 1602,1672 ----
  }
  #endif
  
+ #ifdef FEAT_EVAL
+ static enum
+ {
+     EXP_BREAKPT_ADD,  // expand ":breakadd" sub-commands
+     EXP_BREAKPT_DEL   // expand ":breakdel" sub-commands
+ } breakpt_expand_what;
+ 
+ /*
+  * Set the completion context for the :breakadd command. Always returns NULL.
+  */
+     static char_u *
+ set_context_in_breakadd_cmd(expand_T *xp, char_u *arg, cmdidx_T cmdidx)
+ {
+     char_u *p;
+     char_u *subcmd_start;
+ 
+     xp->xp_context = EXPAND_BREAKPOINT;
+     xp->xp_pattern = arg;
+ 
+     if (cmdidx == CMD_breakadd)
+       breakpt_expand_what = EXP_BREAKPT_ADD;
+     else
+       breakpt_expand_what = EXP_BREAKPT_DEL;
+ 
+     p = skipwhite(arg);
+     if (*p == NUL)
+       return NULL;
+     subcmd_start = p;
+ 
+     if (STRNCMP("file ", p, 5) == 0 ||
+           STRNCMP("func ", p, 5) == 0)
+     {
+       // :breakadd file [lnum] <filename>
+       // :breakadd func [lnum] <funcname>
+       p += 4;
+       p = skipwhite(p);
+ 
+       // skip line number (if specified)
+       if (VIM_ISDIGIT(*p))
+       {
+           p = skipdigits(p);
+           if (*p != ' ')
+           {
+               xp->xp_context = EXPAND_NOTHING;
+               return NULL;
+           }
+           p = skipwhite(p);
+       }
+       if (STRNCMP("file", subcmd_start, 4) == 0)
+           xp->xp_context = EXPAND_FILES;
+       else
+           xp->xp_context = EXPAND_USER_FUNC;
+       xp->xp_pattern = p;
+     }
+     else if (STRNCMP("expr ", p, 5) == 0)
+     {
+       // :breakadd expr <expression>
+       xp->xp_context = EXPAND_EXPRESSION;
+       xp->xp_pattern = skipwhite(p + 5);
+     }
+ 
+     return NULL;
+ }
+ #endif
+ 
  /*
   * Set the completion context in 'xp' for command 'cmd' with index 'cmdidx'.
   * The argument to the command is 'arg' and the argument flags is 'argt'.
***************
*** 1958,1963 ****
--- 2023,2034 ----
            xp->xp_pattern = arg;
            break;
  
+ #ifdef FEAT_EVAL
+       case CMD_breakadd:
+       case CMD_breakdel:
+           return set_context_in_breakadd_cmd(xp, arg, cmdidx);
+ #endif
+ 
        default:
            break;
      }
***************
*** 2348,2353 ****
--- 2419,2449 ----
      return NULL;
  }
  
+ # ifdef FEAT_EVAL
+ /*
+  * Function given to ExpandGeneric() to obtain the possible arguments of the
+  * ":breakadd {expr, file, func, here}" command.
+  * ":breakdel {func, file, here}" command.
+  */
+     static char_u *
+ get_breakadd_arg(expand_T *xp UNUSED, int idx)
+ {
+     char *opts[] = {"expr", "file", "func", "here"};
+ 
+     if (idx >=0 && idx <= 3)
+     {
+       if (breakpt_expand_what == EXP_BREAKPT_ADD)
+           return (char_u *)opts[idx];
+       else
+       {
+           if (idx <= 2)
+               return (char_u *)opts[idx + 1];
+       }
+     }
+     return NULL;
+ }
+ #endif
+ 
  /*
   * Function given to ExpandGeneric() to obtain the possible arguments of the
   * ":messages {clear}" command.
***************
*** 2397,2438 ****
        {EXPAND_USER_CMD_FLAGS, get_user_cmd_flags, FALSE, TRUE},
        {EXPAND_USER_NARGS, get_user_cmd_nargs, FALSE, TRUE},
        {EXPAND_USER_COMPLETE, get_user_cmd_complete, FALSE, TRUE},
! # ifdef FEAT_EVAL
        {EXPAND_USER_VARS, get_user_var_name, FALSE, TRUE},
        {EXPAND_FUNCTIONS, get_function_name, FALSE, TRUE},
        {EXPAND_USER_FUNC, get_user_func_name, FALSE, TRUE},
        {EXPAND_DISASSEMBLE, get_disassemble_argument, FALSE, TRUE},
        {EXPAND_EXPRESSION, get_expr_name, FALSE, TRUE},
! # endif
! # ifdef FEAT_MENU
        {EXPAND_MENUS, get_menu_name, FALSE, TRUE},
        {EXPAND_MENUNAMES, get_menu_names, FALSE, TRUE},
! # endif
! # ifdef FEAT_SYN_HL
        {EXPAND_SYNTAX, get_syntax_name, TRUE, TRUE},
! # endif
! # ifdef FEAT_PROFILE
        {EXPAND_SYNTIME, get_syntime_arg, TRUE, TRUE},
! # endif
        {EXPAND_HIGHLIGHT, get_highlight_name, TRUE, TRUE},
        {EXPAND_EVENTS, get_event_name, TRUE, FALSE},
        {EXPAND_AUGROUP, get_augroup_name, TRUE, FALSE},
! # ifdef FEAT_CSCOPE
        {EXPAND_CSCOPE, get_cscope_name, TRUE, TRUE},
! # endif
! # ifdef FEAT_SIGNS
        {EXPAND_SIGN, get_sign_name, TRUE, TRUE},
! # endif
! # ifdef FEAT_PROFILE
        {EXPAND_PROFILE, get_profile_name, TRUE, TRUE},
! # endif
! # if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
        {EXPAND_LANGUAGE, get_lang_arg, TRUE, FALSE},
        {EXPAND_LOCALES, get_locales, TRUE, FALSE},
! # endif
        {EXPAND_ENV_VARS, get_env_name, TRUE, TRUE},
        {EXPAND_USER, get_users, TRUE, FALSE},
        {EXPAND_ARGLIST, get_arglist_name, TRUE, FALSE},
      };
      int       i;
      int ret = FAIL;
--- 2493,2537 ----
        {EXPAND_USER_CMD_FLAGS, get_user_cmd_flags, FALSE, TRUE},
        {EXPAND_USER_NARGS, get_user_cmd_nargs, FALSE, TRUE},
        {EXPAND_USER_COMPLETE, get_user_cmd_complete, FALSE, TRUE},
! #ifdef FEAT_EVAL
        {EXPAND_USER_VARS, get_user_var_name, FALSE, TRUE},
        {EXPAND_FUNCTIONS, get_function_name, FALSE, TRUE},
        {EXPAND_USER_FUNC, get_user_func_name, FALSE, TRUE},
        {EXPAND_DISASSEMBLE, get_disassemble_argument, FALSE, TRUE},
        {EXPAND_EXPRESSION, get_expr_name, FALSE, TRUE},
! #endif
! #ifdef FEAT_MENU
        {EXPAND_MENUS, get_menu_name, FALSE, TRUE},
        {EXPAND_MENUNAMES, get_menu_names, FALSE, TRUE},
! #endif
! #ifdef FEAT_SYN_HL
        {EXPAND_SYNTAX, get_syntax_name, TRUE, TRUE},
! #endif
! #ifdef FEAT_PROFILE
        {EXPAND_SYNTIME, get_syntime_arg, TRUE, TRUE},
! #endif
        {EXPAND_HIGHLIGHT, get_highlight_name, TRUE, TRUE},
        {EXPAND_EVENTS, get_event_name, TRUE, FALSE},
        {EXPAND_AUGROUP, get_augroup_name, TRUE, FALSE},
! #ifdef FEAT_CSCOPE
        {EXPAND_CSCOPE, get_cscope_name, TRUE, TRUE},
! #endif
! #ifdef FEAT_SIGNS
        {EXPAND_SIGN, get_sign_name, TRUE, TRUE},
! #endif
! #ifdef FEAT_PROFILE
        {EXPAND_PROFILE, get_profile_name, TRUE, TRUE},
! #endif
! #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
        {EXPAND_LANGUAGE, get_lang_arg, TRUE, FALSE},
        {EXPAND_LOCALES, get_locales, TRUE, FALSE},
! #endif
        {EXPAND_ENV_VARS, get_env_name, TRUE, TRUE},
        {EXPAND_USER, get_users, TRUE, FALSE},
        {EXPAND_ARGLIST, get_arglist_name, TRUE, FALSE},
+ #ifdef FEAT_EVAL
+       {EXPAND_BREAKPOINT, get_breakadd_arg, TRUE, TRUE},
+ #endif
      };
      int       i;
      int ret = FAIL;
*** ../vim-8.2.4564/src/spellsuggest.c  2022-03-13 20:12:21.322709463 +0000
--- src/spellsuggest.c  2022-03-14 19:16:37.719994346 +0000
***************
*** 508,514 ****
        end_visual_mode();
        // make sure we don't include the NUL at the end of the line
        line = ml_get_curline();
!       if (badlen > STRLEN(line) - curwin->w_cursor.col)
            badlen = STRLEN(line) - curwin->w_cursor.col;
      }
      // Find the start of the badly spelled word.
--- 508,514 ----
        end_visual_mode();
        // make sure we don't include the NUL at the end of the line
        line = ml_get_curline();
!       if (badlen > (int)STRLEN(line) - (int)curwin->w_cursor.col)
            badlen = STRLEN(line) - curwin->w_cursor.col;
      }
      // Find the start of the badly spelled word.
*** ../vim-8.2.4564/src/usercmd.c       2022-02-20 20:48:53.226071796 +0000
--- src/usercmd.c       2022-03-14 19:16:37.723994349 +0000
***************
*** 90,95 ****
--- 90,98 ----
      {EXPAND_TAGS_LISTFILES, "tag_listfiles"},
      {EXPAND_USER, "user"},
      {EXPAND_USER_VARS, "var"},
+ #if defined(FEAT_EVAL)
+     {EXPAND_BREAKPOINT, "breakpoint"},
+ #endif
      {0, NULL}
  };
  
*** ../vim-8.2.4564/src/vim.h   2022-02-26 10:31:24.699882028 +0000
--- src/vim.h   2022-03-14 19:16:37.723994349 +0000
***************
*** 801,806 ****
--- 801,807 ----
  #define EXPAND_ARGLIST                48
  #define EXPAND_DIFF_BUFFERS   49
  #define EXPAND_DISASSEMBLE    50
+ #define EXPAND_BREAKPOINT     51
  
  // Values for exmode_active (0 is no exmode)
  #define EXMODE_NORMAL         1
*** ../vim-8.2.4564/src/testdir/test_cmdline.vim        2022-02-28 
13:28:34.544563774 +0000
--- src/testdir/test_cmdline.vim        2022-03-14 19:16:37.719994346 +0000
***************
*** 3007,3010 ****
--- 3007,3164 ----
    set wildoptions&
  endfunc
  
+ " Test for :breakadd argument completion
+ func Test_cmdline_complete_breakadd()
+   call feedkeys(":breakadd \<C-A>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd expr file func here", @:)
+   call feedkeys(":breakadd \<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd expr", @:)
+   call feedkeys(":breakadd    \<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd    expr", @:)
+   call feedkeys(":breakadd he\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd here", @:)
+   call feedkeys(":breakadd    he\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd    here", @:)
+   call feedkeys(":breakadd abc\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd abc", @:)
+   call assert_equal(['expr', 'file', 'func', 'here'], getcompletion('', 
'breakpoint'))
+   let l = getcompletion('not', 'breakpoint')
+   call assert_equal([], l)
+ 
+   " Test for :breakadd file [lnum] <file>
+   call writefile([], 'Xscript')
+   call feedkeys(":breakadd file Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd file Xscript", @:)
+   call feedkeys(":breakadd   file   Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd   file   Xscript", @:)
+   call feedkeys(":breakadd file 20 Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd file 20 Xscript", @:)
+   call feedkeys(":breakadd   file   20   Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd   file   20   Xscript", @:)
+   call feedkeys(":breakadd file 20x Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd file 20x Xsc\t", @:)
+   call feedkeys(":breakadd file 20\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd file 20\t", @:)
+   call feedkeys(":breakadd file 20x\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd file 20x\t", @:)
+   call feedkeys(":breakadd file Xscript  \<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd file Xscript  ", @:)
+   call feedkeys(":breakadd file X1B2C3\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd file X1B2C3", @:)
+   call delete('Xscript')
+ 
+   " Test for :breakadd func [lnum] <function>
+   func Xbreak_func()
+   endfunc
+   call feedkeys(":breakadd func Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd func Xbreak_func", @:)
+   call feedkeys(":breakadd    func    Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd    func    Xbreak_func", @:)
+   call feedkeys(":breakadd func 20 Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd func 20 Xbreak_func", @:)
+   call feedkeys(":breakadd   func   20   Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd   func   20   Xbreak_func", @:)
+   call feedkeys(":breakadd func 20x Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd func 20x Xbr\t", @:)
+   call feedkeys(":breakadd func 20\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd func 20\t", @:)
+   call feedkeys(":breakadd func 20x\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd func 20x\t", @:)
+   call feedkeys(":breakadd func Xbreak_func  \<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd func Xbreak_func  ", @:)
+   call feedkeys(":breakadd func X1B2C3\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd func X1B2C3", @:)
+   delfunc Xbreak_func
+ 
+   " Test for :breakadd expr <expression>
+   let g:Xtest_var = 10
+   call feedkeys(":breakadd expr Xtest\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd expr Xtest_var", @:)
+   call feedkeys(":breakadd    expr    Xtest\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd    expr    Xtest_var", @:)
+   call feedkeys(":breakadd expr Xtest_var  \<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd expr Xtest_var  ", @:)
+   call feedkeys(":breakadd expr X1B2C3\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd expr X1B2C3", @:)
+   unlet g:Xtest_var
+ 
+   " Test for :breakadd here
+   call feedkeys(":breakadd here Xtest\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd here Xtest", @:)
+   call feedkeys(":breakadd   here   Xtest\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd   here   Xtest", @:)
+   call feedkeys(":breakadd here \<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakadd here ", @:)
+ endfunc
+ 
+ " Test for :breakdel argument completion
+ func Test_cmdline_complete_breakdel()
+   call feedkeys(":breakdel \<C-A>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel file func here", @:)
+   call feedkeys(":breakdel \<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel file", @:)
+   call feedkeys(":breakdel    \<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel    file", @:)
+   call feedkeys(":breakdel he\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel here", @:)
+   call feedkeys(":breakdel    he\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel    here", @:)
+   call feedkeys(":breakdel abc\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel abc", @:)
+ 
+   " Test for :breakdel file [lnum] <file>
+   call writefile([], 'Xscript')
+   call feedkeys(":breakdel file Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel file Xscript", @:)
+   call feedkeys(":breakdel   file   Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel   file   Xscript", @:)
+   call feedkeys(":breakdel file 20 Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel file 20 Xscript", @:)
+   call feedkeys(":breakdel   file   20   Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel   file   20   Xscript", @:)
+   call feedkeys(":breakdel file 20x Xsc\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel file 20x Xsc\t", @:)
+   call feedkeys(":breakdel file 20\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel file 20\t", @:)
+   call feedkeys(":breakdel file 20x\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel file 20x\t", @:)
+   call feedkeys(":breakdel file Xscript  \<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel file Xscript  ", @:)
+   call feedkeys(":breakdel file X1B2C3\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel file X1B2C3", @:)
+   call delete('Xscript')
+ 
+   " Test for :breakdel func [lnum] <function>
+   func Xbreak_func()
+   endfunc
+   call feedkeys(":breakdel func Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel func Xbreak_func", @:)
+   call feedkeys(":breakdel   func   Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel   func   Xbreak_func", @:)
+   call feedkeys(":breakdel func 20 Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel func 20 Xbreak_func", @:)
+   call feedkeys(":breakdel   func   20   Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel   func   20   Xbreak_func", @:)
+   call feedkeys(":breakdel func 20x Xbr\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel func 20x Xbr\t", @:)
+   call feedkeys(":breakdel func 20\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel func 20\t", @:)
+   call feedkeys(":breakdel func 20x\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel func 20x\t", @:)
+   call feedkeys(":breakdel func Xbreak_func  \<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel func Xbreak_func  ", @:)
+   call feedkeys(":breakdel func X1B2C3\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel func X1B2C3", @:)
+   delfunc Xbreak_func
+ 
+   " Test for :breakdel here
+   call feedkeys(":breakdel here Xtest\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel here Xtest", @:)
+   call feedkeys(":breakdel   here   Xtest\<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel   here   Xtest", @:)
+   call feedkeys(":breakdel here \<Tab>\<C-B>\"\<CR>", 'tx')
+   call assert_equal("\"breakdel here ", @:)
+ 
+ endfunc
+ 
  " vim: shiftwidth=2 sts=2 expandtab
*** ../vim-8.2.4564/src/testdir/test_writefile.vim      2021-08-09 
20:04:20.944157290 +0100
--- src/testdir/test_writefile.vim      2022-03-14 19:16:37.723994349 +0000
***************
*** 890,895 ****
--- 890,898 ----
  " link to the original file. The backup file should not be modified.
  func Test_write_backup_symlink()
    CheckUnix
+   call mkdir('Xbackup')
+   let save_backupdir = &backupdir
+   set backupdir=.,./Xbackup
    call writefile(['1111'], 'Xfile')
    silent !ln -s Xfile Xfile.bak
  
***************
*** 898,908 ****
    write
    call assert_equal('link', getftype('Xfile.bak'))
    call assert_equal('Xfile', resolve('Xfile.bak'))
    set backup& backupcopy& backupext&
!   close
  
    call delete('Xfile')
    call delete('Xfile.bak')
  endfunc
  
  " Test for ':write ++bin' and ':write ++nobin'
--- 901,918 ----
    write
    call assert_equal('link', getftype('Xfile.bak'))
    call assert_equal('Xfile', resolve('Xfile.bak'))
+   " backup file should be created in the 'backup' directory
+   if !has('bsd')
+     " This check fails on FreeBSD
+     call assert_true(filereadable('./Xbackup/Xfile.bak'))
+   endif
    set backup& backupcopy& backupext&
!   %bw
  
    call delete('Xfile')
    call delete('Xfile.bak')
+   call delete('Xbackup', 'rf')
+   let &backupdir = save_backupdir
  endfunc
  
  " Test for ':write ++bin' and ':write ++nobin'
*** ../vim-8.2.4564/src/version.c       2022-03-14 10:50:16.382185007 +0000
--- src/version.c       2022-03-14 19:18:14.484049345 +0000
***************
*** 752,753 ****
--- 752,755 ----
  {   /* Add new patch number below this line */
+ /**/
+     4565,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
257. Your "hundred-and-one" lists include well over 101 items, since you
     automatically interpret all numbers in hexadecimal notation.
     (hex 101 = decimal 257)

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            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/20220314192518.0C34D1C1285%40moolenaar.net.

Raspunde prin e-mail lui