| To: vim_dev@googlegroups.com |
| Subject: Patch 7.4.191 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.4.191 |
| Problem: Escaping a file name for shell commands can't be done without a |
| function. |
| Solution: Add the :S file name modifier. |
| Files: src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak, |
| src/testdir/Make_ming.mak, src/testdir/Make_os2.mak, |
| src/testdir/Make_vms.mms, src/testdir/Makefile, |
| src/testdir/test105.in, src/testdir/test105.ok, |
| runtime/doc/cmdline.txt, runtime/doc/eval.txt, |
| runtime/doc/map.txt, runtime/doc/options.txt, |
| runtime/doc/quickfix.txt, runtime/doc/usr_30.txt, |
| runtime/doc/usr_40.txt, runtime/doc/usr_42.txt, |
| runtime/doc/vi_diff.txt, src/eval.c, src/misc2.c, src/normal.c, |
| src/proto/misc2.pro |
| |
| |
| |
| |
| |
| *** 35,41 **** |
| test89.out test90.out test91.out test92.out test93.out \ |
| test94.out test95.out test96.out test97.out test98.out \ |
| test99.out test100.out test101.out test102.out test103.out \ |
| ! test104.out |
| |
| .SUFFIXES: .in .out |
| |
| --- 35,41 ---- |
| test89.out test90.out test91.out test92.out test93.out \ |
| test94.out test95.out test96.out test97.out test98.out \ |
| test99.out test100.out test101.out test102.out test103.out \ |
| ! test104.out test105.out |
| |
| .SUFFIXES: .in .out |
| |
| |
| *** 156,158 **** |
| --- 156,159 ---- |
| test102.out: test102.in |
| test103.out: test103.in |
| test104.out: test104.in |
| + test105.out: test105.in |
| |
| |
| |
| *** 33,39 **** |
| test84.out test85.out test86.out test87.out test88.out \ |
| test89.out test90.out test91.out test92.out test93.out \ |
| test94.out test95.out test96.out test98.out test99.out \ |
| ! test100.out test101.out test102.out test103.out test104.out |
| |
| SCRIPTS32 = test50.out test70.out |
| |
| --- 33,40 ---- |
| test84.out test85.out test86.out test87.out test88.out \ |
| test89.out test90.out test91.out test92.out test93.out \ |
| test94.out test95.out test96.out test98.out test99.out \ |
| ! test100.out test101.out test102.out test103.out test104.out \ |
| ! test105.out |
| |
| SCRIPTS32 = test50.out test70.out |
| |
| |
| |
| |
| *** 53,59 **** |
| test84.out test85.out test86.out test87.out test88.out \ |
| test89.out test90.out test91.out test92.out test93.out \ |
| test94.out test95.out test96.out test98.out test99.out \ |
| ! test100.out test101.out test102.out test103.out test104.out |
| |
| SCRIPTS32 = test50.out test70.out |
| |
| --- 53,60 ---- |
| test84.out test85.out test86.out test87.out test88.out \ |
| test89.out test90.out test91.out test92.out test93.out \ |
| test94.out test95.out test96.out test98.out test99.out \ |
| ! test100.out test101.out test102.out test103.out test104.out \ |
| ! test105.out |
| |
| SCRIPTS32 = test50.out test70.out |
| |
| |
| |
| |
| *** 35,41 **** |
| test81.out test82.out test83.out test84.out test88.out \ |
| test89.out test90.out test91.out test92.out test93.out \ |
| test94.out test95.out test96.out test98.out test99.out \ |
| ! test100.out test101.out test102.out test103.out test104.out |
| |
| .SUFFIXES: .in .out |
| |
| --- 35,42 ---- |
| test81.out test82.out test83.out test84.out test88.out \ |
| test89.out test90.out test91.out test92.out test93.out \ |
| test94.out test95.out test96.out test98.out test99.out \ |
| ! test100.out test101.out test102.out test103.out test104.out \ |
| ! test105.out |
| |
| .SUFFIXES: .in .out |
| |
| |
| |
| |
| *** 4,10 **** |
| # Authors: Zoltan Arpadffy, <arpadffy@polarhome.com> |
| # Sandor Kopanyi, <sandor.kopanyi@mailbox.hu> |
| # |
| ! # Last change: 2013 Nov 21 |
| # |
| # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64. |
| # Edit the lines in the Configuration section below to select. |
| --- 4,10 ---- |
| # Authors: Zoltan Arpadffy, <arpadffy@polarhome.com> |
| # Sandor Kopanyi, <sandor.kopanyi@mailbox.hu> |
| # |
| ! # Last change: 2014 Feb 23 |
| # |
| # This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64. |
| # Edit the lines in the Configuration section below to select. |
| |
| *** 79,85 **** |
| test82.out test83.out test84.out test88.out test89.out \ |
| test90.out test91.out test92.out test93.out test94.out \ |
| test95.out test96.out test97.out test98.out test99.out \ |
| ! test100.out test101.out test102.out test103.out test104.out |
| |
| # Known problems: |
| # Test 30: a problem around mac format - unknown reason |
| --- 79,86 ---- |
| test82.out test83.out test84.out test88.out test89.out \ |
| test90.out test91.out test92.out test93.out test94.out \ |
| test95.out test96.out test97.out test98.out test99.out \ |
| ! test100.out test101.out test102.out test103.out test104.out \ |
| ! test105.out |
| |
| # Known problems: |
| # Test 30: a problem around mac format - unknown reason |
| |
| |
| |
| *** 31,37 **** |
| test89.out test90.out test91.out test92.out test93.out \ |
| test94.out test95.out test96.out test97.out test98.out \ |
| test99.out test100.out test101.out test102.out test103.out \ |
| ! test104.out |
| |
| SCRIPTS_GUI = test16.out |
| |
| --- 31,37 ---- |
| test89.out test90.out test91.out test92.out test93.out \ |
| test94.out test95.out test96.out test97.out test98.out \ |
| test99.out test100.out test101.out test102.out test103.out \ |
| ! test104.out test105.out |
| |
| SCRIPTS_GUI = test16.out |
| |
| |
| |
| |
| |
| --- 1,45 ---- |
| + Test filename modifiers vim: set ft=vim : |
| + |
| + STARTTEST |
| + :source small.vim |
| + :%delete _ |
| + :set shell=sh |
| + :set shellslash |
| + :let tab="\t" |
| + :command -nargs=1 Put :let expr=<q-args> | $put =expr.tab.strtrans(string(eval(expr))) |
| + :let $HOME=fnamemodify('.', ':p:h:h:h') |
| + :Put fnamemodify('.', ':p' )[-1:] |
| + :Put fnamemodify('.', ':p:h' )[-1:] |
| + :Put fnamemodify('test.out', ':p' )[-1:] |
| + :Put fnamemodify('test.out', ':.' ) |
| + :Put fnamemodify('../testdir/a', ':.' ) |
| + :Put fnamemodify('test.out', ':~' ) |
| + :Put fnamemodify('../testdir/a', ':~' ) |
| + :Put fnamemodify('../testdir/a', ':t' ) |
| + :Put fnamemodify('.', ':p:t' ) |
| + :Put fnamemodify('test.out', ':p:t' ) |
| + :Put fnamemodify('test.out', ':p:e' ) |
| + :Put fnamemodify('test.out', ':p:t:e' ) |
| + :Put fnamemodify('abc.fb2.tar.gz', ':r' ) |
| + :Put fnamemodify('abc.fb2.tar.gz', ':r:r' ) |
| + :Put fnamemodify('abc.fb2.tar.gz', ':r:r:r' ) |
| + :Put substitute(fnamemodify('abc.fb2.tar.gz', ':p:r:r'), '.*\(src/testdir/.*\)', '\1', '') |
| + :Put fnamemodify('abc.fb2.tar.gz', ':e' ) |
| + :Put fnamemodify('abc.fb2.tar.gz', ':e:e' ) |
| + :Put fnamemodify('abc.fb2.tar.gz', ':e:e:e' ) |
| + :Put fnamemodify('abc.fb2.tar.gz', ':e:e:e:e') |
| + :Put fnamemodify('abc.fb2.tar.gz', ':e:e:r' ) |
| + :Put fnamemodify('abc def', ':S' ) |
| + :Put fnamemodify('abc" "def', ':S' ) |
| + :Put fnamemodify('abc"%"def', ':S' ) |
| + :Put fnamemodify('abc'' ''def', ':S' ) |
| + :Put fnamemodify('abc''%''def', ':S' ) |
| + :Put fnamemodify("abc\ndef", ':S' ) |
| + :set shell=tcsh |
| + :Put fnamemodify("abc\ndef", ':S' ) |
| + :$put ='vim: ts=8' |
| + :1 delete _ |
| + :w! test.out |
| + :qa! |
| + ENDTEST |
| + |
| |
| |
| |
| |
| --- 1,29 ---- |
| + fnamemodify('.', ':p' )[-1:] '/' |
| + fnamemodify('.', ':p:h' )[-1:] 'r' |
| + fnamemodify('test.out', ':p' )[-1:] 't' |
| + fnamemodify('test.out', ':.' ) 'test.out' |
| + fnamemodify('../testdir/a', ':.' ) 'a' |
| + fnamemodify('test.out', ':~' ) '~/src/testdir/test.out' |
| + fnamemodify('../testdir/a', ':~' ) '~/src/testdir/a' |
| + fnamemodify('../testdir/a', ':t' ) 'a' |
| + fnamemodify('.', ':p:t' ) '' |
| + fnamemodify('test.out', ':p:t' ) 'test.out' |
| + fnamemodify('test.out', ':p:e' ) 'out' |
| + fnamemodify('test.out', ':p:t:e' ) 'out' |
| + fnamemodify('abc.fb2.tar.gz', ':r' ) 'abc.fb2.tar' |
| + fnamemodify('abc.fb2.tar.gz', ':r:r' ) 'abc.fb2' |
| + fnamemodify('abc.fb2.tar.gz', ':r:r:r' ) 'abc' |
| + substitute(fnamemodify('abc.fb2.tar.gz', ':p:r:r'), '.*\(src/testdir/.*\)', '\1', '') 'src/testdir/abc.fb2' |
| + fnamemodify('abc.fb2.tar.gz', ':e' ) 'gz' |
| + fnamemodify('abc.fb2.tar.gz', ':e:e' ) 'tar.gz' |
| + fnamemodify('abc.fb2.tar.gz', ':e:e:e' ) 'fb2.tar.gz' |
| + fnamemodify('abc.fb2.tar.gz', ':e:e:e:e') 'fb2.tar.gz' |
| + fnamemodify('abc.fb2.tar.gz', ':e:e:r' ) 'tar' |
| + fnamemodify('abc def', ':S' ) '''abc def''' |
| + fnamemodify('abc" "def', ':S' ) '''abc" "def''' |
| + fnamemodify('abc"%"def', ':S' ) '''abc"%"def''' |
| + fnamemodify('abc'' ''def', ':S' ) '''abc''\'''' ''\''''def''' |
| + fnamemodify('abc''%''def', ':S' ) '''abc''\''''%''\''''def''' |
| + fnamemodify("abc\ndef", ':S' ) '''abc^@def''' |
| + fnamemodify("abc\ndef", ':S' ) '''abc\^@def''' |
| + vim: ts=8 |
| |
| |
| |
| *** 758,763 **** |
| --- 758,764 ---- |
| function expand() |expand()|. |
| % Is replaced with the current file name. *:_%* *c_%* |
| # Is replaced with the alternate file name. *:_#* *c_#* |
| + This is remembered for every window. |
| #n (where n is a number) is replaced with *:_#0* *:_#n* |
| the file name of buffer n. "#0" is the same as "#". *c_#n* |
| ## Is replaced with all names in the argument list *:_##* *c_##* |
| |
| *** 823,830 **** |
| the start of the function. |
| |
| *filename-modifiers* |
| ! *:_%:* *::8* *::p* *::.* *::~* *::h* *::t* *::r* *::e* *::s* *::gs* |
| ! *%:8* *%:p* *%:.* *%:~* *%:h* *%:t* *%:r* *%:e* *%:s* *%:gs* |
| The file name modifiers can be used after "%", "#", "#n", "<cfile>", "<sfile>", |
| "<afile>" or "<abuf>". They are also used with the |fnamemodify()| function. |
| These are not available when Vim has been compiled without the |+modify_fname| |
| --- 824,831 ---- |
| the start of the function. |
| |
| *filename-modifiers* |
| ! *:_%:* *::8* *::p* *::.* *::~* *::h* *::t* *::r* *::e* *::s* *::gs* *::S* |
| ! *%:8* *%:p* *%:.* *%:~* *%:h* *%:t* *%:r* *%:e* *%:s* *%:gs* *%:S* |
| The file name modifiers can be used after "%", "#", "#n", "<cfile>", "<sfile>", |
| "<afile>" or "<abuf>". They are also used with the |fnamemodify()| function. |
| These are not available when Vim has been compiled without the |+modify_fname| |
| |
| *** 879,884 **** |
| --- 880,889 ---- |
| :gs?pat?sub? |
| Substitute all occurrences of "pat" with "sub". Otherwise |
| this works like ":s". |
| + :S Escape special characters for use with a shell command (see |
| + |shellescape()|). Must be the last one. Examples: > |
| + :!dir <cfile>:S |
| + :call system('chmod +w -- ' . expand('%:S')) |
| |
| Examples, when the file name is "src/version.c", current dir |
| "/home/mool/vim": > |
| |
| |
| |
| *** 5414,5419 **** |
| --- 5428,5434 ---- |
| < This results in a directory listing for the file under the |
| cursor. Example of use with |system()|: > |
| :call system("chmod +w -- " . shellescape(expand("%"))) |
| + < See also |::S|. |
| |
| |
| shiftwidth() *shiftwidth()* |
| |
| *** 5896,5909 **** |
| passed as stdin to the command. The string is written as-is, |
| you need to take care of using the correct line separators |
| yourself. Pipes are not used. |
| ! Note: Use |shellescape()| to escape special characters in a |
| ! command argument. Newlines in {expr} may cause the command to |
| ! fail. The characters in 'shellquote' and 'shellxquote' may |
| ! also cause trouble. |
| This is not to be used for interactive commands. |
| |
| The result is a String. Example: > |
| :let files = system("ls " . shellescape(expand('%:h'))) |
| |
| < To make the result more system-independent, the shell output |
| is filtered to replace <CR> with <NL> for Macintosh, and |
| --- 5911,5926 ---- |
| passed as stdin to the command. The string is written as-is, |
| you need to take care of using the correct line separators |
| yourself. Pipes are not used. |
| ! Note: Use |shellescape()| or |::S| with |expand()| or |
| ! |fnamemodify()| to escape special characters in a command |
| ! argument. Newlines in {expr} may cause the command to fail. |
| ! The characters in 'shellquote' and 'shellxquote' may also |
| ! cause trouble. |
| This is not to be used for interactive commands. |
| |
| The result is a String. Example: > |
| :let files = system("ls " . shellescape(expand('%:h'))) |
| + :let files = system('ls ' . expand('%:h:S')) |
| |
| < To make the result more system-independent, the shell output |
| is filtered to replace <CR> with <NL> for Macintosh, and |
| |
| |
| |
| *** 380,386 **** |
| The simplest way to load a set of related language mappings is by using the |
| 'keymap' option. See |45.5|. |
| In Insert mode and in Command-line mode the mappings can be disabled with |
| ! the CTRL-^ command |i_CTRL-^| |c_CTRL-^| These commands change the value of |
| the 'iminsert' option. When starting to enter a normal command line (not a |
| search pattern) the mappings are disabled until a CTRL-^ is typed. The state |
| last used is remembered for Insert mode and Search patterns separately. The |
| --- 380,386 ---- |
| The simplest way to load a set of related language mappings is by using the |
| 'keymap' option. See |45.5|. |
| In Insert mode and in Command-line mode the mappings can be disabled with |
| ! the CTRL-^ command |i_CTRL-^| |c_CTRL-^|. These commands change the value of |
| the 'iminsert' option. When starting to enter a normal command line (not a |
| search pattern) the mappings are disabled until a CTRL-^ is typed. The state |
| last used is remembered for Insert mode and Search patterns separately. The |
| |
| *** 593,599 **** |
| When you have a mapping that contains an Ex command, you need to put a line |
| terminator after it to have it executed. The use of <CR> is recommended for |
| this (see |<>|). Example: > |
| ! :map _ls :!ls -l %<CR>:echo "the end"<CR> |
| |
| To avoid mapping of the characters you type in insert or Command-line mode, |
| type a CTRL-V first. The mapping in Insert mode is disabled if the 'paste' |
| --- 593,599 ---- |
| When you have a mapping that contains an Ex command, you need to put a line |
| terminator after it to have it executed. The use of <CR> is recommended for |
| this (see |<>|). Example: > |
| ! :map _ls :!ls -l %:S<CR>:echo "the end"<CR> |
| |
| To avoid mapping of the characters you type in insert or Command-line mode, |
| type a CTRL-V first. The mapping in Insert mode is disabled if the 'paste' |
| |
| |
| |
| *** 4757,4764 **** |
| global or local to buffer |global-local| |
| {not in Vi} |
| Program to use for the ":make" command. See |:make_makeprg|. |
| ! This option may contain '%' and '#' characters, which are expanded to |
| ! the current and alternate file name. |:_%| |:_#| |
| Environment variables are expanded |:set_env|. See |option-backslash| |
| about including spaces and backslashes. |
| Note that a '|' must be escaped twice: once for ":set" and once for |
| --- 4757,4765 ---- |
| global or local to buffer |global-local| |
| {not in Vi} |
| Program to use for the ":make" command. See |:make_makeprg|. |
| ! This option may contain '%' and '#' characters (see |:_%| and |:_#|), |
| ! which are expanded to the current and alternate file name. Use |::S| |
| ! to escape file names in case they contain special characters. |
| Environment variables are expanded |:set_env|. See |option-backslash| |
| about including spaces and backslashes. |
| Note that a '|' must be escaped twice: once for ":set" and once for |
| |
| |
| |
| *** 838,844 **** |
| The alltests.py script seems to be used quite often, that's all. |
| Useful values for the 'makeprg' options therefore are: |
| setlocal makeprg=./alltests.py " Run a testsuite |
| ! setlocal makeprg=python % " Run a single testcase |
| |
| Also see http://vim.sourceforge.net/tip_view.php?tip_id=280. |
| |
| --- 838,844 ---- |
| The alltests.py script seems to be used quite often, that's all. |
| Useful values for the 'makeprg' options therefore are: |
| setlocal makeprg=./alltests.py " Run a testsuite |
| ! setlocal makeprg=python\ %:S " Run a single testcase |
| |
| Also see http://vim.sourceforge.net/tip_view.php?tip_id=280. |
| |
| |
| *** 1332,1338 **** |
| Here is an alternative from Michael F. Lamb for Unix that filters the errors |
| first: > |
| :setl errorformat=%Z%f:%l:\ %m,%A%p^,%-G%*[^sl]%.%# |
| ! :setl makeprg=javac\ %\ 2>&1\ \\\|\ vim-javac-filter |
| |
| You need to put the following in "vim-javac-filter" somewhere in your path |
| (e.g., in ~/bin) and make it executable: > |
| --- 1332,1338 ---- |
| Here is an alternative from Michael F. Lamb for Unix that filters the errors |
| first: > |
| :setl errorformat=%Z%f:%l:\ %m,%A%p^,%-G%*[^sl]%.%# |
| ! :setl makeprg=javac\ %:S\ 2>&1\ \\\|\ vim-javac-filter |
| |
| You need to put the following in "vim-javac-filter" somewhere in your path |
| (e.g., in ~/bin) and make it executable: > |
| |
| |
| |
| *** 128,134 **** |
| You can include special Vim keywords in the command specification. The % |
| character expands to the name of the current file. So if you execute the |
| command: > |
| ! :set makeprg=make\ % |
| |
| When you are editing main.c, then ":make" executes the following command: > |
| |
| --- 128,134 ---- |
| You can include special Vim keywords in the command specification. The % |
| character expands to the name of the current file. So if you execute the |
| command: > |
| ! :set makeprg=make\ %:S |
| |
| When you are editing main.c, then ":make" executes the following command: > |
| |
| |
| *** 137,143 **** |
| This is not too useful, so you will refine the command a little and use the :r |
| (root) modifier: > |
| |
| ! :set makeprg=make\ %:r.o |
| |
| Now the command executed is as follows: > |
| |
| --- 137,143 ---- |
| This is not too useful, so you will refine the command a little and use the :r |
| (root) modifier: > |
| |
| ! :set makeprg=make\ %:r:S.o |
| |
| Now the command executed is as follows: > |
| |
| |
| |
| |
| *** 209,215 **** |
| separates the two commands. This also means that a | character can't be used |
| inside a map command. To include one, use <Bar> (five characters). Example: |
| > |
| ! :map <F8> :write <Bar> !checkin %<CR> |
| |
| The same problem applies to the ":unmap" command, with the addition that you |
| have to watch out for trailing white space. These two commands are different: |
| --- 209,215 ---- |
| separates the two commands. This also means that a | character can't be used |
| inside a map command. To include one, use <Bar> (five characters). Example: |
| > |
| ! :map <F8> :write <Bar> !checkin %:S<CR> |
| |
| The same problem applies to the ":unmap" command, with the addition that you |
| have to watch out for trailing white space. These two commands are different: |
| |
| |
| |
| *** 311,317 **** |
| item with a bitmap. For example, define a new toolbar item with: > |
| |
| :tmenu ToolBar.Compile Compile the current file |
| ! :amenu ToolBar.Compile :!cc % -o %:r<CR> |
| |
| Now you need to create the icon. For MS-Windows it must be in bitmap format, |
| with the name "Compile.bmp". For Unix XPM format is used, the file name is |
| --- 311,317 ---- |
| item with a bitmap. For example, define a new toolbar item with: > |
| |
| :tmenu ToolBar.Compile Compile the current file |
| ! :amenu ToolBar.Compile :!cc %:S -o %:r:S<CR> |
| |
| Now you need to create the icon. For MS-Windows it must be in bitmap format, |
| with the name "Compile.bmp". For Unix XPM format is used, the file name is |
| |
| |
| |
| *** 540,546 **** |
| Added :wnext command. Same as ":write" followed by ":next". |
| |
| The ":w!" command always writes, also when the file is write protected. In Vi |
| ! you would have to do ":!chmod +w %" and ":set noro". |
| |
| When 'tildeop' has been set, "~" is an operator (must be followed by a |
| movement command). |
| --- 540,546 ---- |
| Added :wnext command. Same as ":write" followed by ":next". |
| |
| The ":w!" command always writes, also when the file is write protected. In Vi |
| ! you would have to do ":!chmod +w %:S" and ":set noro". |
| |
| When 'tildeop' has been set, "~" is an operator (must be followed by a |
| movement command). |
| |
| |
| |
| *** 16950,16956 **** |
| typval_T *rettv; |
| { |
| rettv->vval.v_string = vim_strsave_shellescape( |
| ! get_tv_string(&argvars[0]), non_zero_arg(&argvars[1])); |
| rettv->v_type = VAR_STRING; |
| } |
| |
| --- 16950,16956 ---- |
| typval_T *rettv; |
| { |
| rettv->vval.v_string = vim_strsave_shellescape( |
| ! get_tv_string(&argvars[0]), non_zero_arg(&argvars[1]), TRUE); |
| rettv->v_type = VAR_STRING; |
| } |
| |
| |
| *** 24355,24360 **** |
| --- 24355,24371 ---- |
| } |
| } |
| |
| + if (src[*usedlen] == ':' && src[*usedlen + 1] == 'S') |
| + { |
| + p = vim_strsave_shellescape(*fnamep, FALSE, FALSE); |
| + if (p == NULL) |
| + return -1; |
| + vim_free(*bufp); |
| + *bufp = *fnamep = p; |
| + *fnamelen = (int)STRLEN(p); |
| + *usedlen += 2; |
| + } |
| + |
| return valid; |
| } |
| |
| |
| |
| |
| *** 1369,1380 **** |
| * Escape a newline, depending on the 'shell' option. |
| * When "do_special" is TRUE also replace "!", "%", "#" and things starting |
| * with "<" like "<cfile>". |
| * Returns the result in allocated memory, NULL if we have run out. |
| */ |
| char_u * |
| ! vim_strsave_shellescape(string, do_special) |
| char_u *string; |
| int do_special; |
| { |
| unsigned length; |
| char_u *p; |
| --- 1369,1382 ---- |
| * Escape a newline, depending on the 'shell' option. |
| * When "do_special" is TRUE also replace "!", "%", "#" and things starting |
| * with "<" like "<cfile>". |
| + * When "do_newline" is FALSE do not escape newline unless it is csh shell. |
| * Returns the result in allocated memory, NULL if we have run out. |
| */ |
| char_u * |
| ! vim_strsave_shellescape(string, do_special, do_newline) |
| char_u *string; |
| int do_special; |
| + int do_newline; |
| { |
| unsigned length; |
| char_u *p; |
| |
| *** 1403,1409 **** |
| # endif |
| if (*p == '\'') |
| length += 3; /* ' => '\'' */ |
| ! if (*p == '\n' || (*p == '!' && (csh_like || do_special))) |
| { |
| ++length; /* insert backslash */ |
| if (csh_like && do_special) |
| --- 1405,1412 ---- |
| # endif |
| if (*p == '\'') |
| length += 3; /* ' => '\'' */ |
| ! if ((*p == '\n' && (csh_like || do_newline)) |
| ! || (*p == '!' && (csh_like || do_special))) |
| { |
| ++length; /* insert backslash */ |
| if (csh_like && do_special) |
| |
| *** 1454,1460 **** |
| ++p; |
| continue; |
| } |
| ! if (*p == '\n' || (*p == '!' && (csh_like || do_special))) |
| { |
| *d++ = '\\'; |
| if (csh_like && do_special) |
| --- 1457,1464 ---- |
| ++p; |
| continue; |
| } |
| ! if ((*p == '\n' && (csh_like || do_newline)) |
| ! || (*p == '!' && (csh_like || do_special))) |
| { |
| *d++ = '\\'; |
| if (csh_like && do_special) |
| |
| |
| |
| *** 5790,5796 **** |
| { |
| /* Escape the argument properly for a shell command */ |
| ptr = vim_strnsave(ptr, n); |
| ! p = vim_strsave_shellescape(ptr, TRUE); |
| vim_free(ptr); |
| if (p == NULL) |
| { |
| --- 5790,5796 ---- |
| { |
| /* Escape the argument properly for a shell command */ |
| ptr = vim_strnsave(ptr, n); |
| ! p = vim_strsave_shellescape(ptr, TRUE, TRUE); |
| vim_free(ptr); |
| if (p == NULL) |
| { |
| |
| |
| |
| *** 32,38 **** |
| char_u *vim_strsave_escaped __ARGS((char_u *string, char_u *esc_chars)); |
| char_u *vim_strsave_escaped_ext __ARGS((char_u *string, char_u *esc_chars, int cc, int bsl)); |
| int csh_like_shell __ARGS((void)); |
| ! char_u *vim_strsave_shellescape __ARGS((char_u *string, int do_special)); |
| char_u *vim_strsave_up __ARGS((char_u *string)); |
| char_u *vim_strnsave_up __ARGS((char_u *string, int len)); |
| void vim_strup __ARGS((char_u *p)); |
| --- 32,38 ---- |
| char_u *vim_strsave_escaped __ARGS((char_u *string, char_u *esc_chars)); |
| char_u *vim_strsave_escaped_ext __ARGS((char_u *string, char_u *esc_chars, int cc, int bsl)); |
| int csh_like_shell __ARGS((void)); |
| ! char_u *vim_strsave_shellescape __ARGS((char_u *string, int do_special, int do_newline)); |
| char_u *vim_strsave_up __ARGS((char_u *string)); |
| char_u *vim_strnsave_up __ARGS((char_u *string, int len)); |
| void vim_strup __ARGS((char_u *p)); |
| |
| |
| |
| *** 740,741 **** |
| --- 740,743 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 191, |
| /**/ |
| |
| -- |
| Windows |
| M!uqoms |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- 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 /// |