> Is this sufficient to explain what this does exactly?
> 
> Perhaps a few more references are needed in the help, it's not easy to
> guess that escaping can be done this way.

Done. Here two changesets are exported, update is in the second one. c.diff 
contains both:

# HG changeset patch
# User ZyX <[email protected]>
# Date 1385842851 -14400
#      Sun Dec 01 00:20:51 2013 +0400
# Branch S-modifier
# Node ID ce302bfd3622491bed0267bc6fedad0eb7cfc221
# Parent  486655e0c5a21469364d3cf895535137f09b3724
Add %:S filename modifier

diff -r 486655e0c5a2 -r ce302bfd3622 runtime/doc/cmdline.txt
--- a/runtime/doc/cmdline.txt   Thu Nov 28 19:27:30 2013 +0100
+++ b/runtime/doc/cmdline.txt   Sun Dec 01 00:20:51 2013 +0400
@@ -824,8 +824,8 @@
                   the start of the function.
 
                                                         *filename-modifiers*
-        *:_%:* *::8* *::p* *::.* *::~* *::h* *::t* *::r* *::e* *::s* *::gs*
-               *%:8* *%:p* *%:.* *%:~* *%:h* *%:t* *%:r* *%:e* *%:s* *%:gs*
+*:_%:* *::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|
@@ -880,6 +880,8 @@
        :gs?pat?sub?
                Substitute all occurrences of "pat" with "sub".  Otherwise
                this works like ":s".
+       :S      Escape special characters (see |shellescape()|). Must be the 
+               last one.
 
 Examples, when the file name is "src/version.c", current dir
 "/home/mool/vim": >
diff -r 486655e0c5a2 -r ce302bfd3622 src/eval.c
--- a/src/eval.c        Thu Nov 28 19:27:30 2013 +0100
+++ b/src/eval.c        Sun Dec 01 00:20:51 2013 +0400
@@ -16924,7 +16924,7 @@
     typval_T   *rettv;
 {
     rettv->vval.v_string = vim_strsave_shellescape(
-                      get_tv_string(&argvars[0]), non_zero_arg(&argvars[1]));
+               get_tv_string(&argvars[0]), non_zero_arg(&argvars[1]), TRUE);
     rettv->v_type = VAR_STRING;
 }
 
@@ -24328,6 +24328,17 @@
        }
     }
 
+    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;
 }
 
diff -r 486655e0c5a2 -r ce302bfd3622 src/misc2.c
--- a/src/misc2.c       Thu Nov 28 19:27:30 2013 +0100
+++ b/src/misc2.c       Sun Dec 01 00:20:51 2013 +0400
@@ -1368,13 +1368,15 @@
  * (MS-DOS and MS-Windows without 'shellslash' set).
  * Escape a newline, depending on the 'shell' option.
  * When "do_special" is TRUE also replace "!", "%", "#" and things starting
+ * When "do_newline" is FALSE do not escape newline unless it is csh shell
  * with "<" like "<cfile>".
  * Returns the result in allocated memory, NULL if we have run out.
  */
     char_u *
-vim_strsave_shellescape(string, do_special)
+vim_strsave_shellescape(string, do_special, do_newline)
     char_u     *string;
     int                do_special;
