]> granicus.if.org Git - vim/commitdiff
patch 8.0.0179: cannot have a local value for 'formatprg' v8.0.0179
authorBram Moolenaar <Bram@vim.org>
Sat, 14 Jan 2017 13:28:30 +0000 (14:28 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 14 Jan 2017 13:28:30 +0000 (14:28 +0100)
Problem:    'formatprg' is a global option but the value may depend on the
            type of buffer. (Sung Pae)
Solution:   Make 'formatprg' global-local. (closes #1380)

runtime/doc/options.txt
src/normal.c
src/option.c
src/option.h
src/structs.h
src/testdir/test_normal.vim
src/version.c

index 3d8e053f484e7c7a4a95eaaab324b026f12c6648..88dca60b7727d140ce82ea8a7f16be5ada92c898 100644 (file)
@@ -3417,7 +3417,7 @@ A jump table for the options with a short description can be found at |Q_op|.
 
                                                *'formatprg'* *'fp'*
 'formatprg' 'fp'       string (default "")
-                       global
+                       global or local to buffer |global-local|
                        {not in Vi}
        The name of an external program that will be used to format the lines
        selected with the |gq| operator.  The program must take the input on
index 5d0796f4744c1dace549d163e8cb60a033672d1a..3456b73be40aeab8aee83e61dab0cc3e148f54a6 100644 (file)
@@ -1984,7 +1984,7 @@ do_pending_operator(cmdarg_T *cap, int old_col, int gui_yank)
                op_formatexpr(oap);     /* use expression */
            else
 #endif
-               if (*p_fp != NUL)
+               if (*p_fp != NUL || *curbuf->b_p_fp != NUL)
                op_colon(oap);          /* use external command */
            else
                op_format(oap, FALSE);  /* use internal function */
@@ -2197,10 +2197,12 @@ op_colon(oparg_T *oap)
     }
     else if (oap->op_type == OP_FORMAT)
     {
-       if (*p_fp == NUL)
-           stuffReadbuff((char_u *)"fmt");
-       else
+       if (*curbuf->b_p_fp != NUL)
+           stuffReadbuff(curbuf->b_p_fp);
+       else if (*p_fp != NUL)
            stuffReadbuff(p_fp);
+       else
+           stuffReadbuff((char_u *)"fmt");
        stuffReadbuff((char_u *)"\n']");
     }
 
index 920f163a5fa30f6a93ba7c2d192035768c9f5da7..6f9610dd0f8866b48d44c6ff4d030d09d4204d4b 100644 (file)
 #if defined(FEAT_BEVAL) && defined(FEAT_EVAL)
 # define PV_BEXPR      OPT_BOTH(OPT_BUF(BV_BEXPR))
 #endif
+#define PV_FP          OPT_BOTH(OPT_BUF(BV_FP))
 #ifdef FEAT_EVAL
 # define PV_FEX                OPT_BUF(BV_FEX)
 #endif
@@ -1258,7 +1259,7 @@ static struct vimoption options[] =
                            {(char_u *)"^\\s*\\d\\+[\\]:.)}\\t ]\\s*",
                                                 (char_u *)0L} SCRIPTID_INIT},
     {"formatprg",   "fp",   P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
-                           (char_u *)&p_fp, PV_NONE,
+                           (char_u *)&p_fp, PV_FP,
                            {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
     {"fsync",       "fs",   P_BOOL|P_SECURE|P_VI_DEF,
 #ifdef HAVE_FSYNC
@@ -5481,6 +5482,7 @@ check_buf_options(buf_T *buf)
 #if defined(FEAT_CRYPT)
     check_string_option(&buf->b_p_cm);
 #endif
+    check_string_option(&buf->b_p_fp);
 #if defined(FEAT_EVAL)
     check_string_option(&buf->b_p_fex);
 #endif
@@ -10175,6 +10177,9 @@ unset_global_local_option(char_u *name, void *from)
            clear_string_option(&buf->b_p_tsr);
            break;
 #endif
+       case PV_FP:
+           clear_string_option(&buf->b_p_fp);
+           break;
 #ifdef FEAT_QUICKFIX
        case PV_EFM:
            clear_string_option(&buf->b_p_efm);
@@ -10228,6 +10233,7 @@ get_varp_scope(struct vimoption *p, int opt_flags)
     {
        switch ((int)p->indir)
        {
+           case PV_FP:   return (char_u *)&(curbuf->b_p_fp);
 #ifdef FEAT_QUICKFIX
            case PV_EFM:  return (char_u *)&(curbuf->b_p_efm);
            case PV_GP:   return (char_u *)&(curbuf->b_p_gp);
@@ -10308,6 +10314,8 @@ get_varp(struct vimoption *p)
        case PV_TSR:    return *curbuf->b_p_tsr != NUL
                                    ? (char_u *)&(curbuf->b_p_tsr) : p->var;
 #endif
+       case PV_FP:     return *curbuf->b_p_fp != NUL
+                                   ? (char_u *)&(curbuf->b_p_fp) : p->var;
 #ifdef FEAT_QUICKFIX
        case PV_EFM:    return *curbuf->b_p_efm != NUL
                                    ? (char_u *)&(curbuf->b_p_efm) : p->var;
@@ -10873,6 +10881,7 @@ buf_copy_options(buf_T *buf, int flags)
            buf->b_p_inde = vim_strsave(p_inde);
            buf->b_p_indk = vim_strsave(p_indk);
 #endif
+           buf->b_p_fp = empty_option;
 #if defined(FEAT_EVAL)
            buf->b_p_fex = vim_strsave(p_fex);
 #endif
index 13acabf7bd123a06877dedc7d6ee8c1cc526a207..0ad2fef64b2dce2f6442a2181cb58c84b4df91b2 100644 (file)
@@ -1029,6 +1029,7 @@ enum
     , BV_EP
     , BV_ET
     , BV_FENC
+    , BV_FP
 #ifdef FEAT_EVAL
     , BV_BEXPR
     , BV_FEX
index 3fdfb5fcd2104f5ebe09b6622f551a9084f936de..9c0e0468b4b617bbe6b56c5529ec7229c38c81db 100644 (file)
@@ -2097,6 +2097,7 @@ struct file_buffer
     long_u     b_p_inde_flags; /* flags for 'indentexpr' */
     char_u     *b_p_indk;      /* 'indentkeys' */
 #endif
+    char_u     *b_p_fp;        /* 'formatprg' */
 #if defined(FEAT_EVAL)
     char_u     *b_p_fex;       /* 'formatexpr' */
     long_u     b_p_fex_flags;  /* flags for 'formatexpr' */
index 29bd783ebc5c6b5c1d582d99404811baaee699de..98177851abfdbcc9f5c1613c3553d2254d9b018a 100644 (file)
@@ -224,21 +224,33 @@ func! Test_normal06_formatprg()
   " only test on non windows platform
   if has('win32')
     return
-  else
-    " uses sed to number non-empty lines
-    call writefile(['#!/bin/sh', 'sed ''/./=''|sed ''/./{', 'N', 's/\n/    /', '}'''], 'Xsed_format.sh')
-    call system('chmod +x ./Xsed_format.sh')
   endif
-  call Setup_NewWindow()
-  %d
-  call setline(1, ['a', '', 'c', '', ' ', 'd', 'e'])
+
+  " uses sed to number non-empty lines
+  call writefile(['#!/bin/sh', 'sed ''/./=''|sed ''/./{', 'N', 's/\n/    /', '}'''], 'Xsed_format.sh')
+  call system('chmod +x ./Xsed_format.sh')
+  let text = ['a', '', 'c', '', ' ', 'd', 'e']
+  let expected = ['1    a', '', '3    c', '', '5     ', '6    d', '7    e']
+
+  10new
+  call setline(1, text)
   set formatprg=./Xsed_format.sh
   norm! gggqG
-  call assert_equal(['1    a', '', '3    c', '', '5     ', '6    d', '7    e'], getline(1, '$'))
+  call assert_equal(expected, getline(1, '$'))
+  bw!
+
+  10new
+  call setline(1, text)
+  set formatprg=donothing
+  setlocal formatprg=./Xsed_format.sh
+  norm! gggqG
+  call assert_equal(expected, getline(1, '$'))
+  bw!
+
   " clean up
   set formatprg=
+  setlocal formatprg=
   call delete('Xsed_format.sh')
-  bw!
 endfunc
 
 func! Test_normal07_internalfmt()
@@ -251,7 +263,7 @@ func! Test_normal07_internalfmt()
   norm! gggqG
   call assert_equal(['1    2    3', '4    5    6', '7    8    9', '10    11    '], getline(1, '$'))
   " clean up
-  set formatprg= tw=0
+  set tw=0
   bw!
 endfunc
 
index 1b64d5870fe6ff769b1b6af297423afcc7d34c0c..dd5f700f863f1cc3d03f2a2f4de2096c2dd91f0d 100644 (file)
@@ -764,6 +764,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    179,
 /**/
     178,
 /**/