summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortomoya ishida <[email protected]>2024-12-06 16:09:19 +0900
committergit <[email protected]>2024-12-06 07:09:24 +0000
commit5f65321915843faf47231a941f284e7375d6fb10 (patch)
treee458e06a3c5a7212391e9a59b7eeee73cde0cf85
parent6ccaa37eb365afd6b01359e63dac85aef35987a5 (diff)
[ruby/reline] Combine MAPPINGS(single byte input to symbol) with
key_bindings(escape sequence to symbol) (https://github.com/ruby/reline/pull/715) https://github.com/ruby/reline/commit/6a7e249374
-rw-r--r--lib/reline.rb8
-rw-r--r--lib/reline/io/windows.rb1
-rw-r--r--lib/reline/key_actor/base.rb14
-rw-r--r--lib/reline/key_actor/emacs.rb192
-rw-r--r--lib/reline/key_actor/vi_command.rb364
-rw-r--r--lib/reline/key_actor/vi_insert.rb254
-rw-r--r--lib/reline/key_stroke.rb21
-rw-r--r--lib/reline/line_editor.rb158
-rw-r--r--test/reline/helper.rb34
-rw-r--r--test/reline/test_key_actor_emacs.rb20
-rw-r--r--test/reline/test_key_actor_vi.rb31
-rw-r--r--test/reline/test_key_stroke.rb39
-rw-r--r--test/reline/test_macro.rb8
-rw-r--r--test/reline/test_reline_key.rb7
-rw-r--r--test/reline/yamatanooroti/test_rendering.rb2
15 files changed, 552 insertions, 601 deletions
diff --git a/lib/reline.rb b/lib/reline.rb
index 9af3a5c332..671c222ef7 100644
--- a/lib/reline.rb
+++ b/lib/reline.rb
@@ -17,10 +17,12 @@ module Reline
class ConfigEncodingConversionError < StandardError; end
- Key = Struct.new(:char, :combined_char, :with_meta) do
+ # EOF key: { char: nil, method_symbol: nil }
+ # Other key: { char: String, method_symbol: Symbol }
+ Key = Struct.new(:char, :method_symbol, :unused_boolean) do
# For dialog_proc `key.match?(dialog.name)`
def match?(sym)
- combined_char.is_a?(Symbol) && combined_char == sym
+ method_symbol && method_symbol == sym
end
end
CursorPos = Struct.new(:x, :y)
@@ -341,7 +343,7 @@ module Reline
read_io(config.keyseq_timeout) { |inputs|
line_editor.set_pasting_state(io_gate.in_pasting?)
inputs.each do |key|
- if key.char == :bracketed_paste_start
+ if key.method_symbol == :bracketed_paste_start
text = io_gate.read_bracketed_paste
line_editor.insert_multiline_text(text)
line_editor.scroll_into_view
diff --git a/lib/reline/io/windows.rb b/lib/reline/io/windows.rb
index 058d65c473..5c1ab6d080 100644
--- a/lib/reline/io/windows.rb
+++ b/lib/reline/io/windows.rb
@@ -55,7 +55,6 @@ class Reline::Windows < Reline::IO
[224, 83] => :key_delete, # Del
[224, 71] => :ed_move_to_beg, # Home
[224, 79] => :ed_move_to_end, # End
- [ 0, 41] => :ed_unassigned, # input method on/off
[ 0, 72] => :ed_prev_history, # ↑
[ 0, 80] => :ed_next_history, # ↓
[ 0, 77] => :ed_next_char, # →
diff --git a/lib/reline/key_actor/base.rb b/lib/reline/key_actor/base.rb
index ee28c7681e..5bd8609cdf 100644
--- a/lib/reline/key_actor/base.rb
+++ b/lib/reline/key_actor/base.rb
@@ -1,12 +1,18 @@
class Reline::KeyActor::Base
- def initialize(mapping = [])
- @mapping = mapping
+ def initialize(mappings = nil)
@matching_bytes = {}
@key_bindings = {}
+ add_mappings(mappings) if mappings
end
- def get_method(key)
- @mapping[key]
+ def add_mappings(mappings)
+ add([27], :ed_ignore)
+ 128.times do |key|
+ func = mappings[key]
+ meta_func = mappings[key | 0b10000000]
+ add([key], func) if func
+ add([27, key], meta_func) if meta_func
+ end
end
def add(key, func)
diff --git a/lib/reline/key_actor/emacs.rb b/lib/reline/key_actor/emacs.rb
index ad84ee1d99..1ed4af7684 100644
--- a/lib/reline/key_actor/emacs.rb
+++ b/lib/reline/key_actor/emacs.rb
@@ -15,7 +15,7 @@ module Reline::KeyActor
# 6 ^F
:ed_next_char,
# 7 ^G
- :ed_unassigned,
+ nil,
# 8 ^H
:em_delete_prev_char,
# 9 ^I
@@ -49,19 +49,19 @@ module Reline::KeyActor
# 23 ^W
:em_kill_region,
# 24 ^X
- :ed_unassigned,
+ nil,
# 25 ^Y
:em_yank,
# 26 ^Z
:ed_ignore,
# 27 ^[
- :ed_unassigned,
+ nil,
# 28 ^\
:ed_ignore,
# 29 ^]
:ed_ignore,
# 30 ^^
- :ed_unassigned,
+ nil,
# 31 ^_
:undo,
# 32 SPACE
@@ -257,101 +257,101 @@ module Reline::KeyActor
# 127 ^?
:em_delete_prev_char,
# 128 M-^@
- :ed_unassigned,
+ nil,
# 129 M-^A
- :ed_unassigned,
+ nil,
# 130 M-^B
- :ed_unassigned,
+ nil,
# 131 M-^C
- :ed_unassigned,
+ nil,
# 132 M-^D
- :ed_unassigned,
+ nil,
# 133 M-^E
- :ed_unassigned,
+ nil,
# 134 M-^F
- :ed_unassigned,
+ nil,
# 135 M-^G
- :ed_unassigned,
+ nil,
# 136 M-^H
:ed_delete_prev_word,
# 137 M-^I
- :ed_unassigned,
+ nil,
# 138 M-^J
:key_newline,
# 139 M-^K
- :ed_unassigned,
+ nil,
# 140 M-^L
:ed_clear_screen,
# 141 M-^M
:key_newline,
# 142 M-^N
- :ed_unassigned,
+ nil,
# 143 M-^O
- :ed_unassigned,
+ nil,
# 144 M-^P
- :ed_unassigned,
+ nil,
# 145 M-^Q
- :ed_unassigned,
+ nil,
# 146 M-^R
- :ed_unassigned,
+ nil,
# 147 M-^S
- :ed_unassigned,
+ nil,
# 148 M-^T
- :ed_unassigned,
+ nil,
# 149 M-^U
- :ed_unassigned,
+ nil,
# 150 M-^V
- :ed_unassigned,
+ nil,
# 151 M-^W
- :ed_unassigned,
+ nil,
# 152 M-^X
- :ed_unassigned,
+ nil,
# 153 M-^Y
:em_yank_pop,
# 154 M-^Z
- :ed_unassigned,
+ nil,
# 155 M-^[
- :ed_unassigned,
+ nil,
# 156 M-^\
- :ed_unassigned,
+ nil,
# 157 M-^]
- :ed_unassigned,
+ nil,
# 158 M-^^
- :ed_unassigned,
+ nil,
# 159 M-^_
:redo,
# 160 M-SPACE
:em_set_mark,
# 161 M-!
- :ed_unassigned,
+ nil,
# 162 M-"
- :ed_unassigned,
+ nil,
# 163 M-#
- :ed_unassigned,
+ nil,
# 164 M-$
- :ed_unassigned,
+ nil,
# 165 M-%
- :ed_unassigned,
+ nil,
# 166 M-&
- :ed_unassigned,
+ nil,
# 167 M-'
- :ed_unassigned,
+ nil,
# 168 M-(
- :ed_unassigned,
+ nil,
# 169 M-)
- :ed_unassigned,
+ nil,
# 170 M-*
- :ed_unassigned,
+ nil,
# 171 M-+
- :ed_unassigned,
+ nil,
# 172 M-,
- :ed_unassigned,
+ nil,
# 173 M--
- :ed_unassigned,
+ nil,
# 174 M-.
- :ed_unassigned,
+ nil,
# 175 M-/
- :ed_unassigned,
+ nil,
# 176 M-0
:ed_argument_digit,
# 177 M-1
@@ -373,21 +373,21 @@ module Reline::KeyActor
# 185 M-9
:ed_argument_digit,
# 186 M-:
- :ed_unassigned,
+ nil,
# 187 M-;
- :ed_unassigned,
+ nil,
# 188 M-<
- :ed_unassigned,
+ nil,
# 189 M-=
- :ed_unassigned,
+ nil,
# 190 M->
- :ed_unassigned,
+ nil,
# 191 M-?
- :ed_unassigned,
+ nil,
# 192 M-@
- :ed_unassigned,
+ nil,
# 193 M-A
- :ed_unassigned,
+ nil,
# 194 M-B
:ed_prev_word,
# 195 M-C
@@ -395,63 +395,63 @@ module Reline::KeyActor
# 196 M-D
:em_delete_next_word,
# 197 M-E
- :ed_unassigned,
+ nil,
# 198 M-F
:em_next_word,
# 199 M-G
- :ed_unassigned,
+ nil,
# 200 M-H
- :ed_unassigned,
+ nil,
# 201 M-I
- :ed_unassigned,
+ nil,
# 202 M-J
- :ed_unassigned,
+ nil,
# 203 M-K
- :ed_unassigned,
+ nil,
# 204 M-L
:em_lower_case,
# 205 M-M
- :ed_unassigned,
+ nil,
# 206 M-N
:vi_search_next,
# 207 M-O
- :ed_unassigned,
+ nil,
# 208 M-P
:vi_search_prev,
# 209 M-Q
- :ed_unassigned,
+ nil,
# 210 M-R
- :ed_unassigned,
+ nil,
# 211 M-S
- :ed_unassigned,
+ nil,
# 212 M-T
- :ed_unassigned,
+ nil,
# 213 M-U
:em_upper_case,
# 214 M-V
- :ed_unassigned,
+ nil,
# 215 M-W
- :ed_unassigned,
+ nil,
# 216 M-X
- :ed_unassigned,
+ nil,
# 217 M-Y
:em_yank_pop,
# 218 M-Z
- :ed_unassigned,
+ nil,
# 219 M-[
- :ed_unassigned,
+ nil,
# 220 M-\
- :ed_unassigned,
+ nil,
# 221 M-]
- :ed_unassigned,
+ nil,
# 222 M-^
- :ed_unassigned,
+ nil,
# 223 M-_
- :ed_unassigned,
+ nil,
# 224 M-`
- :ed_unassigned,
+ nil,
# 225 M-a
- :ed_unassigned,
+ nil,
# 226 M-b
:ed_prev_word,
# 227 M-c
@@ -459,57 +459,57 @@ module Reline::KeyActor
# 228 M-d
:em_delete_next_word,
# 229 M-e
- :ed_unassigned,
+ nil,
# 230 M-f
:em_next_word,
# 231 M-g
- :ed_unassigned,
+ nil,
# 232 M-h
- :ed_unassigned,
+ nil,
# 233 M-i
- :ed_unassigned,
+ nil,
# 234 M-j
- :ed_unassigned,
+ nil,
# 235 M-k
- :ed_unassigned,
+ nil,
# 236 M-l
:em_lower_case,
# 237 M-m
- :ed_unassigned,
+ nil,
# 238 M-n
:vi_search_next,
# 239 M-o
- :ed_unassigned,
+ nil,
# 240 M-p
:vi_search_prev,
# 241 M-q
- :ed_unassigned,
+ nil,
# 242 M-r
- :ed_unassigned,
+ nil,
# 243 M-s
- :ed_unassigned,
+ nil,
# 244 M-t
:ed_transpose_words,
# 245 M-u
:em_upper_case,
# 246 M-v
- :ed_unassigned,
+ nil,
# 247 M-w
- :ed_unassigned,
+ nil,
# 248 M-x
- :ed_unassigned,
+ nil,
# 249 M-y
- :ed_unassigned,
+ nil,
# 250 M-z
- :ed_unassigned,
+ nil,
# 251 M-{
- :ed_unassigned,
+ nil,
# 252 M-|
- :ed_unassigned,
+ nil,
# 253 M-}
- :ed_unassigned,
+ nil,
# 254 M-~
- :ed_unassigned,
+ nil,
# 255 M-^?
:ed_delete_prev_word
# EOF
diff --git a/lib/reline/key_actor/vi_command.rb b/lib/reline/key_actor/vi_command.rb
index d972c5e67f..400f88477a 100644
--- a/lib/reline/key_actor/vi_command.rb
+++ b/lib/reline/key_actor/vi_command.rb
@@ -1,11 +1,11 @@
module Reline::KeyActor
VI_COMMAND_MAPPING = [
# 0 ^@
- :ed_unassigned,
+ nil,
# 1 ^A
:ed_move_to_beg,
# 2 ^B
- :ed_unassigned,
+ nil,
# 3 ^C
:ed_ignore,
# 4 ^D
@@ -13,13 +13,13 @@ module Reline::KeyActor
# 5 ^E
:ed_move_to_end,
# 6 ^F
- :ed_unassigned,
+ nil,
# 7 ^G
- :ed_unassigned,
+ nil,
# 8 ^H
:ed_prev_char,
# 9 ^I
- :ed_unassigned,
+ nil,
# 10 ^J
:ed_newline,
# 11 ^K
@@ -49,51 +49,51 @@ module Reline::KeyActor
# 23 ^W
:ed_delete_prev_word,
# 24 ^X
- :ed_unassigned,
+ nil,
# 25 ^Y
:em_yank,
# 26 ^Z
- :ed_unassigned,
+ nil,
# 27 ^[
- :ed_unassigned,
+ nil,
# 28 ^\
:ed_ignore,
# 29 ^]
- :ed_unassigned,
+ nil,
# 30 ^^
- :ed_unassigned,
+ nil,
# 31 ^_
- :ed_unassigned,
+ nil,
# 32 SPACE
:ed_next_char,
# 33 !
- :ed_unassigned,
+ nil,
# 34 "
- :ed_unassigned,
+ nil,
# 35 #
:vi_comment_out,
# 36 $
:ed_move_to_end,
# 37 %
- :ed_unassigned,
+ nil,
# 38 &
- :ed_unassigned,
+ nil,
# 39 '
- :ed_unassigned,
+ nil,
# 40 (
- :ed_unassigned,
+ nil,
# 41 )
- :ed_unassigned,
+ nil,
# 42 *
- :ed_unassigned,
+ nil,
# 43 +
:ed_next_history,
# 44 ,
- :ed_unassigned,
+ nil,
# 45 -
:ed_prev_history,
# 46 .
- :ed_unassigned,
+ nil,
# 47 /
:vi_search_prev,
# 48 0
@@ -117,15 +117,15 @@ module Reline::KeyActor
# 57 9
:ed_argument_digit,
# 58 :
- :ed_unassigned,
+ nil,
# 59 ;
- :ed_unassigned,
+ nil,
# 60 <
- :ed_unassigned,
+ nil,
# 61 =
- :ed_unassigned,
+ nil,
# 62 >
- :ed_unassigned,
+ nil,
# 63 ?
:vi_search_next,
# 64 @
@@ -145,7 +145,7 @@ module Reline::KeyActor
# 71 G
:vi_to_history_line,
# 72 H
- :ed_unassigned,
+ nil,
# 73 I
:vi_insert_at_bol,
# 74 J
@@ -153,47 +153,47 @@ module Reline::KeyActor
# 75 K
:vi_search_prev,
# 76 L
- :ed_unassigned,
+ nil,
# 77 M
- :ed_unassigned,
+ nil,
# 78 N
- :ed_unassigned,
+ nil,
# 79 O
- :ed_unassigned,
+ nil,
# 80 P
:vi_paste_prev,
# 81 Q
- :ed_unassigned,
+ nil,
# 82 R
- :ed_unassigned,
+ nil,
# 83 S
- :ed_unassigned,
+ nil,
# 84 T
:vi_to_prev_char,
# 85 U
- :ed_unassigned,
+ nil,
# 86 V
- :ed_unassigned,
+ nil,
# 87 W
:vi_next_big_word,
# 88 X
:ed_delete_prev_char,
# 89 Y
- :ed_unassigned,
+ nil,
# 90 Z
- :ed_unassigned,
+ nil,
# 91 [
- :ed_unassigned,
+ nil,
# 92 \
- :ed_unassigned,
+ nil,
# 93 ]
- :ed_unassigned,
+ nil,
# 94 ^
:vi_first_print,
# 95 _
- :ed_unassigned,
+ nil,
# 96 `
- :ed_unassigned,
+ nil,
# 97 a
:vi_add,
# 98 b
@@ -207,7 +207,7 @@ module Reline::KeyActor
# 102 f
:vi_next_char,
# 103 g
- :ed_unassigned,
+ nil,
# 104 h
:ed_prev_char,
# 105 i
@@ -219,23 +219,23 @@ module Reline::KeyActor
# 108 l
:ed_next_char,
# 109 m
- :ed_unassigned,
+ nil,
# 110 n
- :ed_unassigned,
+ nil,
# 111 o
- :ed_unassigned,
+ nil,
# 112 p
:vi_paste_next,
# 113 q
- :ed_unassigned,
+ nil,
# 114 r
:vi_replace_char,
# 115 s
- :ed_unassigned,
+ nil,
# 116 t
:vi_to_next_char,
# 117 u
- :ed_unassigned,
+ nil,
# 118 v
:vi_histedit,
# 119 w
@@ -245,273 +245,273 @@ module Reline::KeyActor
# 121 y
:vi_yank,
# 122 z
- :ed_unassigned,
+ nil,
# 123 {
- :ed_unassigned,
+ nil,
# 124 |
:vi_to_column,
# 125 }
- :ed_unassigned,
+ nil,
# 126 ~
- :ed_unassigned,
+ nil,
# 127 ^?
:em_delete_prev_char,
# 128 M-^@
- :ed_unassigned,
+ nil,
# 129 M-^A
- :ed_unassigned,
+ nil,
# 130 M-^B
- :ed_unassigned,
+ nil,
# 131 M-^C
- :ed_unassigned,
+ nil,
# 132 M-^D
- :ed_unassigned,
+ nil,
# 133 M-^E
- :ed_unassigned,
+ nil,
# 134 M-^F
- :ed_unassigned,
+ nil,
# 135 M-^G
- :ed_unassigned,
+ nil,
# 136 M-^H
- :ed_unassigned,
+ nil,
# 137 M-^I
- :ed_unassigned,
+ nil,
# 138 M-^J
- :ed_unassigned,
+ nil,
# 139 M-^K
- :ed_unassigned,
+ nil,
# 140 M-^L
- :ed_unassigned,
+ nil,
# 141 M-^M
- :ed_unassigned,
+ nil,
# 142 M-^N
- :ed_unassigned,
+ nil,
# 143 M-^O
- :ed_unassigned,
+ nil,
# 144 M-^P
- :ed_unassigned,
+ nil,
# 145 M-^Q
- :ed_unassigned,
+ nil,
# 146 M-^R
- :ed_unassigned,
+ nil,
# 147 M-^S
- :ed_unassigned,
+ nil,
# 148 M-^T
- :ed_unassigned,
+ nil,
# 149 M-^U
- :ed_unassigned,
+ nil,
# 150 M-^V
- :ed_unassigned,
+ nil,
# 151 M-^W
- :ed_unassigned,
+ nil,
# 152 M-^X
- :ed_unassigned,
+ nil,
# 153 M-^Y
- :ed_unassigned,
+ nil,
# 154 M-^Z
- :ed_unassigned,
+ nil,
# 155 M-^[
- :ed_unassigned,
+ nil,
# 156 M-^\
- :ed_unassigned,
+ nil,
# 157 M-^]
- :ed_unassigned,
+ nil,
# 158 M-^^
- :ed_unassigned,
+ nil,
# 159 M-^_
- :ed_unassigned,
+ nil,
# 160 M-SPACE
- :ed_unassigned,
+ nil,
# 161 M-!
- :ed_unassigned,
+ nil,
# 162 M-"
- :ed_unassigned,
+ nil,
# 163 M-#
- :ed_unassigned,
+ nil,
# 164 M-$
- :ed_unassigned,
+ nil,
# 165 M-%
- :ed_unassigned,
+ nil,
# 166 M-&
- :ed_unassigned,
+ nil,
# 167 M-'
- :ed_unassigned,
+ nil,
# 168 M-(
- :ed_unassigned,
+ nil,
# 169 M-)
- :ed_unassigned,
+ nil,
# 170 M-*
- :ed_unassigned,
+ nil,
# 171 M-+
- :ed_unassigned,
+ nil,
# 172 M-,
- :ed_unassigned,
+ nil,
# 173 M--
- :ed_unassigned,
+ nil,
# 174 M-.
- :ed_unassigned,
+ nil,
# 175 M-/
- :ed_unassigned,
+ nil,
# 176 M-0
- :ed_unassigned,
+ nil,
# 177 M-1
- :ed_unassigned,
+ nil,
# 178 M-2
- :ed_unassigned,
+ nil,
# 179 M-3
- :ed_unassigned,
+ nil,
# 180 M-4
- :ed_unassigned,
+ nil,
# 181 M-5
- :ed_unassigned,
+ nil,
# 182 M-6
- :ed_unassigned,
+ nil,
# 183 M-7
- :ed_unassigned,
+ nil,
# 184 M-8
- :ed_unassigned,
+ nil,
# 185 M-9
- :ed_unassigned,
+ nil,
# 186 M-:
- :ed_unassigned,
+ nil,
# 187 M-;
- :ed_unassigned,
+ nil,
# 188 M-<
- :ed_unassigned,
+ nil,
# 189 M-=
- :ed_unassigned,
+ nil,
# 190 M->
- :ed_unassigned,
+ nil,
# 191 M-?
- :ed_unassigned,
+ nil,
# 192 M-@
- :ed_unassigned,
+ nil,
# 193 M-A
- :ed_unassigned,
+ nil,
# 194 M-B
- :ed_unassigned,
+ nil,
# 195 M-C
- :ed_unassigned,
+ nil,
# 196 M-D
- :ed_unassigned,
+ nil,
# 197 M-E
- :ed_unassigned,
+ nil,
# 198 M-F
- :ed_unassigned,
+ nil,
# 199 M-G
- :ed_unassigned,
+ nil,
# 200 M-H
- :ed_unassigned,
+ nil,
# 201 M-I
- :ed_unassigned,
+ nil,
# 202 M-J
- :ed_unassigned,
+ nil,
# 203 M-K
- :ed_unassigned,
+ nil,
# 204 M-L
- :ed_unassigned,
+ nil,
# 205 M-M
- :ed_unassigned,
+ nil,
# 206 M-N
- :ed_unassigned,
+ nil,
# 207 M-O
- :ed_unassigned,
+ nil,
# 208 M-P
- :ed_unassigned,
+ nil,
# 209 M-Q
- :ed_unassigned,
+ nil,
# 210 M-R
- :ed_unassigned,
+ nil,
# 211 M-S
- :ed_unassigned,
+ nil,
# 212 M-T
- :ed_unassigned,
+ nil,
# 213 M-U
- :ed_unassigned,
+ nil,
# 214 M-V
- :ed_unassigned,
+ nil,
# 215 M-W
- :ed_unassigned,
+ nil,
# 216 M-X
- :ed_unassigned,
+ nil,
# 217 M-Y
- :ed_unassigned,
+ nil,
# 218 M-Z
- :ed_unassigned,
+ nil,
# 219 M-[
- :ed_unassigned,
+ nil,
# 220 M-\
- :ed_unassigned,
+ nil,
# 221 M-]
- :ed_unassigned,
+ nil,
# 222 M-^
- :ed_unassigned,
+ nil,
# 223 M-_
- :ed_unassigned,
+ nil,
# 224 M-`
- :ed_unassigned,
+ nil,
# 225 M-a
- :ed_unassigned,
+ nil,
# 226 M-b
- :ed_unassigned,
+ nil,
# 227 M-c
- :ed_unassigned,
+ nil,
# 228 M-d
- :ed_unassigned,
+ nil,
# 229 M-e
- :ed_unassigned,
+ nil,
# 230 M-f
- :ed_unassigned,
+ nil,
# 231 M-g
- :ed_unassigned,
+ nil,
# 232 M-h
- :ed_unassigned,
+ nil,
# 233 M-i
- :ed_unassigned,
+ nil,
# 234 M-j
- :ed_unassigned,
+ nil,
# 235 M-k
- :ed_unassigned,
+ nil,
# 236 M-l
- :ed_unassigned,
+ nil,
# 237 M-m
- :ed_unassigned,
+ nil,
# 238 M-n
- :ed_unassigned,
+ nil,
# 239 M-o
- :ed_unassigned,
+ nil,
# 240 M-p
- :ed_unassigned,
+ nil,
# 241 M-q
- :ed_unassigned,
+ nil,
# 242 M-r
- :ed_unassigned,
+ nil,
# 243 M-s
- :ed_unassigned,
+ nil,
# 244 M-t
- :ed_unassigned,
+ nil,
# 245 M-u
- :ed_unassigned,
+ nil,
# 246 M-v
- :ed_unassigned,
+ nil,
# 247 M-w
- :ed_unassigned,
+ nil,
# 248 M-x
- :ed_unassigned,
+ nil,
# 249 M-y
- :ed_unassigned,
+ nil,
# 250 M-z
- :ed_unassigned,
+ nil,
# 251 M-{
- :ed_unassigned,
+ nil,
# 252 M-|
- :ed_unassigned,
+ nil,
# 253 M-}
- :ed_unassigned,
+ nil,
# 254 M-~
- :ed_unassigned,
+ nil,
# 255 M-^?
- :ed_unassigned
+ nil
# EOF
]
end
diff --git a/lib/reline/key_actor/vi_insert.rb b/lib/reline/key_actor/vi_insert.rb
index 312df1646b..9a0ff57253 100644
--- a/lib/reline/key_actor/vi_insert.rb
+++ b/lib/reline/key_actor/vi_insert.rb
@@ -1,7 +1,7 @@
module Reline::KeyActor
VI_INSERT_MAPPING = [
# 0 ^@
- :ed_unassigned,
+ nil,
# 1 ^A
:ed_insert,
# 2 ^B
@@ -257,261 +257,261 @@ module Reline::KeyActor
# 127 ^?
:vi_delete_prev_char,
# 128 M-^@
- :ed_unassigned,
+ nil,
# 129 M-^A
- :ed_unassigned,
+ nil,
# 130 M-^B
- :ed_unassigned,
+ nil,
# 131 M-^C
- :ed_unassigned,
+ nil,
# 132 M-^D
- :ed_unassigned,
+ nil,
# 133 M-^E
- :ed_unassigned,
+ nil,
# 134 M-^F
- :ed_unassigned,
+ nil,
# 135 M-^G
- :ed_unassigned,
+ nil,
# 136 M-^H
- :ed_unassigned,
+ nil,
# 137 M-^I
- :ed_unassigned,
+ nil,
# 138 M-^J
:key_newline,
# 139 M-^K
- :ed_unassigned,
+ nil,
# 140 M-^L
- :ed_unassigned,
+ nil,
# 141 M-^M
:key_newline,
# 142 M-^N
- :ed_unassigned,
+ nil,
# 143 M-^O
- :ed_unassigned,
+ nil,
# 144 M-^P
- :ed_unassigned,
+ nil,
# 145 M-^Q
- :ed_unassigned,
+ nil,
# 146 M-^R
- :ed_unassigned,
+ nil,
# 147 M-^S
- :ed_unassigned,
+ nil,
# 148 M-^T
- :ed_unassigned,
+ nil,
# 149 M-^U
- :ed_unassigned,
+ nil,
# 150 M-^V
- :ed_unassigned,
+ nil,
# 151 M-^W
- :ed_unassigned,
+ nil,
# 152 M-^X
- :ed_unassigned,
+ nil,
# 153 M-^Y
- :ed_unassigned,
+ nil,
# 154 M-^Z
- :ed_unassigned,
+ nil,
# 155 M-^[
- :ed_unassigned,
+ nil,
# 156 M-^\
- :ed_unassigned,
+ nil,
# 157 M-^]
- :ed_unassigned,
+ nil,
# 158 M-^^
- :ed_unassigned,
+ nil,
# 159 M-^_
- :ed_unassigned,
+ nil,
# 160 M-SPACE
- :ed_unassigned,
+ nil,
# 161 M-!
- :ed_unassigned,
+ nil,
# 162 M-"
- :ed_unassigned,
+ nil,
# 163 M-#
- :ed_unassigned,
+ nil,
# 164 M-$
- :ed_unassigned,
+ nil,
# 165 M-%
- :ed_unassigned,
+ nil,
# 166 M-&
- :ed_unassigned,
+ nil,
# 167 M-'
- :ed_unassigned,
+ nil,
# 168 M-(
- :ed_unassigned,
+ nil,
# 169 M-)
- :ed_unassigned,
+ nil,
# 170 M-*
- :ed_unassigned,
+ nil,
# 171 M-+
- :ed_unassigned,
+ nil,
# 172 M-,
- :ed_unassigned,
+ nil,
# 173 M--
- :ed_unassigned,
+ nil,
# 174 M-.
- :ed_unassigned,
+ nil,
# 175 M-/
- :ed_unassigned,
+ nil,
# 176 M-0
- :ed_unassigned,
+ nil,
# 177 M-1
- :ed_unassigned,
+ nil,
# 178 M-2
- :ed_unassigned,
+ nil,
# 179 M-3
- :ed_unassigned,
+ nil,
# 180 M-4
- :ed_unassigned,
+ nil,
# 181 M-5
- :ed_unassigned,
+ nil,
# 182 M-6
- :ed_unassigned,
+ nil,
# 183 M-7
- :ed_unassigned,
+ nil,
# 184 M-8
- :ed_unassigned,
+ nil,
# 185 M-9
- :ed_unassigned,
+ nil,
# 186 M-:
- :ed_unassigned,
+ nil,
# 187 M-;
- :ed_unassigned,
+ nil,
# 188 M-<
- :ed_unassigned,
+ nil,
# 189 M-=
- :ed_unassigned,
+ nil,
# 190 M->
- :ed_unassigned,
+ nil,
# 191 M-?
- :ed_unassigned,
+ nil,
# 192 M-@
- :ed_unassigned,
+ nil,
# 193 M-A
- :ed_unassigned,
+ nil,
# 194 M-B
- :ed_unassigned,
+ nil,
# 195 M-C
- :ed_unassigned,
+ nil,
# 196 M-D
- :ed_unassigned,
+ nil,
# 197 M-E
- :ed_unassigned,
+ nil,
# 198 M-F
- :ed_unassigned,
+ nil,
# 199 M-G
- :ed_unassigned,
+ nil,
# 200 M-H
- :ed_unassigned,
+ nil,
# 201 M-I
- :ed_unassigned,
+ nil,
# 202 M-J
- :ed_unassigned,
+ nil,
# 203 M-K
- :ed_unassigned,
+ nil,
# 204 M-L
- :ed_unassigned,
+ nil,
# 205 M-M
- :ed_unassigned,
+ nil,
# 206 M-N
- :ed_unassigned,
+ nil,
# 207 M-O
- :ed_unassigned,
+ nil,
# 208 M-P
- :ed_unassigned,
+ nil,
# 209 M-Q
- :ed_unassigned,
+ nil,
# 210 M-R
- :ed_unassigned,
+ nil,
# 211 M-S
- :ed_unassigned,
+ nil,
# 212 M-T
- :ed_unassigned,
+ nil,
# 213 M-U
- :ed_unassigned,
+ nil,
# 214 M-V
- :ed_unassigned,
+ nil,
# 215 M-W
- :ed_unassigned,
+ nil,
# 216 M-X
- :ed_unassigned,
+ nil,
# 217 M-Y
- :ed_unassigned,
+ nil,
# 218 M-Z
- :ed_unassigned,
+ nil,
# 219 M-[
- :ed_unassigned,
+ nil,
# 220 M-\
- :ed_unassigned,
+ nil,
# 221 M-]
- :ed_unassigned,
+ nil,
# 222 M-^
- :ed_unassigned,
+ nil,
# 223 M-_
- :ed_unassigned,
+ nil,
# 224 M-`
- :ed_unassigned,
+ nil,
# 225 M-a
- :ed_unassigned,
+ nil,
# 226 M-b
- :ed_unassigned,
+ nil,
# 227 M-c
- :ed_unassigned,
+ nil,
# 228 M-d
- :ed_unassigned,
+ nil,
# 229 M-e
- :ed_unassigned,
+ nil,
# 230 M-f
- :ed_unassigned,
+ nil,
# 231 M-g
- :ed_unassigned,
+ nil,
# 232 M-h
- :ed_unassigned,
+ nil,
# 233 M-i
- :ed_unassigned,
+ nil,
# 234 M-j
- :ed_unassigned,
+ nil,
# 235 M-k
- :ed_unassigned,
+ nil,
# 236 M-l
- :ed_unassigned,
+ nil,
# 237 M-m
- :ed_unassigned,
+ nil,
# 238 M-n
- :ed_unassigned,
+ nil,
# 239 M-o
- :ed_unassigned,
+ nil,
# 240 M-p
- :ed_unassigned,
+ nil,
# 241 M-q
- :ed_unassigned,
+ nil,
# 242 M-r
- :ed_unassigned,
+ nil,
# 243 M-s
- :ed_unassigned,
+ nil,
# 244 M-t
- :ed_unassigned,
+ nil,
# 245 M-u
- :ed_unassigned,
+ nil,
# 246 M-v
- :ed_unassigned,
+ nil,
# 247 M-w
- :ed_unassigned,
+ nil,
# 248 M-x
- :ed_unassigned,
+ nil,
# 249 M-y
- :ed_unassigned,
+ nil,
# 250 M-z
- :ed_unassigned,
+ nil,
# 251 M-{
- :ed_unassigned,
+ nil,
# 252 M-|
- :ed_unassigned,
+ nil,
# 253 M-}
- :ed_unassigned,
+ nil,
# 254 M-~
- :ed_unassigned,
+ nil,
# 255 M-^?
- :ed_unassigned
+ nil
# EOF
]
end
diff --git a/lib/reline/key_stroke.rb b/lib/reline/key_stroke.rb
index 4e7ecd20f8..c3cee3d241 100644
--- a/lib/reline/key_stroke.rb
+++ b/lib/reline/key_stroke.rb
@@ -22,11 +22,6 @@ class Reline::KeyStroke
def match_status(input)
matching = key_mapping.matching?(input)
matched = key_mapping.get(input)
-
- # FIXME: Workaround for single byte. remove this after MAPPING is merged into KeyActor.
- matched ||= input.size == 1 && input[0] < 0x80
- matching ||= input == [ESC_BYTE]
-
if matching && matched
MATCHING_MATCHED
elsif matching
@@ -57,16 +52,20 @@ class Reline::KeyStroke
return [[], []] unless matched_bytes
func = key_mapping.get(matched_bytes)
+ s = matched_bytes.pack('c*').force_encoding(@encoding)
if func.is_a?(Array)
- keys = func.map { |c| Reline::Key.new(c, c, false) }
+ # Perform simple macro expansion for single byte key bindings.
+ # Multibyte key bindings and recursive macro expansion are not supported yet.
+ marco = func.pack('c*').force_encoding(@encoding)
+ keys = marco.chars.map do |c|
+ f = key_mapping.get(c.bytes)
+ Reline::Key.new(c, f.is_a?(Symbol) ? f : :ed_insert, false)
+ end
elsif func
- keys = [Reline::Key.new(func, func, false)]
- elsif matched_bytes.size == 2 && matched_bytes[0] == ESC_BYTE
- keys = [Reline::Key.new(matched_bytes[1], matched_bytes[1] | 0b10000000, true)]
+ keys = [Reline::Key.new(s, func, false)]
else
- s = matched_bytes.pack('c*').force_encoding(@encoding)
if s.valid_encoding? && s.size == 1
- keys = [Reline::Key.new(s.ord, s.ord, false)]
+ keys = [Reline::Key.new(s, :ed_insert, false)]
else
keys = []
end
diff --git a/lib/reline/line_editor.rb b/lib/reline/line_editor.rb
index c5658137ee..0ba44f8bc6 100644
--- a/lib/reline/line_editor.rb
+++ b/lib/reline/line_editor.rb
@@ -973,10 +973,17 @@ class Reline::LineEditor
@drop_terminate_spaces = false
end
+ VI_WAITING_ACCEPT_METHODS = %i[vi_change_meta vi_delete_meta vi_yank ed_insert ed_argument_digit]
+
private def process_key(key, method_symbol)
- if key.is_a?(Symbol)
- cleanup_waiting
- elsif @waiting_proc
+ if @waiting_proc
+ cleanup_waiting unless key.size == 1
+ end
+ if @vi_waiting_operator
+ cleanup_waiting unless VI_WAITING_ACCEPT_METHODS.include?(method_symbol) || VI_MOTIONS.include?(method_symbol)
+ end
+
+ if @waiting_proc
old_byte_pointer = @byte_pointer
@waiting_proc.call(key)
if @vi_waiting_operator
@@ -990,23 +997,14 @@ class Reline::LineEditor
return
end
+ # Reject multibyte input (converted to ed_insert) in vi_command mode
+ return if method_symbol == :ed_insert && @config.editing_mode_is?(:vi_command)
+
if method_symbol and respond_to?(method_symbol, true)
method_obj = method(method_symbol)
end
- if method_symbol and key.is_a?(Symbol)
- if @vi_arg and argumentable?(method_obj)
- run_for_operators(key, method_symbol) do |with_operator|
- wrap_method_call(method_symbol, method_obj, key, with_operator)
- end
- else
- wrap_method_call(method_symbol, method_obj, key) if method_obj
- end
- @kill_ring.process
- if @vi_arg
- @vi_arg = nil
- end
- elsif @vi_arg
- if key.chr =~ /[0-9]/
+ if @vi_arg
+ if key.match?(/\A\d\z/)
ed_argument_digit(key)
else
if argumentable?(method_obj)
@@ -1015,8 +1013,6 @@ class Reline::LineEditor
end
elsif method_obj
wrap_method_call(method_symbol, method_obj, key)
- else
- ed_insert(key) unless @config.editing_mode_is?(:vi_command)
end
@kill_ring.process
if @vi_arg
@@ -1032,21 +1028,6 @@ class Reline::LineEditor
end
end
@kill_ring.process
- else
- ed_insert(key) unless @config.editing_mode_is?(:vi_command)
- end
- end
-
- private def normal_char(key)
- if key.char < 0x80
- method_symbol = @config.editing_mode.get_method(key.combined_char)
- process_key(key.combined_char, method_symbol)
- else
- process_key(key.char.chr(encoding), nil)
- end
- if @config.editing_mode_is?(:vi_command) and @byte_pointer > 0 and @byte_pointer == current_line.bytesize
- byte_size = Reline::Unicode.get_prev_mbchar_size(@buffer_of_lines[@line_index], @byte_pointer)
- @byte_pointer -= byte_size
end
end
@@ -1063,23 +1044,23 @@ class Reline::LineEditor
def input_key(key)
save_old_buffer
@config.reset_oneshot_key_bindings
- @dialogs.each do |dialog|
- if key.char.instance_of?(Symbol) and key.char == dialog.name
- return
- end
- end
if key.char.nil?
process_insert(force: true)
@eof = buffer_empty?
finish
return
end
+ @dialogs.each do |dialog|
+ if key.method_symbol == dialog.name
+ return
+ end
+ end
@completion_occurs = false
- if key.char.is_a?(Symbol)
- process_key(key.char, key.char)
- else
- normal_char(key)
+ process_key(key.char, key.method_symbol)
+ if @config.editing_mode_is?(:vi_command) and @byte_pointer > 0 and @byte_pointer == current_line.bytesize
+ byte_size = Reline::Unicode.get_prev_mbchar_size(@buffer_of_lines[@line_index], @byte_pointer)
+ @byte_pointer -= byte_size
end
@prev_action_state, @next_action_state = @next_action_state, NullActionState
@@ -1432,21 +1413,11 @@ class Reline::LineEditor
# digit or if the existing argument is already greater than a
# million.
# GNU Readline:: +self-insert+ (a, b, A, 1, !, …) Insert yourself.
- private def ed_insert(key)
- if key.instance_of?(String)
- begin
- key.encode(Encoding::UTF_8)
- rescue Encoding::UndefinedConversionError
- return
- end
- str = key
- else
- begin
- key.chr.encode(Encoding::UTF_8)
- rescue Encoding::UndefinedConversionError
- return
- end
- str = key.chr
+ private def ed_insert(str)
+ begin
+ str.encode(Encoding::UTF_8)
+ rescue Encoding::UndefinedConversionError
+ return
end
if @in_pasting
@continuous_insertion_buffer << str
@@ -1463,11 +1434,10 @@ class Reline::LineEditor
private def ed_quoted_insert(str, arg: 1)
@waiting_proc = proc { |key|
arg.times do
- if key == "\C-j".ord or key == "\C-m".ord
+ if key == "\C-j" or key == "\C-m"
key_newline(key)
- elsif key == 0
+ elsif key != "\0"
# Ignore NUL.
- else
ed_insert(key)
end
end
@@ -1523,13 +1493,13 @@ class Reline::LineEditor
lambda do |key|
search_again = false
case key
- when "\C-h".ord, "\C-?".ord
+ when "\C-h", "\C-?"
grapheme_clusters = search_word.grapheme_clusters
if grapheme_clusters.size > 0
grapheme_clusters.pop
search_word = grapheme_clusters.join
end
- when "\C-r".ord, "\C-s".ord
+ when "\C-r", "\C-s"
search_again = true if search_key == key
search_key = key
else
@@ -1546,10 +1516,10 @@ class Reline::LineEditor
end
if @history_pointer
case search_key
- when "\C-r".ord
+ when "\C-r"
history_pointer_base = 0
history = Reline::HISTORY[0..(@history_pointer - 1)]
- when "\C-s".ord
+ when "\C-s"
history_pointer_base = @history_pointer + 1
history = Reline::HISTORY[(@history_pointer + 1)..-1]
end
@@ -1559,10 +1529,10 @@ class Reline::LineEditor
end
elsif @history_pointer
case search_key
- when "\C-r".ord
+ when "\C-r"
history_pointer_base = 0
history = Reline::HISTORY[0..@history_pointer]
- when "\C-s".ord
+ when "\C-s"
history_pointer_base = @history_pointer
history = Reline::HISTORY[@history_pointer..-1]
end
@@ -1571,11 +1541,11 @@ class Reline::LineEditor
history = Reline::HISTORY
end
case search_key
- when "\C-r".ord
+ when "\C-r"
hit_index = history.rindex { |item|
item.include?(search_word)
}
- when "\C-s".ord
+ when "\C-s"
hit_index = history.index { |item|
item.include?(search_word)
}
@@ -1586,9 +1556,9 @@ class Reline::LineEditor
end
end
case search_key
- when "\C-r".ord
+ when "\C-r"
prompt_name = 'reverse-i-search'
- when "\C-s".ord
+ when "\C-s"
prompt_name = 'i-search'
end
prompt_name = "failed #{prompt_name}" unless hit
@@ -1600,16 +1570,15 @@ class Reline::LineEditor
backup = @buffer_of_lines.dup, @line_index, @byte_pointer, @history_pointer, @line_backup_in_history
searcher = generate_searcher(key)
@searching_prompt = "(reverse-i-search)`': "
- termination_keys = ["\C-j".ord]
- termination_keys.concat(@config.isearch_terminators.chars.map(&:ord)) if @config.isearch_terminators
+ termination_keys = ["\C-j"]
+ termination_keys.concat(@config.isearch_terminators.chars) if @config.isearch_terminators
@waiting_proc = ->(k) {
- chr = k.is_a?(String) ? k : k.chr(Encoding::ASCII_8BIT)
- if k == "\C-g".ord
+ if k == "\C-g"
# cancel search and restore buffer
@buffer_of_lines, @line_index, @byte_pointer, @history_pointer, @line_backup_in_history = backup
@searching_prompt = nil
@waiting_proc = nil
- elsif !termination_keys.include?(k) && (chr.match?(/[[:print:]]/) || k == "\C-h".ord || k == "\C-?".ord || k == "\C-r".ord || k == "\C-s".ord)
+ elsif !termination_keys.include?(k) && (k.match?(/[[:print:]]/) || k == "\C-h" || k == "\C-?" || k == "\C-r" || k == "\C-s")
search_word, prompt_name, hit_pointer = searcher.call(k)
Reline.last_incremental_search = search_word
@searching_prompt = "(%s)`%s'" % [prompt_name, search_word]
@@ -1825,7 +1794,7 @@ class Reline::LineEditor
alias_method :kill_whole_line, :em_kill_line
private def em_delete(key)
- if buffer_empty? and key == "\C-d".ord
+ if buffer_empty? and key == "\C-d"
@eof = true
finish
elsif @byte_pointer < current_line.bytesize
@@ -2243,20 +2212,9 @@ class Reline::LineEditor
end
private def ed_argument_digit(key)
- if @vi_arg.nil?
- if key.chr.to_i.zero?
- if key.anybits?(0b10000000)
- unescaped_key = key ^ 0b10000000
- unless unescaped_key.chr.to_i.zero?
- @vi_arg = unescaped_key.chr.to_i
- end
- end
- else
- @vi_arg = key.chr.to_i
- end
- else
- @vi_arg = @vi_arg * 10 + key.chr.to_i
- end
+ # key is expected to be `ESC digit` or `digit`
+ num = key[/\d/].to_i
+ @vi_arg = (@vi_arg || 0) * 10 + num
end
private def vi_to_column(key, arg: 0)
@@ -2275,7 +2233,7 @@ class Reline::LineEditor
before = current_line.byteslice(0, @byte_pointer)
remaining_point = @byte_pointer + byte_size
after = current_line.byteslice(remaining_point, current_line.bytesize - remaining_point)
- set_current_line(before + k.chr + after)
+ set_current_line(before + k + after)
@waiting_proc = nil
elsif arg > 1
byte_size = 0
@@ -2285,7 +2243,7 @@ class Reline::LineEditor
before = current_line.byteslice(0, @byte_pointer)
remaining_point = @byte_pointer + byte_size
after = current_line.byteslice(remaining_point, current_line.bytesize - remaining_point)
- replaced = k.chr * arg
+ replaced = k * arg
set_current_line(before + replaced + after, @byte_pointer + replaced.bytesize)
@waiting_proc = nil
end
@@ -2301,11 +2259,6 @@ class Reline::LineEditor
end
private def search_next_char(key, arg, need_prev_char: false, inclusive: false)
- if key.instance_of?(String)
- inputted_char = key
- else
- inputted_char = key.chr
- end
prev_total = nil
total = nil
found = false
@@ -2316,7 +2269,7 @@ class Reline::LineEditor
width = Reline::Unicode.get_mbchar_width(mbchar)
total = [mbchar.bytesize, width]
else
- if inputted_char == mbchar
+ if key == mbchar
arg -= 1
if arg.zero?
found = true
@@ -2353,11 +2306,6 @@ class Reline::LineEditor
end
private def search_prev_char(key, arg, need_next_char = false)
- if key.instance_of?(String)
- inputted_char = key
- else
- inputted_char = key.chr
- end
prev_total = nil
total = nil
found = false
@@ -2368,7 +2316,7 @@ class Reline::LineEditor
width = Reline::Unicode.get_mbchar_width(mbchar)
total = [mbchar.bytesize, width]
else
- if inputted_char == mbchar
+ if key == mbchar
arg -= 1
if arg.zero?
found = true
diff --git a/test/reline/helper.rb b/test/reline/helper.rb
index 587376623b..a0c1b097e6 100644
--- a/test/reline/helper.rb
+++ b/test/reline/helper.rb
@@ -108,31 +108,29 @@ class Reline::TestCase < Test::Unit::TestCase
input
end
- def input_key_by_symbol(input)
- @line_editor.input_key(Reline::Key.new(input, input, false))
+ def input_key_by_symbol(method_symbol, csi: false)
+ dummy_char = csi ? "\e[A" : "\C-a"
+ @line_editor.input_key(Reline::Key.new(dummy_char, method_symbol, false))
end
def input_keys(input, convert = true)
- input = convert_str(input) if convert
- input.chars.each do |c|
- if c.bytesize == 1
- eighth_bit = 0b10000000
- byte = c.bytes.first
- if byte.allbits?(eighth_bit)
- @line_editor.input_key(Reline::Key.new(byte ^ eighth_bit, byte, true))
- else
- @line_editor.input_key(Reline::Key.new(byte, byte, false))
- end
- else
- @line_editor.input_key(Reline::Key.new(c.ord, c.ord, false))
- end
- end
+ # Reline does not support convert-meta, but test data includes \M-char. It should be converted to ESC+char.
+ # Note that mixing unicode chars and \M-char is not recommended. "\M-C\M-\C-A" is a single unicode character.
+ input = input.chars.map do |c|
+ c.valid_encoding? ? c : "\e#{(c.bytes[0] & 0x7f).chr}"
+ end.join
+ input_raw_keys(input, convert)
end
def input_raw_keys(input, convert = true)
input = convert_str(input) if convert
- input.chars.each do |c|
- @line_editor.input_key(Reline::Key.new(c.ord, c.ord, false))
+ key_stroke = Reline::KeyStroke.new(@config, @encoding)
+ input_bytes = input.bytes
+ until input_bytes.empty?
+ expanded, input_bytes = key_stroke.expand(input_bytes)
+ expanded.each do |key|
+ @line_editor.input_key(key)
+ end
end
end
diff --git a/test/reline/test_key_actor_emacs.rb b/test/reline/test_key_actor_emacs.rb
index 988a073f2d..9fd19f6079 100644
--- a/test/reline/test_key_actor_emacs.rb
+++ b/test/reline/test_key_actor_emacs.rb
@@ -157,18 +157,18 @@ class Reline::KeyActor::EmacsTest < Reline::TestCase
end
def test_em_kill_line
- @line_editor.input_key(Reline::Key.new(:em_kill_line, :em_kill_line, false))
+ input_key_by_symbol(:em_kill_line)
assert_line_around_cursor('', '')
input_keys('abc')
- @line_editor.input_key(Reline::Key.new(:em_kill_line, :em_kill_line, false))
+ input_key_by_symbol(:em_kill_line)
assert_line_around_cursor('', '')
input_keys('abc')
input_keys("\C-b", false)
- @line_editor.input_key(Reline::Key.new(:em_kill_line, :em_kill_line, false))
+ input_key_by_symbol(:em_kill_line)
assert_line_around_cursor('', '')
input_keys('abc')
input_keys("\C-a", false)
- @line_editor.input_key(Reline::Key.new(:em_kill_line, :em_kill_line, false))
+ input_key_by_symbol(:em_kill_line)
assert_line_around_cursor('', '')
end
@@ -273,12 +273,12 @@ class Reline::KeyActor::EmacsTest < Reline::TestCase
def test_key_delete
input_keys('abc')
assert_line_around_cursor('abc', '')
- @line_editor.input_key(Reline::Key.new(:key_delete, :key_delete, false))
+ input_key_by_symbol(:key_delete)
assert_line_around_cursor('abc', '')
end
def test_key_delete_does_not_end_editing
- @line_editor.input_key(Reline::Key.new(:key_delete, :key_delete, false))
+ input_key_by_symbol(:key_delete)
assert_line_around_cursor('', '')
refute(@line_editor.finished?)
end
@@ -287,7 +287,7 @@ class Reline::KeyActor::EmacsTest < Reline::TestCase
input_keys('abc')
input_keys("\C-b", false)
assert_line_around_cursor('ab', 'c')
- @line_editor.input_key(Reline::Key.new(:key_delete, :key_delete, false))
+ input_key_by_symbol(:key_delete)
assert_line_around_cursor('ab', '')
end
@@ -731,10 +731,10 @@ class Reline::KeyActor::EmacsTest < Reline::TestCase
input_keys("\C-b", false)
assert_line_around_cursor('foo', 'o')
assert_equal(nil, @line_editor.instance_variable_get(:@menu_info))
- @line_editor.input_key(Reline::Key.new(:em_delete_or_list, :em_delete_or_list, false))
+ input_key_by_symbol(:em_delete_or_list)
assert_line_around_cursor('foo', '')
assert_equal(nil, @line_editor.instance_variable_get(:@menu_info))
- @line_editor.input_key(Reline::Key.new(:em_delete_or_list, :em_delete_or_list, false))
+ input_key_by_symbol(:em_delete_or_list)
assert_line_around_cursor('foo', '')
assert_equal(%w{foo_foo foo_bar foo_baz}, @line_editor.instance_variable_get(:@menu_info).list)
end
@@ -1363,7 +1363,7 @@ class Reline::KeyActor::EmacsTest < Reline::TestCase
def test_incremental_search_history_cancel_by_symbol_key
# ed_prev_char should move cursor left and cancel incremental search
input_keys("abc\C-r")
- input_key_by_symbol(:ed_prev_char)
+ input_key_by_symbol(:ed_prev_char, csi: true)
input_keys('d')
assert_line_around_cursor('abd', 'c')
end
diff --git a/test/reline/test_key_actor_vi.rb b/test/reline/test_key_actor_vi.rb
index 9712ba89cc..6d5b7e20c4 100644
--- a/test/reline/test_key_actor_vi.rb
+++ b/test/reline/test_key_actor_vi.rb
@@ -112,6 +112,17 @@ class Reline::ViInsertTest < Reline::TestCase
assert_line_around_cursor("か\u3099き\u3099", '')
end
+ def test_ed_insert_ignore_in_vi_command
+ input_keys("\C-[")
+ chars_to_be_ignored = "\C-Oあ=".chars
+ input_keys(chars_to_be_ignored.join)
+ assert_line_around_cursor('', '')
+ input_keys(chars_to_be_ignored.map {|c| "5#{c}" }.join)
+ assert_line_around_cursor('', '')
+ input_keys('iい')
+ assert_line_around_cursor("い", '')
+ end
+
def test_ed_next_char
input_keys("abcdef\C-[0")
assert_line_around_cursor('', 'abcdef')
@@ -648,7 +659,7 @@ class Reline::ViInsertTest < Reline::TestCase
assert_line_around_cursor('Readline', '')
input_keys("\C-i", false)
assert_line_around_cursor('Regexp', '')
- @line_editor.input_key(Reline::Key.new(:completion_journey_up, :completion_journey_up, false))
+ input_key_by_symbol(:completion_journey_up)
assert_line_around_cursor('Readline', '')
ensure
@config.autocompletion = false
@@ -671,7 +682,7 @@ class Reline::ViInsertTest < Reline::TestCase
assert_line_around_cursor('Readline', '')
input_keys("\C-i", false)
assert_line_around_cursor('Regexp', '')
- @line_editor.input_key(Reline::Key.new(:menu_complete_backward, :menu_complete_backward, false))
+ input_key_by_symbol(:menu_complete_backward)
assert_line_around_cursor('Readline', '')
ensure
@config.autocompletion = false
@@ -804,6 +815,14 @@ class Reline::ViInsertTest < Reline::TestCase
assert_line_around_cursor(' f', 'oo foo')
end
+ def test_waiting_operator_arg_including_zero
+ input_keys("a111111111111222222222222\C-[0")
+ input_keys('10df1')
+ assert_line_around_cursor('', '11222222222222')
+ input_keys('d10f2')
+ assert_line_around_cursor('', '22')
+ end
+
def test_vi_waiting_operator_cancel
input_keys("aaa bbb ccc\C-[02w")
assert_line_around_cursor('aaa bbb ', 'ccc')
@@ -825,14 +844,14 @@ class Reline::ViInsertTest < Reline::TestCase
assert_line_around_cursor('', 'aaa bbb lll')
# ed_next_char should move cursor right and cancel vi_next_char
input_keys('f')
- input_key_by_symbol(:ed_next_char)
+ input_key_by_symbol(:ed_next_char, csi: true)
input_keys('l')
assert_line_around_cursor('aa', 'a bbb lll')
- # ed_next_char should move cursor right and cancel delete_meta
+ # vi_delete_meta + ed_next_char should delete character
input_keys('d')
- input_key_by_symbol(:ed_next_char)
+ input_key_by_symbol(:ed_next_char, csi: true)
input_keys('l')
- assert_line_around_cursor('aaa ', 'bbb lll')
+ assert_line_around_cursor('aa ', 'bbb lll')
end
def test_unimplemented_vi_command_should_be_no_op
diff --git a/test/reline/test_key_stroke.rb b/test/reline/test_key_stroke.rb
index 8f5c767ca4..fb2cb1c8b8 100644
--- a/test/reline/test_key_stroke.rb
+++ b/test/reline/test_key_stroke.rb
@@ -1,18 +1,6 @@
require_relative 'helper'
class Reline::KeyStroke::Test < Reline::TestCase
- using Module.new {
- refine Array do
- def as_s
- join
- end
-
- def to_keys
- map{ |b| Reline::Key.new(b, b, false) }
- end
- end
- }
-
def encoding
Reline.core.encoding
end
@@ -65,14 +53,14 @@ class Reline::KeyStroke::Test < Reline::TestCase
def test_expand
config = Reline::Config.new
{
- 'abc' => '123',
- 'ab' => '456'
+ 'abc' => 'AB',
+ 'ab' => "1\C-a"
}.each_pair do |key, func|
config.add_default_key_binding(key.bytes, func.bytes)
end
stroke = Reline::KeyStroke.new(config, encoding)
- assert_equal(['123'.bytes.map { |c| Reline::Key.new(c, c, false) }, 'de'.bytes], stroke.expand('abcde'.bytes))
- assert_equal(['456'.bytes.map { |c| Reline::Key.new(c, c, false) }, 'de'.bytes], stroke.expand('abde'.bytes))
+ assert_equal([[Reline::Key.new('A', :ed_insert, false), Reline::Key.new('B', :ed_insert, false)], 'de'.bytes], stroke.expand('abcde'.bytes))
+ assert_equal([[Reline::Key.new('1', :ed_digit, false), Reline::Key.new("\C-a", :ed_move_to_beg, false)], 'de'.bytes], stroke.expand('abde'.bytes))
# CSI sequence
assert_equal([[], 'bc'.bytes], stroke.expand("\e[1;2;3;4;5abc".bytes))
assert_equal([[], 'BC'.bytes], stroke.expand("\e\e[ABC".bytes))
@@ -83,24 +71,17 @@ class Reline::KeyStroke::Test < Reline::TestCase
def test_oneshot_key_bindings
config = Reline::Config.new
{
- 'abc' => '123',
- }.each_pair do |key, func|
- config.add_default_key_binding(key.bytes, func.bytes)
- end
- stroke = Reline::KeyStroke.new(config, encoding)
- assert_equal(Reline::KeyStroke::UNMATCHED, stroke.match_status('zzz'.bytes))
- assert_equal(Reline::KeyStroke::MATCHED, stroke.match_status('abc'.bytes))
- end
-
- def test_with_reline_key
- config = Reline::Config.new
- {
+ 'abc'.bytes => '123',
+ # IRB version <= 1.13.1 wrongly uses Reline::Key with wrong argument. It should be ignored without error.
+ [Reline::Key.new(nil, 0xE4, true)] => '012',
"\eda".bytes => 'abc', # Alt+d a
[195, 164] => 'def'
}.each_pair do |key, func|
config.add_oneshot_key_binding(key, func.bytes)
end
stroke = Reline::KeyStroke.new(config, encoding)
+ assert_equal(Reline::KeyStroke::UNMATCHED, stroke.match_status('zzz'.bytes))
+ assert_equal(Reline::KeyStroke::MATCHED, stroke.match_status('abc'.bytes))
assert_equal(Reline::KeyStroke::UNMATCHED, stroke.match_status('da'.bytes))
assert_equal(Reline::KeyStroke::MATCHED, stroke.match_status("\eda".bytes))
assert_equal(Reline::KeyStroke::UNMATCHED, stroke.match_status(" \eda".bytes))
@@ -115,7 +96,7 @@ class Reline::KeyStroke::Test < Reline::TestCase
end
config = Reline::Config.new
stroke = Reline::KeyStroke.new(config, encoding)
- key = Reline::Key.new(char.ord, char.ord, false)
+ key = Reline::Key.new(char, :ed_insert, false)
bytes = char.bytes
assert_equal(Reline::KeyStroke::MATCHED, stroke.match_status(bytes))
assert_equal([[key], []], stroke.expand(bytes))
diff --git a/test/reline/test_macro.rb b/test/reline/test_macro.rb
index bfee280c72..cacdb76c60 100644
--- a/test/reline/test_macro.rb
+++ b/test/reline/test_macro.rb
@@ -14,12 +14,12 @@ class Reline::MacroTest < Reline::TestCase
Reline.test_reset
end
- def input_key(char, combined_char = char, with_meta = false)
- @line_editor.input_key(Reline::Key.new(char, combined_char, with_meta))
+ def input_key(char, method_symbol = :ed_insert)
+ @line_editor.input_key(Reline::Key.new(char, method_symbol, false))
end
def input(str)
- str.each_byte {|c| input_key(c)}
+ str.each_char {|c| input_key(c)}
end
def test_simple_input
@@ -33,7 +33,7 @@ class Reline::MacroTest < Reline::TestCase
end
input('abc')
assert_nothing_raised(ArgumentError) {
- input_key(:delete_char)
+ input_key('x', :delete_char)
}
assert_equal 'ab', @line_editor.line
end
diff --git a/test/reline/test_reline_key.rb b/test/reline/test_reline_key.rb
index 1e6b9fcb6c..b6260d57d6 100644
--- a/test/reline/test_reline_key.rb
+++ b/test/reline/test_reline_key.rb
@@ -3,9 +3,8 @@ require "reline"
class Reline::TestKey < Reline::TestCase
def test_match_symbol
- assert(Reline::Key.new(:key1, :key1, false).match?(:key1))
- refute(Reline::Key.new(:key1, :key1, false).match?(:key2))
- refute(Reline::Key.new(:key1, :key1, false).match?(nil))
- refute(Reline::Key.new(1, 1, false).match?(:key1))
+ assert(Reline::Key.new('a', :key1, false).match?(:key1))
+ refute(Reline::Key.new('a', :key1, false).match?(:key2))
+ refute(Reline::Key.new('a', :key1, false).match?(nil))
end
end
diff --git a/test/reline/yamatanooroti/test_rendering.rb b/test/reline/yamatanooroti/test_rendering.rb
index 93bec515d1..e9f9ee66d2 100644
--- a/test/reline/yamatanooroti/test_rendering.rb
+++ b/test/reline/yamatanooroti/test_rendering.rb
@@ -271,7 +271,7 @@ begin
write("\e") # single ESC
sleep 1
write("A")
- write("B\eAC") # ESC + A (M-A, specified ed_unassigned in Reline::KeyActor::Emacs)
+ write("B\eAC") # ESC + A (M-A, no key specified in Reline::KeyActor::Emacs)
assert_screen(<<~EOC)
Multiline REPL.
prompt> abcABCdef