+    int                do_newline;
 {
     unsigned   length;
     char_u     *p;
@@ -1403,7 +1405,8 @@
 # endif
        if (*p == '\'')
            length += 3;                /* ' => '\'' */
-       if (*p == '\n' || (*p == '!' && (csh_like || do_special)))
+       if ((*p == '\n' && (csh_like || do_newline))
+               || (*p == '!' && (csh_like || do_special)))
        {
            ++length;                   /* insert backslash */
            if (csh_like && do_special)
@@ -1454,7 +1457,8 @@
                ++p;
                continue;
            }
-           if (*p == '\n' || (*p == '!' && (csh_like || do_special)))
+           if ((*p == '\n' && (csh_like || do_newline))
+                   || (*p == '!' && (csh_like || do_special)))
            {
                *d++ = '\\';
                if (csh_like && do_special)
diff -r 486655e0c5a2 -r ce302bfd3622 src/normal.c
--- a/src/normal.c      Thu Nov 28 19:27:30 2013 +0100
+++ b/src/normal.c      Sun Dec 01 00:20:51 2013 +0400
@@ -5784,7 +5784,7 @@
     {
        /* Escape the argument properly for a shell command */
        ptr = vim_strnsave(ptr, n);
-       p = vim_strsave_shellescape(ptr, TRUE);
+       p = vim_strsave_shellescape(ptr, TRUE, TRUE);
        vim_free(ptr);
        if (p == NULL)
        {
diff -r 486655e0c5a2 -r ce302bfd3622 src/proto/misc2.pro
--- a/src/proto/misc2.pro       Thu Nov 28 19:27:30 2013 +0100
+++ b/src/proto/misc2.pro       Sun Dec 01 00:20:51 2013 +0400
@@ -32,7 +32,7 @@
 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_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));
diff -r 486655e0c5a2 -r ce302bfd3622 src/testdir/Make_amiga.mak
--- a/src/testdir/Make_amiga.mak        Thu Nov 28 19:27:30 2013 +0100
+++ b/src/testdir/Make_amiga.mak        Sun Dec 01 00:20:51 2013 +0400
@@ -34,7 +34,8 @@
                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 test97.out test98.out \
-               test99.out test100.out test101.out test102.out test103.out
+               test99.out test100.out test101.out test102.out test103.out \
+               test104.out
 
 .SUFFIXES: .in .out
 
@@ -154,3 +155,4 @@
 test101.out: test101.in
 test102.out: test102.in
 test103.out: test103.in
+test104.out: test104.in
diff -r 486655e0c5a2 -r ce302bfd3622 src/testdir/Make_dos.mak
--- a/src/testdir/Make_dos.mak  Thu Nov 28 19:27:30 2013 +0100
+++ b/src/testdir/Make_dos.mak  Sun Dec 01 00:20:51 2013 +0400
@@ -33,7 +33,7 @@
                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
+               test100.out test101.out test102.out test103.out test104.out
 
 SCRIPTS32 =    test50.out test70.out
 
diff -r 486655e0c5a2 -r ce302bfd3622 src/testdir/Make_ming.mak
--- a/src/testdir/Make_ming.mak Thu Nov 28 19:27:30 2013 +0100
+++ b/src/testdir/Make_ming.mak Sun Dec 01 00:20:51 2013 +0400
@@ -53,7 +53,7 @@
                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 \
-               test100out test101.out test102.out test103.out
+               test100out test101.out test102.out test103.out test104.out
 
 SCRIPTS32 =    test50.out test70.out
 
diff -r 486655e0c5a2 -r ce302bfd3622 src/testdir/Make_os2.mak
--- a/src/testdir/Make_os2.mak  Thu Nov 28 19:27:30 2013 +0100
+++ b/src/testdir/Make_os2.mak  Sun Dec 01 00:20:51 2013 +0400
@@ -35,7 +35,7 @@
                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
+               test100.out test101.out test102.out test103.out test104.out
 
 .SUFFIXES: .in .out
 
diff -r 486655e0c5a2 -r ce302bfd3622 src/testdir/Make_vms.mms
--- a/src/testdir/Make_vms.mms  Thu Nov 28 19:27:30 2013 +0100
+++ b/src/testdir/Make_vms.mms  Sun Dec 01 00:20:51 2013 +0400
@@ -79,7 +79,7 @@
         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
+        test100.out test101.out test102.out test103.out test104.out
 
 # Known problems:
 # Test 30: a problem around mac format - unknown reason
diff -r 486655e0c5a2 -r ce302bfd3622 src/testdir/Makefile
--- a/src/testdir/Makefile      Thu Nov 28 19:27:30 2013 +0100
+++ b/src/testdir/Makefile      Sun Dec 01 00:20:51 2013 +0400
@@ -30,7 +30,8 @@
                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 test97.out test98.out \
-               test99.out test100.out test101.out test102.out test103.out
+               test99.out test100.out test101.out test102.out test103.out \
+               test104.out
 
 SCRIPTS_GUI = test16.out
 
diff -r 486655e0c5a2 -r ce302bfd3622 src/testdir/test104.in
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/testdir/test104.in    Sun Dec 01 00:20:51 2013 +0400
@@ -0,0 +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 fnamemodify('abc.fb2.tar.gz', ':p:r:r'  )
+: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
+
diff -r 486655e0c5a2 -r ce302bfd3622 src/testdir/test104.ok
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/testdir/test104.ok    Sun Dec 01 00:20:51 2013 +0400
@@ -0,0 +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'
+fnamemodify('abc.fb2.tar.gz', ':p:r:r'  )      
'/home/zyx/a.a/Proj/c/vim-small-patches/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
diff -r 486655e0c5a2 -r ce302bfd3622 src/testdir/test104.out
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/testdir/test104.out   Sun Dec 01 00:20:51 2013 +0400
@@ -0,0 +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'
+fnamemodify('abc.fb2.tar.gz', ':p:r:r'  )      
'/home/zyx/a.a/Proj/c/vim-small-patches/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
# HG changeset patch
# User ZyX <[email protected]>
# Date 1386303741 -14400
#      Fri Dec 06 08:22:21 2013 +0400
# Branch S-modifier
# Node ID 83480ec3a99cacf604e42ef4cdd7b01ebe6e27a1
# Parent  ce302bfd3622491bed0267bc6fedad0eb7cfc221
Add examples for %:S and reference or use it in a number of places

diff -r ce302bfd3622 -r 83480ec3a99c runtime/doc/cmdline.txt
--- a/runtime/doc/cmdline.txt   Sun Dec 01 00:20:51 2013 +0400
+++ b/runtime/doc/cmdline.txt   Fri Dec 06 08:22:21 2013 +0400
@@ -880,8 +880,10 @@
        :gs?pat?sub?
                Substitute all occurrences of "pat" with "sub".  Otherwise
                this works like ":s".
-       :S      Escape special characters (see |shellescape()|). Must be the 
-               last one.
+       :S      Escape special characters for use with shell (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": >
diff -r ce302bfd3622 -r 83480ec3a99c runtime/doc/eval.txt
--- a/runtime/doc/eval.txt      Sun Dec 01 00:20:51 2013 +0400
+++ b/runtime/doc/eval.txt      Fri Dec 06 08:22:21 2013 +0400
@@ -5418,6 +5418,7 @@
 <              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()*
@@ -5900,14 +5901,16 @@
                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.
+               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
@@ -7447,7 +7450,7 @@
                        for Vim commands, |shellescape()| for |:!| commands.
                        Examples: >
                :execute "e " . fnameescape(filename)
-               :execute "!ls " . shellescape(expand('%:h'), 1)
+               :execute "!ls " . shellescape(filename, 1)
 <
                        Note: The executed string may be any command-line, but
                        you cannot start or end a "while", "for" or "if"
diff -r ce302bfd3622 -r 83480ec3a99c runtime/doc/map.txt
--- a/runtime/doc/map.txt       Sun Dec 01 00:20:51 2013 +0400
+++ b/runtime/doc/map.txt       Fri Dec 06 08:22:21 2013 +0400
@@ -593,7 +593,7 @@
 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>
+   :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'
diff -r ce302bfd3622 -r 83480ec3a99c runtime/doc/options.txt
--- a/runtime/doc/options.txt   Sun Dec 01 00:20:51 2013 +0400
+++ b/runtime/doc/options.txt   Fri Dec 06 08:22:21 2013 +0400
@@ -4757,8 +4757,9 @@
                        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. |:_%| |:_#|
+       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
diff -r ce302bfd3622 -r 83480ec3a99c runtime/doc/quickfix.txt
--- a/runtime/doc/quickfix.txt  Sun Dec 01 00:20:51 2013 +0400
+++ b/runtime/doc/quickfix.txt  Fri Dec 06 08:22:21 2013 +0400
@@ -838,7 +838,7 @@
 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
+ setlocal makeprg=python\ %:S   " Run a single testcase
 
 Also see http://vim.sourceforge.net/tip_view.php?tip_id=280.
 
@@ -1332,7 +1332,7 @@
 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
+  :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: >
diff -r ce302bfd3622 -r 83480ec3a99c runtime/doc/usr_30.txt
--- a/runtime/doc/usr_30.txt    Sun Dec 01 00:20:51 2013 +0400
+++ b/runtime/doc/usr_30.txt    Fri Dec 06 08:22:21 2013 +0400
@@ -128,7 +128,7 @@
 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\ %
+       :set makeprg=make\ %:S
 
 When you are editing main.c, then ":make" executes the following command: >
 
@@ -137,7 +137,7 @@
 This is not too useful, so you will refine the command a little and use the :r
 (root) modifier: >
 
-       :set makeprg=make\ %:r.o
+       :set makeprg=make\ %:r:S.o
 
 Now the command executed is as follows: >
 
diff -r ce302bfd3622 -r 83480ec3a99c runtime/doc/usr_40.txt
--- a/runtime/doc/usr_40.txt    Sun Dec 01 00:20:51 2013 +0400
+++ b/runtime/doc/usr_40.txt    Fri Dec 06 08:22:21 2013 +0400
@@ -209,7 +209,7 @@
 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>
+       :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:
diff -r ce302bfd3622 -r 83480ec3a99c runtime/doc/usr_42.txt
--- a/runtime/doc/usr_42.txt    Sun Dec 01 00:20:51 2013 +0400
+++ b/runtime/doc/usr_42.txt    Fri Dec 06 08:22:21 2013 +0400
@@ -311,7 +311,7 @@
 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>
+       :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
diff -r ce302bfd3622 -r 83480ec3a99c runtime/doc/vi_diff.txt
--- a/runtime/doc/vi_diff.txt   Sun Dec 01 00:20:51 2013 +0400
+++ b/runtime/doc/vi_diff.txt   Fri Dec 06 08:22:21 2013 +0400
@@ -540,7 +540,7 @@
 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".
+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).

-- 
-- 
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].
For more options, visit https://groups.google.com/groups/opt_out.
diff -crN vim-small-patches.486655e0c5a2/runtime/doc/cmdline.txt vim-small-patches.83480ec3a99c/runtime/doc/cmdline.txt
*** vim-small-patches.486655e0c5a2/runtime/doc/cmdline.txt	2013-12-06 08:24:06.475485826 +0400
--- vim-small-patches.83480ec3a99c/runtime/doc/cmdline.txt	2013-12-06 08:24:06.521485830 +0400
***************
*** 824,831 ****
  		   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|
***************
*** 880,885 ****
--- 880,889 ----
  	:gs?pat?sub?
  		Substitute all occurrences of "pat" with "sub".  Otherwise
  		this works like ":s".
+ 	:S	Escape special characters for use with shell (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": >
diff -crN vim-small-patches.486655e0c5a2/runtime/doc/eval.txt vim-small-patches.83480ec3a99c/runtime/doc/eval.txt
*** vim-small-patches.486655e0c5a2/runtime/doc/eval.txt	2013-12-06 08:24:06.490485827 +0400
--- vim-small-patches.83480ec3a99c/runtime/doc/eval.txt	2013-12-06 08:24:06.539485832 +0400
***************
*** 5418,5423 ****
--- 5418,5424 ----
  <		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()*
***************
*** 5900,5913 ****
  		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
--- 5901,5916 ----
  		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
***************
*** 7447,7453 ****
  			for Vim commands, |shellescape()| for |:!| commands.
  			Examples: >
  		:execute "e " . fnameescape(filename)
! 		:execute "!ls " . shellescape(expand('%:h'), 1)
  <
  			Note: The executed string may be any command-line, but
  			you cannot start or end a "while", "for" or "if"
--- 7450,7456 ----
  			for Vim commands, |shellescape()| for |:!| commands.
  			Examples: >
  		:execute "e " . fnameescape(filename)
! 		:execute "!ls " . shellescape(filename, 1)
  <
  			Note: The executed string may be any command-line, but
  			you cannot start or end a "while", "for" or "if"
diff -crN vim-small-patches.486655e0c5a2/runtime/doc/map.txt vim-small-patches.83480ec3a99c/runtime/doc/map.txt
*** vim-small-patches.486655e0c5a2/runtime/doc/map.txt	2013-12-06 08:24:06.471485825 +0400
--- vim-small-patches.83480ec3a99c/runtime/doc/map.txt	2013-12-06 08:24:06.517485830 +0400
***************
*** 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'
diff -crN vim-small-patches.486655e0c5a2/runtime/doc/options.txt vim-small-patches.83480ec3a99c/runtime/doc/options.txt
*** vim-small-patches.486655e0c5a2/runtime/doc/options.txt	2013-12-06 08:24:06.484485827 +0400
--- vim-small-patches.83480ec3a99c/runtime/doc/options.txt	2013-12-06 08:24:06.530485831 +0400
***************
*** 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
diff -crN vim-small-patches.486655e0c5a2/runtime/doc/quickfix.txt vim-small-patches.83480ec3a99c/runtime/doc/quickfix.txt
*** vim-small-patches.486655e0c5a2/runtime/doc/quickfix.txt	2013-12-06 08:24:06.464485825 +0400
--- vim-small-patches.83480ec3a99c/runtime/doc/quickfix.txt	2013-12-06 08:24:06.509485829 +0400
***************
*** 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: >
diff -crN vim-small-patches.486655e0c5a2/runtime/doc/usr_30.txt vim-small-patches.83480ec3a99c/runtime/doc/usr_30.txt
*** vim-small-patches.486655e0c5a2/runtime/doc/usr_30.txt	2013-12-06 08:24:06.472485825 +0400
--- vim-small-patches.83480ec3a99c/runtime/doc/usr_30.txt	2013-12-06 08:24:06.517485830 +0400
***************
*** 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: >
  
diff -crN vim-small-patches.486655e0c5a2/runtime/doc/usr_40.txt vim-small-patches.83480ec3a99c/runtime/doc/usr_40.txt
*** vim-small-patches.486655e0c5a2/runtime/doc/usr_40.txt	2013-12-06 08:24:06.465485825 +0400
--- vim-small-patches.83480ec3a99c/runtime/doc/usr_40.txt	2013-12-06 08:24:06.510485829 +0400
***************
*** 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:
diff -crN vim-small-patches.486655e0c5a2/runtime/doc/usr_42.txt vim-small-patches.83480ec3a99c/runtime/doc/usr_42.txt
*** vim-small-patches.486655e0c5a2/runtime/doc/usr_42.txt	2013-12-06 08:24:06.470485825 +0400
--- vim-small-patches.83480ec3a99c/runtime/doc/usr_42.txt	2013-12-06 08:24:06.515485830 +0400
***************
*** 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
diff -crN vim-small-patches.486655e0c5a2/runtime/doc/vi_diff.txt vim-small-patches.83480ec3a99c/runtime/doc/vi_diff.txt
*** vim-small-patches.486655e0c5a2/runtime/doc/vi_diff.txt	2013-12-06 08:24:06.474485826 +0400
--- vim-small-patches.83480ec3a99c/runtime/doc/vi_diff.txt	2013-12-06 08:24:06.520485830 +0400
***************
*** 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).
diff -crN vim-small-patches.486655e0c5a2/src/eval.c vim-small-patches.83480ec3a99c/src/eval.c
*** vim-small-patches.486655e0c5a2/src/eval.c	2013-12-06 08:24:06.507485829 +0400
--- vim-small-patches.83480ec3a99c/src/eval.c	2013-12-06 08:24:06.559485834 +0400
***************
*** 16924,16930 ****
      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;
  }
  
