Make fish automatically realise a repaint is needed in more situations, making many keybinding calls to 'commandline -f repaint' unneeded

darcs-hash:20071005145919-75c98-ce349d3718e54df30a050b97afee48b56ab46348.gz
This commit is contained in:
liljencrantz 2007-10-06 00:59:19 +10:00
parent 713c84d821
commit 68857220ac
4 changed files with 66 additions and 41 deletions

View file

@ -306,7 +306,7 @@ static int interrupt_handler()
Reap stray processes, including printing exit status messages
*/
if( job_reap( 1 ) )
repaint();
reader_repaint_needed();
/*
Tell the reader an event occured

View file

@ -264,6 +264,12 @@ typedef struct reader_data
if yes, what mode
*/
int search_mode;
/**
Keep track of whether any internal code has done something
which is known to require a repaint.
*/
int repaint_needed;
}
reader_data_t;
@ -374,6 +380,25 @@ int reader_exit_forced()
return exit_forced;
}
/**
Repaint the entire commandline. This means reset and clear the
commandline, write the prompt, perform syntax highlighting, write
the commandline and move the cursor.
*/
static void reader_repaint()
{
parser_test( data->buff, data->indent, 0, 0 );
s_write( &data->screen,
(wchar_t *)data->prompt_buff.buff,
data->buff,
data->color,
data->indent,
data->buff_pos );
data->repaint_needed = 0;
}
/**
Internal helper function for handling killing parts of text.
*/
@ -415,7 +440,7 @@ static void reader_kill( wchar_t *begin, int length, int mode, int new )
memmove( begin, begin+length, sizeof( wchar_t )*(wcslen( begin+length )+1) );
reader_super_highlight_me_plenty( data->buff_pos, 0 );
repaint();
reader_repaint();
}
@ -674,17 +699,14 @@ void reader_exit( int do_exit, int forced )
}
void repaint()
void reader_repaint_needed()
{
parser_test( data->buff, data->indent, 0, 0 );
s_write( &data->screen,
(wchar_t *)data->prompt_buff.buff,
data->buff,
data->color,
data->indent,
data->buff_pos );
if( data )
{
data->repaint_needed = 1;
}
}
/**
@ -710,7 +732,7 @@ static void remove_backward()
reader_super_highlight_me_plenty( data->buff_pos,
0 );
repaint();
reader_repaint();
}
@ -748,7 +770,7 @@ static int insert_str(wchar_t *str)
reader_super_highlight_me_plenty( data->buff_pos-1,
0 );
repaint();
reader_repaint();
return 1;
}
@ -966,7 +988,7 @@ static void completion_insert( const wchar_t *val, int flags )
sb_destroy( &sb );
reader_super_highlight_me_plenty( data->buff_pos, 0 );
repaint();
reader_repaint();
}
else
@ -1204,14 +1226,14 @@ static void reader_flash()
data->color[i] = HIGHLIGHT_SEARCH_MATCH<<16;
}
repaint();
reader_repaint();
pollint.tv_sec = 0;
pollint.tv_nsec = 100 * 1000000;
nanosleep( &pollint, NULL );
reader_super_highlight_me_plenty( data->buff_pos, 0 );
repaint();
reader_repaint();
}
@ -1418,7 +1440,7 @@ static int handle_completions( array_list_t *comp )
free( prefix );
s_reset( &data->screen, 1 );
repaint();
reader_repaint();
}
@ -1560,7 +1582,7 @@ static void handle_history( const wchar_t *new_str )
data->buff_pos=wcslen(data->buff);
reader_super_highlight_me_plenty( data->buff_pos, 0 );
repaint();
reader_repaint();
}
}
@ -1646,7 +1668,7 @@ static void handle_token_history( int forward, int reset )
reader_replace_current_token( str );
reader_super_highlight_me_plenty( data->buff_pos, 0 );
repaint();
reader_repaint();
}
else
{
@ -1738,7 +1760,7 @@ static void handle_token_history( int forward, int reset )
{
reader_replace_current_token( str );
reader_super_highlight_me_plenty( data->buff_pos, 0 );
repaint();
reader_repaint();
al_push( &data->search_prev, str );
data->search_pos = al_get_count( &data->search_prev )-1;
}
@ -1895,7 +1917,7 @@ static void move_word( int dir, int erase, int new )
else
{
data->buff_pos = end_buff_pos;
repaint();
reader_repaint();
}
}
@ -1929,6 +1951,7 @@ void reader_set_buffer( wchar_t *b, int p )
reader_super_highlight_me_plenty( data->buff_pos,
0 );
reader_repaint_needed();
}
@ -2339,7 +2362,7 @@ wchar_t *reader_readline()
reader_super_highlight_me_plenty( data->buff_pos, 0 );
s_reset( &data->screen, 1 );
repaint();
reader_repaint();
/*
get the current terminal modes. These will be restored when the
@ -2428,7 +2451,7 @@ wchar_t *reader_readline()
data->buff_pos--;
}
repaint();
reader_repaint();
break;
}
@ -2440,7 +2463,7 @@ wchar_t *reader_readline()
data->buff_pos++;
}
repaint();
reader_repaint();
break;
}
@ -2449,7 +2472,7 @@ wchar_t *reader_readline()
{
data->buff_pos = 0;
repaint();
reader_repaint();
break;
}
@ -2458,12 +2481,15 @@ wchar_t *reader_readline()
{
data->buff_pos = data->buff_len;
repaint();
reader_repaint();
break;
}
case R_NULL:
{
if( data->repaint_needed )
reader_repaint();
break;
}
@ -2472,7 +2498,7 @@ wchar_t *reader_readline()
exec_prompt();
write( 1, "\r", 1 );
s_reset( &data->screen, 0 );
repaint();
reader_repaint();
break;
}
@ -2509,7 +2535,7 @@ wchar_t *reader_readline()
remove_backward();
}
repaint();
reader_repaint();
len = data->buff_pos - (begin-data->buff);
buffcpy = wcsndup( begin, len );
@ -2651,7 +2677,7 @@ wchar_t *reader_readline()
}
sb_clear( &data->search_buff );
reader_super_highlight_me_plenty( data->buff_pos, 0 );
repaint();
reader_repaint();
}
@ -2711,7 +2737,7 @@ wchar_t *reader_readline()
}
finished=1;
data->buff_pos=data->buff_len;
repaint();
reader_repaint();
break;
}
@ -2732,7 +2758,7 @@ wchar_t *reader_readline()
default:
{
s_reset( &data->screen, 1 );
repaint();
reader_repaint();
break;
}
@ -2813,7 +2839,7 @@ wchar_t *reader_readline()
if( data->buff_pos > 0 )
{
data->buff_pos--;
repaint();
reader_repaint();
}
break;
}
@ -2824,7 +2850,7 @@ wchar_t *reader_readline()
if( data->buff_pos < data->buff_len )
{
data->buff_pos++;
repaint();
reader_repaint();
}
break;
}
@ -2907,7 +2933,7 @@ wchar_t *reader_readline()
line_old );
total_offset_new = parse_util_get_offset( data->buff, line_new, line_offset_old - 4*(indent_new-indent_old));
data->buff_pos = total_offset_new;
repaint();
reader_repaint();
}
break;

View file

@ -63,11 +63,10 @@ wchar_t *reader_pop_current_filename();
void reader_write_title();
/**
Repaint the entire commandline. This means reset and clear the
commandline, write the prompt, perform syntax highlighting, write
the commandline and move the cursor.
Call this function to tell the reader that a repaint is needed, and
should be performed when possible.
*/
void repaint();
void reader_repaint_needed();
/**
Run the specified command with the correct terminal modes, and

View file

@ -77,7 +77,7 @@ function fish_default_key_bindings -d "Default (Emacs-like) key bindings for fis
bind \el __fish_list_current_token
bind \ew 'set tok (commandline -pt); if test $tok[1]; whatis $tok[1]; commandline -f repaint; end'
bind \cl 'clear; commandline -f repaint'
bind \cc 'commandline ""; commandline -f repaint'
bind \cc 'commandline ""'
bind \cu backward-kill-line
bind \ed kill-word
bind \cw backward-kill-word