summaryrefslogtreecommitdiff
path: root/lib
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 /lib
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
Diffstat (limited to 'lib')
-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
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