diff options
author | Mark Delk <jethrodaniel@gmail.com> | 2020-07-13 06:47:43 +0900 |
---|---|---|
committer | aycabta <aycabta@gmail.com> | 2020-08-18 19:08:32 +0900 |
commit | 44b24ab4c1bd1833aab37cba83801b2023b8e0a9 (patch) | |
tree | a3083906dc9f667b954610b48426900cec4ef70e /lib/reline | |
parent | 0bc748db3685d867f54a4e1b589b732608a1ca69 (diff) | |
download | ruby-44b24ab4c1bd1833aab37cba83801b2023b8e0a9.tar.gz |
[ruby/reline] Support mode icon
Co-authored-by: aycabta <aycabta@gmail.com>
https://github.com/ruby/reline/commit/067b618123
Diffstat (limited to 'lib/reline')
-rw-r--r-- | lib/reline/config.rb | 22 | ||||
-rw-r--r-- | lib/reline/line_editor.rb | 24 |
2 files changed, 46 insertions, 0 deletions
diff --git a/lib/reline/config.rb b/lib/reline/config.rb index 206be5be0e..9b8ddc0536 100644 --- a/lib/reline/config.rb +++ b/lib/reline/config.rb @@ -35,6 +35,10 @@ class Reline::Config show-all-if-ambiguous show-all-if-unmodified visible-stats + show-mode-in-prompt + vi-cmd-mode-icon + vi-ins-mode-icon + emacs-mode-string } VARIABLE_NAME_SYMBOLS = VARIABLE_NAMES.map { |v| :"#{v.tr(?-, ?_)}" } VARIABLE_NAME_SYMBOLS.each do |v| @@ -52,6 +56,9 @@ class Reline::Config @key_actors[:emacs] = Reline::KeyActor::Emacs.new @key_actors[:vi_insert] = Reline::KeyActor::ViInsert.new @key_actors[:vi_command] = Reline::KeyActor::ViCommand.new + @vi_cmd_mode_icon = '(cmd)' + @vi_ins_mode_icon = '(ins)' + @emacs_mode_string = '@' # https://tiswww.case.edu/php/chet/readline/readline.html#IDX25 @history_size = -1 # unlimited @keyseq_timeout = 500 @@ -253,6 +260,21 @@ class Reline::Config end when 'keyseq-timeout' @keyseq_timeout = value.to_i + when 'show-mode-in-prompt' + case value + when 'off' + @show_mode_in_prompt = false + when 'on' + @show_mode_in_prompt = true + else + @show_mode_in_prompt = false + end + when 'vi-cmd-mode-string' + @vi_cmd_mode_icon = value + when 'vi-ins-mode-string' + @vi_ins_mode_icon = value + when 'emacs-mode-string' + @emacs_mode_string = value when *VARIABLE_NAMES then variable_name = :"@#{name.tr(?-, ?_)}" instance_variable_set(variable_name, value.nil? || value == '1' || value == 'on') diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb index 702bf0ee5b..81278810a0 100644 --- a/lib/reline/line_editor.rb +++ b/lib/reline/line_editor.rb @@ -76,11 +76,35 @@ class Reline::LineEditor if @prompt_proc prompt_list = @prompt_proc.(buffer) 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 prompt = prompt_list[@line_index] prompt_width = calculate_width(prompt, true) [prompt, prompt_width, prompt_list] else 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 |