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.
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…
	
	Add table
		Add a link
		
	
		Reference in a new issue