diff options
author | tomoya ishida <[email protected]> | 2024-12-06 16:09:19 +0900 |
---|---|---|
committer | git <[email protected]> | 2024-12-06 07:09:24 +0000 |
commit | 5f65321915843faf47231a941f284e7375d6fb10 (patch) | |
tree | e458e06a3c5a7212391e9a59b7eeee73cde0cf85 /lib | |
parent | 6ccaa37eb365afd6b01359e63dac85aef35987a5 (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
Diffstat (limited to 'lib')
-rw-r--r-- | lib/reline.rb | 8 | ||||
-rw-r--r-- | lib/reline/io/windows.rb | 1 | ||||
-rw-r--r-- | lib/reline/key_actor/base.rb | 14 | ||||
-rw-r--r-- | lib/reline/key_actor/emacs.rb | 192 | ||||
-rw-r--r-- | lib/reline/key_actor/vi_command.rb | 364 | ||||
-rw-r--r-- | lib/reline/key_actor/vi_insert.rb | 254 | ||||
-rw-r--r-- | lib/reline/key_stroke.rb | 21 | ||||
-rw-r--r-- | lib/reline/line_editor.rb | 158 |
8 files changed, 483 insertions, 529 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 |