Skip to content

Commit

Permalink
[ruby/reline] Handle mode condition in inputrc
Browse files Browse the repository at this point in the history
  • Loading branch information
ima1zumi authored and matzbot committed Apr 29, 2024
1 parent 435f449 commit 018c571
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 1 deletion.
9 changes: 8 additions & 1 deletion lib/reline/config.rb
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ def read_lines(lines, file = nil)
next
when /\s*("#{KEYSEQ_PATTERN}+")\s*:\s*(.*)\s*$/o
key, func_name = $1, $2
func_name = func_name.split.first
keystroke, func = bind_key(key, func_name)
next unless keystroke
@additional_key_bindings[@keymap_label][@keymap_prefix + keystroke] = func
Expand All @@ -226,7 +227,13 @@ def handle_directive(directive, file, no, if_stack)
when 'if'
condition = false
case args
when 'mode'
when /^mode=(vi|emacs)$/i
mode = $1.downcase
# NOTE: mode=vi means vi-insert mode
mode = 'vi_insert' if mode == 'vi'
if @editing_mode_label == mode.to_sym
condition = true
end
when 'term'
when 'version'
else # application name
Expand Down
72 changes: 72 additions & 0 deletions test/reline/test_config.rb
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,78 @@ def test_unmatched_endif
assert_equal "INPUTRC:1: unmatched endif", e.message
end

def test_if_with_mode
@config.read_lines(<<~LINES.lines)
$if mode=emacs
"\C-e": history-search-backward # comment
$else
"\C-f": history-search-forward
$endif
LINES

assert_equal({[5] => :history_search_backward}, @config.instance_variable_get(:@additional_key_bindings)[:emacs])
assert_equal({}, @config.instance_variable_get(:@additional_key_bindings)[:vi_insert])
assert_equal({}, @config.instance_variable_get(:@additional_key_bindings)[:vi_command])
end

def test_else
@config.read_lines(<<~LINES.lines)
$if mode=vi
"\C-e": history-search-backward # comment
$else
"\C-f": history-search-forward
$endif
LINES

assert_equal({[6] => :history_search_forward}, @config.instance_variable_get(:@additional_key_bindings)[:emacs])
assert_equal({}, @config.instance_variable_get(:@additional_key_bindings)[:vi_insert])
assert_equal({}, @config.instance_variable_get(:@additional_key_bindings)[:vi_command])
end

def test_if_with_invalid_mode
@config.read_lines(<<~LINES.lines)
$if mode=vim
"\C-e": history-search-backward
$else
"\C-f": history-search-forward # comment
$endif
LINES

assert_equal({[6] => :history_search_forward}, @config.instance_variable_get(:@additional_key_bindings)[:emacs])
assert_equal({}, @config.instance_variable_get(:@additional_key_bindings)[:vi_insert])
assert_equal({}, @config.instance_variable_get(:@additional_key_bindings)[:vi_command])
end

def test_mode_label_differs_from_keymap_label
@config.read_lines(<<~LINES.lines)
# Sets mode_label and keymap_label to vi
set editing-mode vi
# Change keymap_label to emacs. mode_label is still vi.
set keymap emacs
# condition=true because current mode_label is vi
$if mode=vi
# sets keybinding to current keymap_label=emacs
"\C-e": history-search-backward
$endif
LINES
assert_equal({[5] => :history_search_backward}, @config.instance_variable_get(:@additional_key_bindings)[:emacs])
assert_equal({}, @config.instance_variable_get(:@additional_key_bindings)[:vi_insert])
assert_equal({}, @config.instance_variable_get(:@additional_key_bindings)[:vi_command])
end

def test_if_without_else_condition
@config.read_lines(<<~LINES.lines)
set editing-mode vi
$if mode=vi
"\C-e": history-search-backward
$endif
LINES

assert_equal({}, @config.instance_variable_get(:@additional_key_bindings)[:emacs])
assert_equal({[5] => :history_search_backward}, @config.instance_variable_get(:@additional_key_bindings)[:vi_insert])
assert_equal({}, @config.instance_variable_get(:@additional_key_bindings)[:vi_command])
end

def test_default_key_bindings
@config.add_default_key_binding('abcd'.bytes, 'EFGH'.bytes)
@config.read_lines(<<~'LINES'.lines)
Expand Down

0 comments on commit 018c571

Please sign in to comment.