On 13 February 2014, Bram Moolenaar <[email protected]> wrote:
> 
> lcd wrote:
> 
> >     There is an asymmetry in handling indices for lists and strings.
> > Lists accept things like lst[n], lst[n1:n2], lst[n1:-n2], and lst[-n].
> > Strings accept str[n], str[n1:n2], str[n1:-n2] (all with the same
> > meanings as the corresponding operations for lists), but not str[-n].
> > Negative indices in strings always return '', which is frustrating. :)
> > 
> >     The patch below makes negative indices behave the same way for
> > string as they do for lists (but they don't rise exceptions when out of
> > range):
> > 
> >         :let a = '12345'
> >         :echo a[-1]
> >         5
> >         :echo string(a[-6])
> >         ''
> > 
> >     Negative indices for strings never did anything useful (at least as
> > far as I can tell), so this is unlikely to break existing code.
> 
> I suppose that would be OK, and useful, to add.
> 
> Can you also add a test?

    Sure, attached below.

    /lcd


diff -r 277885c9c344 src/eval.c
--- a/src/eval.c        Wed Feb 12 22:08:49 2014 +0100
+++ b/src/eval.c        Fri Feb 14 09:38:11 2014 +0200
@@ -5414,8 +5414,10 @@
                else
                {
                    /* The resulting variable is a string of a single
-                    * character.  If the index is too big or negative the
+                    * character.  If the index is out of range the
                     * result is empty. */
+                   if (n1 < 0)
+                       n1 = len + n1;
                    if (n1 >= len || n1 < 0)
                        s = NULL;
                    else
diff -r 277885c9c344 src/testdir/Makefile
--- a/src/testdir/Makefile      Wed Feb 12 22:08:49 2014 +0100
+++ b/src/testdir/Makefile      Fri Feb 14 09:38:11 2014 +0200
@@ -31,7 +31,7 @@
                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
+               test104.out test105.out
 
 SCRIPTS_GUI = test16.out
 
diff -r 277885c9c344 src/testdir/test105.in
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/testdir/test105.in    Fri Feb 14 09:38:11 2014 +0200
@@ -0,0 +1,12 @@
+Tests negative indices in strings
+
+STARTTEST
+:let a='12345'
+:for i in range(1, 6)
+:    $put =string(a[-i])
+:endfor
+:/^Results/,$wq! test.out
+:qa!
+ENDTEST
+
+Results:
diff -r 277885c9c344 src/testdir/test105.ok
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/testdir/test105.ok    Fri Feb 14 09:38:11 2014 +0200
@@ -0,0 +1,7 @@
+Results:
+'5'
+'4'
+'3'
+'2'
+'1'
+''

-- 
-- 
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.

Raspunde prin e-mail lui