mirror of
https://github.com/fish-shell/fish-shell
synced 2025-01-13 13:39:02 +00:00
Fix some bugs related to not updating our buffer size as our command line changes
This commit is contained in:
parent
067dff8489
commit
eeed45da0f
1 changed files with 32 additions and 19 deletions
51
reader.cpp
51
reader.cpp
|
@ -231,12 +231,15 @@ class reader_data_t
|
||||||
int search_pos;
|
int search_pos;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Current size of the buffers
|
Current count of the buffers
|
||||||
*/
|
*/
|
||||||
size_t buff_sz;
|
size_t buff_count;
|
||||||
|
|
||||||
/** Length of the command */
|
/** Length of the command */
|
||||||
size_t command_length() const { return command_line.size(); }
|
size_t command_length() const { return command_line.size(); }
|
||||||
|
|
||||||
|
/** Ensures that our buffers are the right size */
|
||||||
|
void check_size(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The current position of the cursor in buff.
|
The current position of the cursor in buff.
|
||||||
|
@ -498,6 +501,7 @@ static void reader_kill( size_t begin_idx, int length, int mode, int newv )
|
||||||
}
|
}
|
||||||
|
|
||||||
data->command_line.erase(begin_idx, length);
|
data->command_line.erase(begin_idx, length);
|
||||||
|
data->check_size();
|
||||||
|
|
||||||
reader_super_highlight_me_plenty( data->buff_pos, 0 );
|
reader_super_highlight_me_plenty( data->buff_pos, 0 );
|
||||||
reader_repaint();
|
reader_repaint();
|
||||||
|
@ -544,20 +548,15 @@ void reader_pop_current_filename()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/** Make sure buffers are large enough to hold the current string length */
|
||||||
Make sure buffers are large enough to hold current data plus one extra character.
|
void reader_data_t::check_size()
|
||||||
*/
|
|
||||||
static int check_size()
|
|
||||||
{
|
{
|
||||||
if( data->buff_sz < data->command_length() + 2 )
|
if( buff_count != command_length())
|
||||||
{
|
{
|
||||||
data->buff_sz = maxi( 128, data->command_length()*2 );
|
buff_count = command_length();
|
||||||
|
colors.resize(buff_count);
|
||||||
data->command_line.reserve(data->buff_sz);
|
indents.resize(buff_count);
|
||||||
data->colors.resize(data->buff_sz);
|
|
||||||
data->indents.resize(data->buff_sz);
|
|
||||||
}
|
}
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -787,6 +786,7 @@ static void remove_backward()
|
||||||
|
|
||||||
data->command_line.erase(data->buff_pos-1, 1);
|
data->command_line.erase(data->buff_pos-1, 1);
|
||||||
data->buff_pos--;
|
data->buff_pos--;
|
||||||
|
data->check_size();
|
||||||
|
|
||||||
reader_super_highlight_me_plenty( data->buff_pos, 0 );
|
reader_super_highlight_me_plenty( data->buff_pos, 0 );
|
||||||
|
|
||||||
|
@ -802,9 +802,10 @@ static void remove_backward()
|
||||||
static int insert_string(const wcstring &str)
|
static int insert_string(const wcstring &str)
|
||||||
{
|
{
|
||||||
size_t len = str.size();
|
size_t len = str.size();
|
||||||
check_size();
|
|
||||||
data->command_line.insert(data->buff_pos, str);
|
data->command_line.insert(data->buff_pos, str);
|
||||||
data->buff_pos += len;
|
data->buff_pos += len;
|
||||||
|
data->check_size();
|
||||||
|
|
||||||
/* Syntax highlight */
|
/* Syntax highlight */
|
||||||
reader_super_highlight_me_plenty( data->buff_pos-1, 0 );
|
reader_super_highlight_me_plenty( data->buff_pos-1, 0 );
|
||||||
|
|
||||||
|
@ -1731,6 +1732,13 @@ void reader_sanity_check()
|
||||||
|
|
||||||
if(!( data->buff_pos <= data->command_length() ))
|
if(!( data->buff_pos <= data->command_length() ))
|
||||||
sanity_lose();
|
sanity_lose();
|
||||||
|
|
||||||
|
if (data->colors.size() != data->buff_count)
|
||||||
|
sanity_lose();
|
||||||
|
|
||||||
|
if (data->indents.size() != data->buff_count)
|
||||||
|
sanity_lose();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1773,7 +1781,7 @@ void reader_replace_current_token( const wchar_t *new_token )
|
||||||
static void handle_history( const wcstring &new_str )
|
static void handle_history( const wcstring &new_str )
|
||||||
{
|
{
|
||||||
data->command_line = new_str;
|
data->command_line = new_str;
|
||||||
check_size();
|
data->check_size();
|
||||||
data->buff_pos=data->command_line.size();
|
data->buff_pos=data->command_line.size();
|
||||||
reader_super_highlight_me_plenty( data->buff_pos, 0 );
|
reader_super_highlight_me_plenty( data->buff_pos, 0 );
|
||||||
reader_repaint();
|
reader_repaint();
|
||||||
|
@ -2103,7 +2111,7 @@ void reader_set_buffer( const wchar_t *b, int p )
|
||||||
const wcstring tmp = b;
|
const wcstring tmp = b;
|
||||||
data->command_line = tmp;
|
data->command_line = tmp;
|
||||||
|
|
||||||
check_size();
|
data->check_size();
|
||||||
|
|
||||||
if( p>=0 )
|
if( p>=0 )
|
||||||
{
|
{
|
||||||
|
@ -2242,7 +2250,7 @@ void reader_push( const wchar_t *name )
|
||||||
|
|
||||||
data=n;
|
data=n;
|
||||||
|
|
||||||
check_size();
|
data->check_size();
|
||||||
|
|
||||||
if( data->next == 0 )
|
if( data->next == 0 )
|
||||||
{
|
{
|
||||||
|
@ -2389,8 +2397,11 @@ static void highlight_complete(void *ctx_ptr, int result) {
|
||||||
free(ctx->color);
|
free(ctx->color);
|
||||||
ctx->color = NULL;
|
ctx->color = NULL;
|
||||||
|
|
||||||
|
|
||||||
//data->repaint_needed = 1;
|
//data->repaint_needed = 1;
|
||||||
//s_reset( &data->screen, 1 );
|
//s_reset( &data->screen, 1 );
|
||||||
|
|
||||||
|
sanity_check();
|
||||||
highlight_search();
|
highlight_search();
|
||||||
reader_repaint();
|
reader_repaint();
|
||||||
}
|
}
|
||||||
|
@ -2427,7 +2438,9 @@ static int threaded_highlight(void *ctx_ptr) {
|
||||||
*/
|
*/
|
||||||
static void reader_super_highlight_me_plenty( int match_highlight_pos, array_list_t *error )
|
static void reader_super_highlight_me_plenty( int match_highlight_pos, array_list_t *error )
|
||||||
{
|
{
|
||||||
int *color = (int *)calloc(data->buff_sz, sizeof *color);
|
reader_sanity_check();
|
||||||
|
|
||||||
|
int *color = (int *)calloc(data->buff_count, sizeof *color);
|
||||||
background_highlight_context_t *ctx = new background_highlight_context_t(data->command_line, color, match_highlight_pos, data->highlight_function);
|
background_highlight_context_t *ctx = new background_highlight_context_t(data->command_line, color, match_highlight_pos, data->highlight_function);
|
||||||
#if 1
|
#if 1
|
||||||
iothread_perform(threaded_highlight, highlight_complete, ctx);
|
iothread_perform(threaded_highlight, highlight_complete, ctx);
|
||||||
|
@ -2631,7 +2644,7 @@ const wchar_t *reader_readline()
|
||||||
int finished=0;
|
int finished=0;
|
||||||
struct termios old_modes;
|
struct termios old_modes;
|
||||||
|
|
||||||
check_size();
|
data->check_size();
|
||||||
data->search_buff.clear();
|
data->search_buff.clear();
|
||||||
data->search_mode = NO_SEARCH;
|
data->search_mode = NO_SEARCH;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue