reline 0.5.6 → 0.5.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/reline/key_actor/emacs.rb +1 -1
- data/lib/reline/line_editor.rb +57 -6
- data/lib/reline/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 06a566ff8fc4daaf8ecee47eb28dac9e3e1a1d94fe05be5b9b9e1eb3a58228cc
|
4
|
+
data.tar.gz: 70b3aa5a4bcbf7fd7e564d47857f18717e49e2163ee5e5789d81f0bc246a2e17
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1eaf728bdb9be12e3d6fdba67a00651641426f7f70b6248360d47b7101d638d17b9ddbc70e20ad6fbd428dfcd69a6cb75e01bf4f9b20ebde16c3c5e2216231d
|
7
|
+
data.tar.gz: 28645bd429b1210b50875109c1fad90a5cd759e0411e99292ef1d785341b28ae851d144c3e1faeae994e42eaed735a71f8a94d5c74423085f1ac7d5ce72bdb72
|
data/lib/reline/line_editor.rb
CHANGED
@@ -4,7 +4,6 @@ require 'reline/unicode'
|
|
4
4
|
require 'tempfile'
|
5
5
|
|
6
6
|
class Reline::LineEditor
|
7
|
-
# TODO: undo
|
8
7
|
# TODO: Use "private alias_method" idiom after drop Ruby 2.5.
|
9
8
|
attr_reader :byte_pointer
|
10
9
|
attr_accessor :confirm_multiline_termination_proc
|
@@ -75,7 +74,7 @@ class Reline::LineEditor
|
|
75
74
|
def initialize(config, encoding)
|
76
75
|
@config = config
|
77
76
|
@completion_append_character = ''
|
78
|
-
@screen_size =
|
77
|
+
@screen_size = [0, 0] # Should be initialized with actual winsize in LineEditor#reset
|
79
78
|
reset_variables(encoding: encoding)
|
80
79
|
end
|
81
80
|
|
@@ -251,6 +250,8 @@ class Reline::LineEditor
|
|
251
250
|
@resized = false
|
252
251
|
@cache = {}
|
253
252
|
@rendered_screen = RenderedScreen.new(base_y: 0, lines: [], cursor_y: 0)
|
253
|
+
@past_lines = []
|
254
|
+
@undoing = false
|
254
255
|
reset_line
|
255
256
|
end
|
256
257
|
|
@@ -948,7 +949,8 @@ class Reline::LineEditor
|
|
948
949
|
unless @waiting_proc
|
949
950
|
byte_pointer_diff = @byte_pointer - old_byte_pointer
|
950
951
|
@byte_pointer = old_byte_pointer
|
951
|
-
|
952
|
+
method_obj = method(@vi_waiting_operator)
|
953
|
+
wrap_method_call(@vi_waiting_operator, method_obj, byte_pointer_diff)
|
952
954
|
cleanup_waiting
|
953
955
|
end
|
954
956
|
else
|
@@ -1009,7 +1011,8 @@ class Reline::LineEditor
|
|
1009
1011
|
if @vi_waiting_operator
|
1010
1012
|
byte_pointer_diff = @byte_pointer - old_byte_pointer
|
1011
1013
|
@byte_pointer = old_byte_pointer
|
1012
|
-
|
1014
|
+
method_obj = method(@vi_waiting_operator)
|
1015
|
+
wrap_method_call(@vi_waiting_operator, method_obj, byte_pointer_diff)
|
1013
1016
|
cleanup_waiting
|
1014
1017
|
end
|
1015
1018
|
@kill_ring.process
|
@@ -1106,6 +1109,7 @@ class Reline::LineEditor
|
|
1106
1109
|
end
|
1107
1110
|
|
1108
1111
|
def input_key(key)
|
1112
|
+
save_old_buffer
|
1109
1113
|
@config.reset_oneshot_key_bindings
|
1110
1114
|
@dialogs.each do |dialog|
|
1111
1115
|
if key.char.instance_of?(Symbol) and key.char == dialog.name
|
@@ -1120,7 +1124,6 @@ class Reline::LineEditor
|
|
1120
1124
|
finish
|
1121
1125
|
return
|
1122
1126
|
end
|
1123
|
-
old_lines = @buffer_of_lines.dup
|
1124
1127
|
@first_char = false
|
1125
1128
|
@completion_occurs = false
|
1126
1129
|
|
@@ -1134,12 +1137,15 @@ class Reline::LineEditor
|
|
1134
1137
|
@completion_journey_state = nil
|
1135
1138
|
end
|
1136
1139
|
|
1140
|
+
push_past_lines unless @undoing
|
1141
|
+
@undoing = false
|
1142
|
+
|
1137
1143
|
if @in_pasting
|
1138
1144
|
clear_dialogs
|
1139
1145
|
return
|
1140
1146
|
end
|
1141
1147
|
|
1142
|
-
modified =
|
1148
|
+
modified = @old_buffer_of_lines != @buffer_of_lines
|
1143
1149
|
if !@completion_occurs && modified && !@config.disable_completion && @config.autocompletion
|
1144
1150
|
# Auto complete starts only when edited
|
1145
1151
|
process_insert(force: true)
|
@@ -1148,6 +1154,26 @@ class Reline::LineEditor
|
|
1148
1154
|
modified
|
1149
1155
|
end
|
1150
1156
|
|
1157
|
+
def save_old_buffer
|
1158
|
+
@old_buffer_of_lines = @buffer_of_lines.dup
|
1159
|
+
@old_byte_pointer = @byte_pointer.dup
|
1160
|
+
@old_line_index = @line_index.dup
|
1161
|
+
end
|
1162
|
+
|
1163
|
+
def push_past_lines
|
1164
|
+
if @old_buffer_of_lines != @buffer_of_lines
|
1165
|
+
@past_lines.push([@old_buffer_of_lines, @old_byte_pointer, @old_line_index])
|
1166
|
+
end
|
1167
|
+
trim_past_lines
|
1168
|
+
end
|
1169
|
+
|
1170
|
+
MAX_PAST_LINES = 100
|
1171
|
+
def trim_past_lines
|
1172
|
+
if @past_lines.size > MAX_PAST_LINES
|
1173
|
+
@past_lines.shift
|
1174
|
+
end
|
1175
|
+
end
|
1176
|
+
|
1151
1177
|
def scroll_into_view
|
1152
1178
|
_wrapped_cursor_x, wrapped_cursor_y = wrapped_cursor_position
|
1153
1179
|
if wrapped_cursor_y < screen_scroll_top
|
@@ -1224,6 +1250,18 @@ class Reline::LineEditor
|
|
1224
1250
|
process_auto_indent
|
1225
1251
|
end
|
1226
1252
|
|
1253
|
+
def set_current_lines(lines, byte_pointer = nil, line_index = 0)
|
1254
|
+
cursor = current_byte_pointer_cursor
|
1255
|
+
@buffer_of_lines = lines
|
1256
|
+
@line_index = line_index
|
1257
|
+
if byte_pointer
|
1258
|
+
@byte_pointer = byte_pointer
|
1259
|
+
else
|
1260
|
+
calculate_nearest_cursor(cursor)
|
1261
|
+
end
|
1262
|
+
process_auto_indent
|
1263
|
+
end
|
1264
|
+
|
1227
1265
|
def retrieve_completion_block(set_completion_quote_character = false)
|
1228
1266
|
if Reline.completer_word_break_characters.empty?
|
1229
1267
|
word_break_regexp = nil
|
@@ -1306,6 +1344,7 @@ class Reline::LineEditor
|
|
1306
1344
|
end
|
1307
1345
|
|
1308
1346
|
def insert_pasted_text(text)
|
1347
|
+
save_old_buffer
|
1309
1348
|
pre = @buffer_of_lines[@line_index].byteslice(0, @byte_pointer)
|
1310
1349
|
post = @buffer_of_lines[@line_index].byteslice(@byte_pointer..)
|
1311
1350
|
lines = (pre + text.gsub(/\r\n?/, "\n") + post).split("\n", -1)
|
@@ -1313,6 +1352,7 @@ class Reline::LineEditor
|
|
1313
1352
|
@buffer_of_lines[@line_index, 1] = lines
|
1314
1353
|
@line_index += lines.size - 1
|
1315
1354
|
@byte_pointer = @buffer_of_lines[@line_index].bytesize - post.bytesize
|
1355
|
+
push_past_lines
|
1316
1356
|
end
|
1317
1357
|
|
1318
1358
|
def insert_text(text)
|
@@ -2487,4 +2527,15 @@ class Reline::LineEditor
|
|
2487
2527
|
private def vi_editing_mode(key)
|
2488
2528
|
@config.editing_mode = :vi_insert
|
2489
2529
|
end
|
2530
|
+
|
2531
|
+
private def undo(_key)
|
2532
|
+
return if @past_lines.empty?
|
2533
|
+
|
2534
|
+
@undoing = true
|
2535
|
+
|
2536
|
+
target_lines, target_cursor_x, target_cursor_y = @past_lines.last
|
2537
|
+
set_current_lines(target_lines, target_cursor_x, target_cursor_y)
|
2538
|
+
|
2539
|
+
@past_lines.pop
|
2540
|
+
end
|
2490
2541
|
end
|
data/lib/reline/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: reline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- aycabta
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-05-
|
11
|
+
date: 2024-05-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: io-console
|