summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-01-14 14:28:30 +0100
committerBram Moolenaar <Bram@vim.org>2017-01-14 14:28:30 +0100
commit9be7c04e6cd5b0facedcb56b09a5bcfc339efe03 (patch)
tree8904427003c2cea7b63ffae1e0570a54f5c77e87
parent9b73c4a215cb5f0f7df1e7f0663aea2bce1914ab (diff)
downloadvim-git-9be7c04e6cd5b0facedcb56b09a5bcfc339efe03.tar.gz
patch 8.0.0179: cannot have a local value for 'formatprg'v8.0.0179
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)
-rw-r--r--runtime/doc/options.txt2
-rw-r--r--src/normal.c10
-rw-r--r--src/option.c11
-rw-r--r--src/option.h1
-rw-r--r--src/structs.h1
-rw-r--r--src/testdir/test_normal.vim32
-rw-r--r--src/version.c2
7 files changed, 43 insertions, 16 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 3d8e053f4..88dca60b7 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -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
diff --git a/src/normal.c b/src/normal.c
index 5d0796f47..3456b73be 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -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']");
}
diff --git a/src/option.c b/src/option.c
index 920f163a5..6f9610dd0 100644
--- a/src/option.c
+++ b/src/option.c
@@ -107,6 +107,7 @@
#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
diff --git a/src/option.h b/src/option.h
index 13acabf7b..0ad2fef64 100644
--- a/src/option.h
+++ b/src/option.h
@@ -1029,6 +1029,7 @@ enum
, BV_EP
, BV_ET
, BV_FENC
+ , BV_FP
#ifdef FEAT_EVAL
, BV_BEXPR
, BV_FEX
diff --git a/src/structs.h b/src/structs.h
index 3fdfb5fcd..9c0e0468b 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -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' */
diff --git a/src/testdir/test_normal.vim b/src/testdir/test_normal.vim
index 29bd783eb..98177851a 100644
--- a/src/testdir/test_normal.vim
+++ b/src/testdir/test_normal.vim
@@ -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
diff --git a/src/version.c b/src/version.c
index 1b64d5870..dd5f700f8 100644
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 179,
+/**/
178,
/**/
177,