Skip to content

Commit bfeda8a

Browse files
committed
Discard prompt cache by changing mode icon
1 parent 2992ac0 commit bfeda8a

File tree

2 files changed

+44
-25
lines changed

2 files changed

+44
-25
lines changed

lib/reline/line_editor.rb

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,26 @@ def simplified_rendering?
6868
end
6969
end
7070

71+
private def check_mode_icon
72+
mode_icon = nil
73+
if @config.show_mode_in_prompt
74+
if @config.editing_mode_is?(:vi_command)
75+
mode_icon = @config.vi_cmd_mode_icon
76+
elsif @config.editing_mode_is?(:vi_insert)
77+
mode_icon = @config.vi_ins_mode_icon
78+
elsif @config.editing_mode_is?(:emacs)
79+
mode_icon = @config.emacs_mode_string
80+
else
81+
mode_icon = '?'
82+
end
83+
end
84+
if mode_icon != @prev_mode_icon
85+
@rerender_all = true
86+
end
87+
@prev_mode_icon = mode_icon
88+
mode_icon
89+
end
90+
7191
private def check_multiline_prompt(buffer, prompt)
7292
if @vi_arg
7393
prompt = "(arg: #{@vi_arg}) "
@@ -78,7 +98,11 @@ def simplified_rendering?
7898
else
7999
prompt = @prompt
80100
end
81-
return [prompt, calculate_width(prompt, true), [prompt] * buffer.size] if simplified_rendering?
101+
if simplified_rendering?
102+
mode_icon = check_mode_icon
103+
prompt = mode_icon + prompt if mode_icon
104+
return [prompt, calculate_width(prompt, true), [prompt] * buffer.size]
105+
end
82106
if @prompt_proc
83107
use_cached_prompt_list = false
84108
if @cached_prompt_list
@@ -95,35 +119,15 @@ def simplified_rendering?
95119
@prompt_cache_time = Time.now.to_f
96120
end
97121
prompt_list.map!{ prompt } if @vi_arg or @searching_prompt
98-
if @config.show_mode_in_prompt
99-
if @config.editing_mode_is?(:vi_command)
100-
mode_icon = @config.vi_cmd_mode_icon
101-
elsif @config.editing_mode_is?(:vi_insert)
102-
mode_icon = @config.vi_ins_mode_icon
103-
elsif @config.editing_mode_is?(:emacs)
104-
mode_icon = @config.emacs_mode_string
105-
else
106-
mode_icon = '?'
107-
end
108-
prompt_list.map!{ |pr| mode_icon + pr }
109-
end
122+
mode_icon = check_mode_icon
123+
prompt_list = prompt_list.map{ |pr| mode_icon + pr } if mode_icon
110124
prompt = prompt_list[@line_index]
111125
prompt_width = calculate_width(prompt, true)
112126
[prompt, prompt_width, prompt_list]
113127
else
128+
mode_icon = check_mode_icon
129+
prompt = mode_icon + prompt if mode_icon
114130
prompt_width = calculate_width(prompt, true)
115-
if @config.show_mode_in_prompt
116-
if @config.editing_mode_is?(:vi_command)
117-
mode_icon = @config.vi_cmd_mode_icon
118-
elsif @config.editing_mode_is?(:vi_insert)
119-
mode_icon = @config.vi_ins_mode_icon
120-
elsif @config.editing_mode_is?(:emacs)
121-
mode_icon = @config.emacs_mode_string
122-
else
123-
mode_icon = '?'
124-
end
125-
prompt = mode_icon + prompt
126-
end
127131
[prompt, prompt_width, nil]
128132
end
129133
end
@@ -213,6 +217,7 @@ def reset_variables(prompt = '', encoding:)
213217
@eof = false
214218
@continuous_insertion_buffer = String.new(encoding: @encoding)
215219
@scroll_partial_screen = nil
220+
@prev_mode_icon = nil
216221
reset_line
217222
end
218223

test/reline/yamatanooroti/test_rendering.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,20 @@ def test_original_mode_icon_vi
224224
EOC
225225
end
226226

227+
def test_mode_icon_vi_changing
228+
write_inputrc <<~LINES
229+
set editing-mode vi
230+
set show-mode-in-prompt on
231+
LINES
232+
start_terminal(5, 30, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')
233+
write(":a\C-[ab\C-[ac\C-h\C-h\C-h\C-h:a")
234+
close
235+
assert_screen(<<~EOC)
236+
Multiline REPL.
237+
(ins)prompt> :a
238+
EOC
239+
end
240+
227241
def test_prompt_with_escape_sequence
228242
ENV['RELINE_TEST_PROMPT'] = "\1\e[30m\2prompt> \1\e[m\2"
229243
start_terminal(5, 20, %W{ruby -I#{@pwd}/lib #{@pwd}/bin/multiline_repl}, startup_message: 'Multiline REPL.')

0 commit comments

Comments
 (0)