aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--reader.c83
1 files changed, 51 insertions, 32 deletions
diff --git a/reader.c b/reader.c
index 5ba2d6a6..5d44bf1b 100644
--- a/reader.c
+++ b/reader.c
@@ -1984,11 +1984,25 @@ static void handle_token_history( int forward, int reset )
static void move_word( int dir, int erase )
{
int end_buff_pos=data->buff_pos;
- int mode=0;
int step = dir?1:-1;
- while( mode < 2 )
+ /*
+ If we are beyond the last character and moving left, start by
+ moving one step, since otehrwise we'll start on the \0, which
+ should be ignored.
+ */
+ if( !dir && (end_buff_pos == data->buff_len) )
+ {
+ if( !end_buff_pos )
+ return;
+
+ end_buff_pos--;
+ }
+
+ while( 1 )
{
+ wchar_t c;
+
if( !dir )
{
if( end_buff_pos == 0 )
@@ -1999,41 +2013,46 @@ static void move_word( int dir, int erase )
if( end_buff_pos == data->buff_len )
break;
}
- end_buff_pos+=step;
- if( end_buff_pos < data->buff_len )
- {
- switch( mode )
- {
- case 0:
- if( iswalnum(data->buff[end_buff_pos] ) )
- mode++;
- break;
+ c = data->buff[end_buff_pos];
- case 1:
- if( !iswalnum(data->buff[end_buff_pos] ) )
- {
- if( !dir )
- end_buff_pos -= step;
- mode++;
- }
- break;
-/*
- case 2:
- if( !iswspace(data->buff[end_buff_pos] ) )
- {
- mode++;
- if( !dir )
- end_buff_pos-=step;
- }
- break;
-*/
- }
+ if( !iswspace( c ) )
+ {
+ break;
+ }
+
+ end_buff_pos+=step;
+ }
+
+ while( 1 )
+ {
+ wchar_t c;
+
+ if( !dir )
+ {
+ if( end_buff_pos == 0 )
+ break;
+ }
+ else
+ {
+ if( end_buff_pos == data->buff_len )
+ break;
}
- if( mode==2)
- break;
+ c = data->buff[end_buff_pos];
+ if( !iswalnum( c ) )
+ {
+ /*
+ Don't gobble the boundary character if it was a
+ whitespace, but do for all other non-alphabetic
+ characters
+ */
+ if( iswspace( c ) )
+ end_buff_pos -= step;
+ break;
+ }
+ end_buff_pos+=step;
}
if( erase )