diff options
author | aycabta <aycabta@gmail.com> | 2020-12-24 07:15:54 +0900 |
---|---|---|
committer | aycabta <aycabta@gmail.com> | 2020-12-24 23:26:22 +0900 |
commit | 634b231f33d28e4048afdc643dcf14c924b98f2e (patch) | |
tree | 4fef4bf2bd61ff08c45ddef16cebf53d8b960c44 /lib | |
parent | 167dc37632300e0061351ab87ddc89ebe9c5f53f (diff) |
[ruby/reline] Discard prompt cache by changing mode icon
https://github.com/ruby/reline/commit/bfeda8a79b
Diffstat (limited to 'lib')
-rw-r--r-- | lib/reline/line_editor.rb | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index db5cb3d7ed..1ed26470c1 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -68,6 +68,26 @@ class Reline::LineEditor end end + private def check_mode_icon + mode_icon = nil + if @config.show_mode_in_prompt + if @config.editing_mode_is?(:vi_command) + mode_icon = @config.vi_cmd_mode_icon + elsif @config.editing_mode_is?(:vi_insert) + mode_icon = @config.vi_ins_mode_icon + elsif @config.editing_mode_is?(:emacs) + mode_icon = @config.emacs_mode_string + else + mode_icon = '?' + end + end + if mode_icon != @prev_mode_icon + @rerender_all = true + end + @prev_mode_icon = mode_icon + mode_icon + end + private def check_multiline_prompt(buffer, prompt) if @vi_arg prompt = "(arg: #{@vi_arg}) " @@ -78,7 +98,11 @@ class Reline::LineEditor else prompt = @prompt end - return [prompt, calculate_width(prompt, true), [prompt] * buffer.size] if simplified_rendering? + if simplified_rendering? + mode_icon = check_mode_icon + prompt = mode_icon + prompt if mode_icon + return [prompt, calculate_width(prompt, true), [prompt] * buffer.size] + end if @prompt_proc use_cached_prompt_list = false if @cached_prompt_list @@ -95,35 +119,15 @@ class Reline::LineEditor @prompt_cache_time = Time.now.to_f end prompt_list.map!{ prompt } if @vi_arg or @searching_prompt - if @config.show_mode_in_prompt - if @config.editing_mode_is?(:vi_command) - mode_icon = @config.vi_cmd_mode_icon - elsif @config.editing_mode_is?(:vi_insert) - mode_icon = @config.vi_ins_mode_icon - elsif @config.editing_mode_is?(:emacs) - mode_icon = @config.emacs_mode_string - else - mode_icon = '?' - end - prompt_list.map!{ |pr| mode_icon + pr } - end + mode_icon = check_mode_icon + prompt_list = prompt_list.map{ |pr| mode_icon + pr } if mode_icon prompt = prompt_list[@line_index] prompt_width = calculate_width(prompt, true) [prompt, prompt_width, prompt_list] else + mode_icon = check_mode_icon + prompt = mode_icon + prompt if mode_icon prompt_width = calculate_width(prompt, true) - if @config.show_mode_in_prompt - if @config.editing_mode_is?(:vi_command) - mode_icon = @config.vi_cmd_mode_icon - elsif @config.editing_mode_is?(:vi_insert) - mode_icon = @config.vi_ins_mode_icon - elsif @config.editing_mode_is?(:emacs) - mode_icon = @config.emacs_mode_string - else - mode_icon = '?' - end - prompt = mode_icon + prompt - end [prompt, prompt_width, nil] end end @@ -213,6 +217,7 @@ class Reline::LineEditor @eof = false @continuous_insertion_buffer = String.new(encoding: @encoding) @scroll_partial_screen = nil + @prev_mode_icon = nil reset_line end |