--- 16924,16930 ----
      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;
  }
  
***************
*** 24328,24333 ****
--- 24328,24344 ----
  	}
      }
  
+     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;
  }
  
diff -crN vim-small-patches.486655e0c5a2/src/misc2.c vim-small-patches.83480ec3a99c/src/misc2.c
*** vim-small-patches.486655e0c5a2/src/misc2.c	2013-12-06 08:24:06.478485826 +0400
--- vim-small-patches.83480ec3a99c/src/misc2.c	2013-12-06 08:24:06.523485831 +0400
***************
*** 1368,1380 ****
   * (MS-DOS and MS-Windows without 'shellslash' set).
   * 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;
--- 1368,1382 ----
   * (MS-DOS and MS-Windows without 'shellslash' set).
   * Escape a newline, depending on the 'shell' option.
   * When "do_special" is TRUE also replace "!", "%", "#" and things starting
+  * When "do_newline" is FALSE do not escape newline unless it is csh shell
   * with "<" like "<cfile>".
   * 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)
diff -crN vim-small-patches.486655e0c5a2/src/normal.c vim-small-patches.83480ec3a99c/src/normal.c
*** vim-small-patches.486655e0c5a2/src/normal.c	2013-12-06 08:24:06.469485825 +0400
--- vim-small-patches.83480ec3a99c/src/normal.c	2013-12-06 08:24:06.514485830 +0400
***************
*** 5784,5790 ****
      {
  	/* 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)
  	{
--- 5784,5790 ----
      {
  	/* 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)
  	{
diff -crN vim-small-patches.486655e0c5a2/src/proto/misc2.pro vim-small-patches.83480ec3a99c/src/proto/misc2.pro
*** vim-small-patches.486655e0c5a2/src/proto/misc2.pro	2013-12-06 08:24:06.472485825 +0400
--- vim-small-patches.83480ec3a99c/src/proto/misc2.pro	2013-12-06 08:24:06.518485830 +0400
***************
*** 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));
diff -crN vim-small-patches.486655e0c5a2/src/testdir/Make_amiga.mak vim-small-patches.83480ec3a99c/src/testdir/Make_amiga.mak
*** vim-small-patches.486655e0c5a2/src/testdir/Make_amiga.mak	2013-12-06 08:24:06.466485825 +0400
--- vim-small-patches.83480ec3a99c/src/testdir/Make_amiga.mak	2013-12-06 08:24:06.510485829 +0400
***************
*** 34,40 ****
  		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 test97.out test98.out \
! 		test99.out test100.out test101.out test102.out test103.out
  
  .SUFFIXES: .in .out
  
--- 34,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 test97.out test98.out \
! 		test99.out test100.out test101.out test102.out test103.out \
! 		test104.out
  
  .SUFFIXES: .in .out
  
***************
*** 154,156 ****
--- 155,158 ----
  test101.out: test101.in
  test102.out: test102.in
  test103.out: test103.in
+ test104.out: test104.in
diff -crN vim-small-patches.486655e0c5a2/src/testdir/Make_dos.mak vim-small-patches.83480ec3a99c/src/testdir/Make_dos.mak
*** vim-small-patches.486655e0c5a2/src/testdir/Make_dos.mak	2013-12-06 08:24:06.473485826 +0400
--- vim-small-patches.83480ec3a99c/src/testdir/Make_dos.mak	2013-12-06 08:24:06.519485830 +0400
***************
*** 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
  
  SCRIPTS32 =	test50.out test70.out
  
--- 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
  
diff -crN vim-small-patches.486655e0c5a2/src/testdir/Makefile vim-small-patches.83480ec3a99c/src/testdir/Makefile
*** vim-small-patches.486655e0c5a2/src/testdir/Makefile	2013-12-06 08:24:06.473485826 +0400
--- vim-small-patches.83480ec3a99c/src/testdir/Makefile	2013-12-06 08:24:06.518485830 +0400
***************
*** 30,36 ****
  		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 test97.out test98.out \
! 		test99.out test100.out test101.out test102.out test103.out
  
  SCRIPTS_GUI = test16.out
  
--- 30,37 ----
  		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 test97.out test98.out \
! 		test99.out test100.out test101.out test102.out test103.out \
! 		test104.out
  
  SCRIPTS_GUI = test16.out
  
diff -crN vim-small-patches.486655e0c5a2/src/testdir/Make_ming.mak vim-small-patches.83480ec3a99c/src/testdir/Make_ming.mak
*** vim-small-patches.486655e0c5a2/src/testdir/Make_ming.mak	2013-12-06 08:24:06.478485826 +0400
--- vim-small-patches.83480ec3a99c/src/testdir/Make_ming.mak	2013-12-06 08:24:06.524485831 +0400
***************
*** 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 \
! 		test100out test101.out test102.out test103.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 \
! 		test100out test101.out test102.out test103.out test104.out
  
  SCRIPTS32 =	test50.out test70.out
  
diff -crN vim-small-patches.486655e0c5a2/src/testdir/Make_os2.mak vim-small-patches.83480ec3a99c/src/testdir/Make_os2.mak
*** vim-small-patches.486655e0c5a2/src/testdir/Make_os2.mak	2013-12-06 08:24:06.466485825 +0400
--- vim-small-patches.83480ec3a99c/src/testdir/Make_os2.mak	2013-12-06 08:24:06.511485829 +0400
***************
*** 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
  
  .SUFFIXES: .in .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
  
diff -crN vim-small-patches.486655e0c5a2/src/testdir/Make_vms.mms vim-small-patches.83480ec3a99c/src/testdir/Make_vms.mms
*** vim-small-patches.486655e0c5a2/src/testdir/Make_vms.mms	2013-12-06 08:24:06.491485827 +0400
--- vim-small-patches.83480ec3a99c/src/testdir/Make_vms.mms	2013-12-06 08:24:06.540485832 +0400
***************
*** 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
  
  # Known problems:
  # Test 30: a problem around mac format - unknown reason
--- 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
diff -crN vim-small-patches.486655e0c5a2/src/testdir/test104.in vim-small-patches.83480ec3a99c/src/testdir/test104.in
*** vim-small-patches.486655e0c5a2/src/testdir/test104.in	1970-01-01 03:00:00.000000000 +0300
--- vim-small-patches.83480ec3a99c/src/testdir/test104.in	2013-12-06 08:24:06.509485829 +0400
***************
*** 0 ****
--- 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 fnamemodify('abc.fb2.tar.gz', ':p:r:r'  )
+ :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
+ 
diff -crN vim-small-patches.486655e0c5a2/src/testdir/test104.ok vim-small-patches.83480ec3a99c/src/testdir/test104.ok
*** vim-small-patches.486655e0c5a2/src/testdir/test104.ok	1970-01-01 03:00:00.000000000 +0300
--- vim-small-patches.83480ec3a99c/src/testdir/test104.ok	2013-12-06 08:24:06.515485830 +0400
***************
*** 0 ****
--- 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'
+ fnamemodify('abc.fb2.tar.gz', ':p:r:r'  )	'/home/zyx/a.a/Proj/c/vim-small-patches/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
diff -crN vim-small-patches.486655e0c5a2/src/testdir/test104.out vim-small-patches.83480ec3a99c/src/testdir/test104.out
*** vim-small-patches.486655e0c5a2/src/testdir/test104.out	1970-01-01 03:00:00.000000000 +0300
--- vim-small-patches.83480ec3a99c/src/testdir/test104.out	2013-12-06 08:24:06.514485830 +0400
***************
*** 0 ****
--- 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'
+ fnamemodify('abc.fb2.tar.gz', ':p:r:r'  )	'/home/zyx/a.a/Proj/c/vim-small-patches/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

Raspunde prin e-mail lui