mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-26 12:53:13 +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;
|
||||
}
|
||||
|
||||
indexes.push_back( l_ind );
|
||||
src = end;
|
||||
count++;
|
||||
while (iswspace(*src)) src++;
|
||||
}
|
||||
if ( *src==L'.' && *(src+1)==L'.' ){
|
||||
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;
|
||||
}
|
||||
|
|
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 );
|
||||
|
||||
idx.push_back(tmp);
|
||||
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 )
|
||||
|
|
Loading…
Reference in a new issue