From c4aa04cc40df70c1f278d03aa884264b0fa46b46 Mon Sep 17 00:00:00 2001 From: Amos Bird Date: Thu, 9 Dec 2021 12:27:59 +0800 Subject: [PATCH] Always re-render prompt while navigating history --- src/replxx_impl.cxx | 26 +++++++++++++++++++------- src/replxx_impl.hxx | 2 +- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/replxx_impl.cxx b/src/replxx_impl.cxx index 4bf91c2..0352d15 100644 --- a/src/replxx_impl.cxx +++ b/src/replxx_impl.cxx @@ -966,7 +966,7 @@ int Replxx::ReplxxImpl::virtual_render( char32_t const* buffer_, int len_, int& * Refresh the user's input line: the prompt is already onscreen and is not * redrawn here screen position */ -void Replxx::ReplxxImpl::refresh_line( HINT_ACTION hintAction_ ) { +void Replxx::ReplxxImpl::refresh_line( HINT_ACTION hintAction_, bool refreshPrompt_ ) { int long long now( now_us() ); int long long duration( now - _lastRefreshTime ); if ( duration < RAPID_REFRESH_US ) { @@ -993,10 +993,22 @@ void Replxx::ReplxxImpl::refresh_line( HINT_ACTION hintAction_ ) { // position at the end of the prompt, clear to end of previous input _terminal.set_cursor_visible( false ); - _terminal.jump_cursor( - _prompt.indentation(), // 0-based on Win32 - -( _prompt._cursorRowOffset - _prompt._extraLines ) - ); + if ( refreshPrompt_ ) + { + _terminal.jump_cursor( + 0, + -_prompt._cursorRowOffset + ); + _prompt.write(); + _prompt._cursorRowOffset = _prompt._extraLines; + } + else + { + _terminal.jump_cursor( + _prompt.indentation(), // 0-based on Win32 + -( _prompt._cursorRowOffset - _prompt._extraLines ) + ); + } // display the input line if ( _hasNewlines ) { _terminal.clear_screen( Terminal::CLEAR_SCREEN::TO_END ); @@ -1934,7 +1946,7 @@ Replxx::ACTION_RESULT Replxx::ReplxxImpl::history_move( bool previous_ ) { } _data.assign( _history.current() ); _pos = _data.length(); - refresh_line(); + refresh_line( HINT_ACTION::REGENERATE, true /* refreshPrompt */ ); return ( Replxx::ACTION_RESULT::CONTINUE ); } @@ -2006,7 +2018,7 @@ Replxx::ACTION_RESULT Replxx::ReplxxImpl::history_jump( bool back_ ) { _history.jump( back_ ); _data.assign( _history.current() ); _pos = _data.length(); - refresh_line(); + refresh_line( HINT_ACTION::REGENERATE, true /* refreshPrompt */ ); } return ( Replxx::ACTION_RESULT::CONTINUE ); } diff --git a/src/replxx_impl.hxx b/src/replxx_impl.hxx index a5e3f15..93f95a1 100644 --- a/src/replxx_impl.hxx +++ b/src/replxx_impl.hxx @@ -270,7 +270,7 @@ private: void call_modify_callback( void ); completions_t call_completer( std::string const& input, int& ) const; hints_t call_hinter( std::string const& input, int&, Replxx::Color& color ) const; - void refresh_line( HINT_ACTION = HINT_ACTION::REGENERATE ); + void refresh_line( HINT_ACTION = HINT_ACTION::REGENERATE, bool refreshPrompt_ = false ); void move_cursor( void ); void indent( void ); int virtual_render( char32_t const*, int, int&, int&, Prompt const* = nullptr );