mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
[ruby/reline] Fix support for emacs-ctlx and emacs-meta keymaps
The existing implementation, given the below .inputrc, erroneously creates a "C-v" key binding: set keymap emacs-ctlx "\C-v": "[C-x C-v was pressed]" This fixes it to instead create a "C-x C-v" keybinding. https://github.com/ruby/reline/commit/719f52d231
This commit is contained in:
parent
50098f4b61
commit
37d5890e49
2 changed files with 36 additions and 2 deletions
|
@ -55,6 +55,7 @@ class Reline::Config
|
||||||
@if_stack = nil
|
@if_stack = nil
|
||||||
@editing_mode_label = :emacs
|
@editing_mode_label = :emacs
|
||||||
@keymap_label = :emacs
|
@keymap_label = :emacs
|
||||||
|
@keymap_prefix = []
|
||||||
@key_actors = {}
|
@key_actors = {}
|
||||||
@key_actors[:emacs] = Reline::KeyActor::Emacs.new
|
@key_actors[:emacs] = Reline::KeyActor::Emacs.new
|
||||||
@key_actors[:vi_insert] = Reline::KeyActor::ViInsert.new
|
@key_actors[:vi_insert] = Reline::KeyActor::ViInsert.new
|
||||||
|
@ -221,7 +222,7 @@ class Reline::Config
|
||||||
key, func_name = $1, $2
|
key, func_name = $1, $2
|
||||||
keystroke, func = bind_key(key, func_name)
|
keystroke, func = bind_key(key, func_name)
|
||||||
next unless keystroke
|
next unless keystroke
|
||||||
@additional_key_bindings[@keymap_label][keystroke] = func
|
@additional_key_bindings[@keymap_label][@keymap_prefix + keystroke] = func
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
unless @if_stack.empty?
|
unless @if_stack.empty?
|
||||||
|
@ -292,18 +293,29 @@ class Reline::Config
|
||||||
when 'emacs'
|
when 'emacs'
|
||||||
@editing_mode_label = :emacs
|
@editing_mode_label = :emacs
|
||||||
@keymap_label = :emacs
|
@keymap_label = :emacs
|
||||||
|
@keymap_prefix = []
|
||||||
when 'vi'
|
when 'vi'
|
||||||
@editing_mode_label = :vi_insert
|
@editing_mode_label = :vi_insert
|
||||||
@keymap_label = :vi_insert
|
@keymap_label = :vi_insert
|
||||||
|
@keymap_prefix = []
|
||||||
end
|
end
|
||||||
when 'keymap'
|
when 'keymap'
|
||||||
case value
|
case value
|
||||||
when 'emacs', 'emacs-standard', 'emacs-meta', 'emacs-ctlx'
|
when 'emacs', 'emacs-standard'
|
||||||
@keymap_label = :emacs
|
@keymap_label = :emacs
|
||||||
|
@keymap_prefix = []
|
||||||
|
when 'emacs-ctlx'
|
||||||
|
@keymap_label = :emacs
|
||||||
|
@keymap_prefix = [?\C-x.ord]
|
||||||
|
when 'emacs-meta'
|
||||||
|
@keymap_label = :emacs
|
||||||
|
@keymap_prefix = [?\e.ord]
|
||||||
when 'vi', 'vi-move', 'vi-command'
|
when 'vi', 'vi-move', 'vi-command'
|
||||||
@keymap_label = :vi_command
|
@keymap_label = :vi_command
|
||||||
|
@keymap_prefix = []
|
||||||
when 'vi-insert'
|
when 'vi-insert'
|
||||||
@keymap_label = :vi_insert
|
@keymap_label = :vi_insert
|
||||||
|
@keymap_prefix = []
|
||||||
end
|
end
|
||||||
when 'keyseq-timeout'
|
when 'keyseq-timeout'
|
||||||
@keyseq_timeout = value.to_i
|
@keyseq_timeout = value.to_i
|
||||||
|
|
|
@ -274,6 +274,28 @@ class Reline::Config::Test < Reline::TestCase
|
||||||
assert_equal expected, @config.key_bindings
|
assert_equal expected, @config.key_bindings
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_additional_key_bindings_for_auxiliary_emacs_keymaps
|
||||||
|
@config.read_lines(<<~'LINES'.lines)
|
||||||
|
set keymap emacs
|
||||||
|
"ab": "AB"
|
||||||
|
set keymap emacs-standard
|
||||||
|
"cd": "CD"
|
||||||
|
set keymap emacs-ctlx
|
||||||
|
"ef": "EF"
|
||||||
|
set keymap emacs-meta
|
||||||
|
"gh": "GH"
|
||||||
|
set editing-mode emacs # keymap changes to be emacs
|
||||||
|
LINES
|
||||||
|
|
||||||
|
expected = {
|
||||||
|
'ab'.bytes => 'AB'.bytes,
|
||||||
|
'cd'.bytes => 'CD'.bytes,
|
||||||
|
"\C-xef".bytes => 'EF'.bytes,
|
||||||
|
"\egh".bytes => 'GH'.bytes,
|
||||||
|
}
|
||||||
|
assert_equal expected, @config.key_bindings
|
||||||
|
end
|
||||||
|
|
||||||
def test_history_size
|
def test_history_size
|
||||||
@config.read_lines(<<~LINES.lines)
|
@config.read_lines(<<~LINES.lines)
|
||||||
set history-size 5000
|
set history-size 5000
|
||||||
|
|
Loading…
Reference in a new issue