mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-27 05:13:10 +00:00
Add index ranges
Builtin 'set' now can set variable index ranges: set test[1..3] a b c #works set test[-1..-3] a b c #works if variable have enough elements set test[2..-2] a b c #works set test[1..3 -1..-2] a b c b b #works Expand now can parse index ranges. But not handle for now. TODO: * Add variable substitution index ranges: echo $PATH[-1..1] * Add command substitution index range: echo (seq 10)[-1..-4] * Add process substitution indexes and ranges: echo %vim[-1]
This commit is contained in:
parent
b23d65b014
commit
0a5e7be129
2 changed files with 44 additions and 5 deletions
|
@ -236,11 +236,33 @@ static int parse_index( std::vector<long> &indexes,
|
||||||
l_ind = var_count+l_ind+1;
|
l_ind = var_count+l_ind+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
indexes.push_back( l_ind );
|
|
||||||
src = end;
|
src = end;
|
||||||
count++;
|
if ( *src==L'.' && *(src+1)==L'.' ){
|
||||||
while (iswspace(*src)) src++;
|
src+=2;
|
||||||
}
|
long l_ind2 = wcstol( src, &end, 10 );
|
||||||
|
if( end==src || errno )
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
src = end;
|
||||||
|
|
||||||
|
if( l_ind2 < 0 )
|
||||||
|
{
|
||||||
|
l_ind2 = var_count+l_ind2+1;
|
||||||
|
}
|
||||||
|
int direction = l_ind2<l_ind ? -1 : 1 ;
|
||||||
|
for (long jjj = l_ind; jjj*direction <= l_ind2*direction; jjj+=direction) {
|
||||||
|
// debug(0, L"Expand range [set]: %i\n", jjj);
|
||||||
|
indexes.push_back( jjj );
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
indexes.push_back( l_ind );
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
while (iswspace(*src)) src++;
|
||||||
|
}
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
19
expand.cpp
19
expand.cpp
|
@ -759,8 +759,25 @@ static int parse_slice( const wchar_t *in, wchar_t **end_ptr, std::vector<long>
|
||||||
}
|
}
|
||||||
// debug( 0, L"Push idx %d", tmp );
|
// debug( 0, L"Push idx %d", tmp );
|
||||||
|
|
||||||
idx.push_back(tmp);
|
|
||||||
pos = end-in;
|
pos = end-in;
|
||||||
|
if ( in[pos]==L'.' && in[pos+1]==L'.' ){
|
||||||
|
pos+=2;
|
||||||
|
long tmp1 = wcstol( &in[pos], &end, 10 );
|
||||||
|
if( ( errno ) || ( end == &in[pos] ) )
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
pos = end-in;
|
||||||
|
|
||||||
|
debug( 0, L"Push range idx %d %d", tmp, tmp1 );
|
||||||
|
idx.push_back(tmp);
|
||||||
|
// idx.push_back(tmp2);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
debug( 0, L"Push idx %d", tmp );
|
||||||
|
idx.push_back(tmp);
|
||||||
|
// idx.push_back(tmp2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( end_ptr )
|
if( end_ptr )
|
||||||
|
|
Loading…
Reference in a new issue