vimamsa 0.1.14 → 0.1.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/custom_example.rb +9 -2
- data/lib/vimamsa/actions.rb +1 -2
- data/lib/vimamsa/buffer.rb +79 -31
- data/lib/vimamsa/buffer_changetext.rb +18 -1
- data/lib/vimamsa/buffer_list.rb +126 -139
- data/lib/vimamsa/buffer_manager.rb +34 -23
- data/lib/vimamsa/clipboard.rb +1 -0
- data/lib/vimamsa/conf.rb +6 -0
- data/lib/vimamsa/constants.rb +0 -10
- data/lib/vimamsa/debug.rb +5 -0
- data/lib/vimamsa/editor.rb +17 -7
- data/lib/vimamsa/file_history.rb +0 -8
- data/lib/vimamsa/file_manager.rb +6 -3
- data/lib/vimamsa/gui.rb +105 -55
- data/lib/vimamsa/gui_dialog.rb +1 -1
- data/lib/vimamsa/gui_menu.rb +7 -1
- data/lib/vimamsa/gui_sourceview.rb +58 -18
- data/lib/vimamsa/gui_sourceview_autocomplete.rb +141 -0
- data/lib/vimamsa/gui_text.rb +32 -2
- data/lib/vimamsa/hyper_plain_text.rb +11 -0
- data/lib/vimamsa/key_actions.rb +29 -10
- data/lib/vimamsa/key_binding_tree.rb +84 -14
- data/lib/vimamsa/key_bindings_vimlike.rb +44 -23
- data/lib/vimamsa/langservp.rb +23 -3
- data/lib/vimamsa/main.rb +4 -0
- data/lib/vimamsa/rbvma.rb +2 -0
- data/lib/vimamsa/search_replace.rb +35 -27
- data/lib/vimamsa/terminal.rb +12 -0
- data/lib/vimamsa/util.rb +40 -2
- data/lib/vimamsa/version.rb +1 -1
- data/vimamsa.gemspec +3 -2
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4603a715f3fd3b549cc38a9744d93617b3a87ba3d95268f77ed2c98c2c04643d
|
4
|
+
data.tar.gz: 26e82f3a6564a78dcd7188a69037f97bae3fb53c43be807560facfab8e70dd51
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f05aad90407dfdd0e9c310f08f5e79274a5901f714d63e353e7291f25c7f4dba3d402163f338cebf01fef4f8fae07522f85a58d62e76086661007f24b14a0bd
|
7
|
+
data.tar.gz: f503976439de2a311778b48a427354fc21a1b42434eb6a0bcfa5e3c00144fc3508abe029a058249c2b433e9f41f983679f44927ae095b1ec4a4eb36fafdbfe93
|
data/custom_example.rb
CHANGED
@@ -16,8 +16,15 @@
|
|
16
16
|
# setcnf :startup_file, "~/Documents/startup.txt"
|
17
17
|
|
18
18
|
# To enable LSP:
|
19
|
-
#
|
20
|
-
#
|
19
|
+
# cnf.lsp.enabled = true
|
20
|
+
# cnf.lsp.server.solargraph = { name: "solargraph", command: "solargraph stdio", type: "stdio" }
|
21
|
+
# cnf.lsp.server.solargraph.languages = ["ruby"]
|
22
|
+
|
23
|
+
# cnf.lsp.server.clangd = { name: "clangd", command: "clangd-12 --offset-encoding=utf-8", type: "stdio" }
|
24
|
+
# cnf.lsp.server.clangd.languages = ["c", "cpp"]
|
25
|
+
|
26
|
+
|
27
|
+
|
21
28
|
|
22
29
|
|
23
30
|
def insert_date()
|
data/lib/vimamsa/actions.rb
CHANGED
@@ -121,9 +121,8 @@ def search_actions_select_callback(search_str, idx)
|
|
121
121
|
end
|
122
122
|
|
123
123
|
def filter_items(item_list, item_key, search_str)
|
124
|
-
# Ripl.start :binding => binding
|
125
124
|
item_hash = {}
|
126
|
-
|
125
|
+
# debug item_list.inspect
|
127
126
|
scores = Parallel.map(item_list, in_threads: 8) do |item|
|
128
127
|
if item[:str].class != String
|
129
128
|
puts item.inspect
|
data/lib/vimamsa/buffer.rb
CHANGED
@@ -12,7 +12,7 @@ $update_highlight = false
|
|
12
12
|
$ifuncon = false
|
13
13
|
|
14
14
|
class Buffer < String
|
15
|
-
attr_reader :pos, :lpos, :cpos, :deltas, :edit_history, :fname, :call_func, :pathname, :basename, :dirname, :update_highlight, :marks, :is_highlighted, :syntax_detect_failed, :id, :lang, :images, :last_save
|
15
|
+
attr_reader :pos, :lpos, :cpos, :deltas, :edit_history, :fname, :call_func, :pathname, :basename, :dirname, :update_highlight, :marks, :is_highlighted, :syntax_detect_failed, :id, :lang, :images, :last_save, :access_time
|
16
16
|
attr_writer :call_func, :update_highlight
|
17
17
|
attr_accessor :gui_update_highlight, :update_hl_startpos, :update_hl_endpos, :hl_queue, :syntax_parser, :highlights, :gui_reset_highlight, :is_parsing_syntax, :line_ends, :bt, :line_action_handler, :module, :active_kbd_mode, :title, :subtitle, :paste_lines, :mode_stack, :default_mode
|
18
18
|
|
@@ -22,14 +22,15 @@ class Buffer < String
|
|
22
22
|
debug "Buffer.rb: def initialize"
|
23
23
|
super(str)
|
24
24
|
|
25
|
+
update_access_time
|
25
26
|
@images = []
|
26
27
|
@audiofiles = []
|
27
28
|
@lang = nil
|
28
29
|
@id = @@num_buffers
|
29
30
|
@@num_buffers += 1
|
30
31
|
@version = 0
|
31
|
-
@
|
32
|
-
@
|
32
|
+
@default_mode = vma.kbd.default_mode
|
33
|
+
@mode_stack = [@default_mode]
|
33
34
|
gui_create_buffer(@id, self)
|
34
35
|
debug "NEW BUFFER fn=#{fname} ID:#{@id}"
|
35
36
|
|
@@ -76,7 +77,7 @@ class Buffer < String
|
|
76
77
|
self << "\n" if self[-1] != "\n"
|
77
78
|
@current_word = nil
|
78
79
|
@active_kbd_mode = nil
|
79
|
-
if
|
80
|
+
if cnf.lsp.enabled?
|
80
81
|
init_lsp
|
81
82
|
end
|
82
83
|
return self
|
@@ -91,14 +92,34 @@ class Buffer < String
|
|
91
92
|
return x
|
92
93
|
end
|
93
94
|
|
95
|
+
#Check if this buffer is attached to any windows
|
96
|
+
def is_active?
|
97
|
+
for k in vma.gui.windows.keys
|
98
|
+
next if vma.gui.windows[k][:sw].child.nil?
|
99
|
+
return true if vma.gui.windows[k][:sw].child.bufo == self
|
100
|
+
end
|
101
|
+
return false
|
102
|
+
end
|
103
|
+
|
104
|
+
def update_access_time
|
105
|
+
@access_time = Time.now
|
106
|
+
end
|
107
|
+
|
108
|
+
# This function is to be called whenever keyboard events start affecting this buffer
|
109
|
+
# e.g. switching between buffers, opening a new (this) file
|
94
110
|
def set_active
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
111
|
+
debug "def set_active", 2
|
112
|
+
if vma.kbd.get_scope != :editor
|
113
|
+
# If current keyboard mode is not an editor wide mode spanning multiple buffers(e.g. browsing)
|
114
|
+
restore_kbd_mode
|
99
115
|
end
|
100
116
|
end
|
101
117
|
|
118
|
+
# Restore the previous keyboard mode specific to this buffer
|
119
|
+
def restore_kbd_mode
|
120
|
+
vma.kbd.set_mode_stack(@mode_stack.clone)
|
121
|
+
end
|
122
|
+
|
102
123
|
def set_executable
|
103
124
|
if File.exist?(@fname)
|
104
125
|
FileUtils.chmod("+x", @fname)
|
@@ -114,6 +135,7 @@ class Buffer < String
|
|
114
135
|
end
|
115
136
|
|
116
137
|
def lsp_jump_to_def()
|
138
|
+
message("LSP not activated") if @lsp.nil?
|
117
139
|
if !@lsp.nil?
|
118
140
|
fpuri = URI.join("file:///", @fname).to_s
|
119
141
|
r = @lsp.get_definition(fpuri, @lpos, @cpos)
|
@@ -124,8 +146,9 @@ class Buffer < String
|
|
124
146
|
end
|
125
147
|
|
126
148
|
def init_lsp()
|
127
|
-
if
|
128
|
-
@lsp = LangSrv.get(@lang
|
149
|
+
if cnf.lsp.enabled?
|
150
|
+
@lsp = LangSrv.get(@lang)
|
151
|
+
|
129
152
|
if @lang == "php"
|
130
153
|
# Ripl.start :binding => binding
|
131
154
|
end
|
@@ -157,7 +180,7 @@ class Buffer < String
|
|
157
180
|
debug "Guessed LANG: #{lang.id}"
|
158
181
|
@lang = lang.id
|
159
182
|
end
|
160
|
-
|
183
|
+
debug @lang.inspect
|
161
184
|
|
162
185
|
if @lang
|
163
186
|
gui_set_file_lang(@id, @lang)
|
@@ -224,6 +247,11 @@ class Buffer < String
|
|
224
247
|
return false
|
225
248
|
end
|
226
249
|
|
250
|
+
def scan_all_words
|
251
|
+
words = self.scan(/\b\w+\b/).uniq
|
252
|
+
return words
|
253
|
+
end
|
254
|
+
|
227
255
|
def add_image(imgpath, pos)
|
228
256
|
return if !is_legal_pos(pos)
|
229
257
|
|
@@ -350,6 +378,8 @@ class Buffer < String
|
|
350
378
|
|
351
379
|
self.replace(str)
|
352
380
|
@line_ends = scan_indexes(self, /\n/)
|
381
|
+
words = scan_all_words
|
382
|
+
Autocomplete.add_words(words)
|
353
383
|
|
354
384
|
if cnf.btree.experimental?
|
355
385
|
@bt = BufferTree.new(self)
|
@@ -515,7 +545,6 @@ class Buffer < String
|
|
515
545
|
end
|
516
546
|
end
|
517
547
|
|
518
|
-
|
519
548
|
def undo()
|
520
549
|
debug @edit_history.inspect
|
521
550
|
return if !@edit_history.any?
|
@@ -677,11 +706,6 @@ class Buffer < String
|
|
677
706
|
end
|
678
707
|
end
|
679
708
|
|
680
|
-
def replace_range(range, text)
|
681
|
-
delete_range(range.first, range.last)
|
682
|
-
insert_txt_at(text, range.begin)
|
683
|
-
end
|
684
|
-
|
685
709
|
def current_line_range()
|
686
710
|
range = line_range(@lpos, 1)
|
687
711
|
return range
|
@@ -792,7 +816,7 @@ class Buffer < String
|
|
792
816
|
@line_ends.sort!
|
793
817
|
end
|
794
818
|
end
|
795
|
-
|
819
|
+
|
796
820
|
# Ranges to use in delete or copy operations
|
797
821
|
def get_range(range_id, mark: nil)
|
798
822
|
range = nil
|
@@ -1036,15 +1060,28 @@ class Buffer < String
|
|
1036
1060
|
end
|
1037
1061
|
end
|
1038
1062
|
|
1039
|
-
def
|
1040
|
-
|
1041
|
-
|
1063
|
+
def get_word_in_pos(p, boundary: :space)
|
1064
|
+
maxws = 200 # max word size
|
1065
|
+
if boundary == :space
|
1066
|
+
wem = scan_marks(p, p + maxws, /(?<=\S)\s/, -1)
|
1067
|
+
wsm = scan_marks(p - maxws, p, /((?<=\s)\S)|^\S/)
|
1068
|
+
word_start = wsm[-1]
|
1069
|
+
word_end = wem[0]
|
1070
|
+
elsif boundary == :word
|
1071
|
+
wsm = scan_marks(p - maxws, p, /\b\w/)
|
1072
|
+
word_start = wsm[-1]
|
1073
|
+
word_end = p
|
1074
|
+
end
|
1042
1075
|
|
1043
|
-
word_start =
|
1044
|
-
word_end =
|
1045
|
-
word_start = pos if word_start == nil
|
1046
|
-
word_end = pos if word_end == nil
|
1076
|
+
word_start = p if word_start == nil
|
1077
|
+
word_end = p if word_end == nil
|
1047
1078
|
word = self[word_start..word_end]
|
1079
|
+
|
1080
|
+
return [word, (word_start..word_end)]
|
1081
|
+
end
|
1082
|
+
|
1083
|
+
def get_cur_nonwhitespace_word()
|
1084
|
+
(word, range) = get_word_in_pos(@pos, boundary: :space)
|
1048
1085
|
debug "'WORD: #{word}'"
|
1049
1086
|
# message("Open link #{word}")
|
1050
1087
|
linep = get_file_line_pointer(word)
|
@@ -1097,7 +1134,6 @@ class Buffer < String
|
|
1097
1134
|
end
|
1098
1135
|
end
|
1099
1136
|
|
1100
|
-
|
1101
1137
|
def replace_with_char(char)
|
1102
1138
|
debug "self_pos:'#{self[@pos]}'"
|
1103
1139
|
return if self[@pos] == "\n"
|
@@ -1228,6 +1264,13 @@ class Buffer < String
|
|
1228
1264
|
$kbd.set_mode(:visual)
|
1229
1265
|
end
|
1230
1266
|
|
1267
|
+
def start_selection()
|
1268
|
+
@visual_mode = true
|
1269
|
+
@selection_start = @pos
|
1270
|
+
$kbd.set_mode(:visual)
|
1271
|
+
#TODO: implement without setting kbd mode
|
1272
|
+
end
|
1273
|
+
|
1231
1274
|
def copy_active_selection(x = nil)
|
1232
1275
|
debug "!COPY SELECTION"
|
1233
1276
|
@paste_lines = false
|
@@ -1330,10 +1373,14 @@ class Buffer < String
|
|
1330
1373
|
end
|
1331
1374
|
|
1332
1375
|
def end_visual_mode()
|
1333
|
-
|
1376
|
+
debug "end_visual_mode, #{vma.kbd.get_mode}, #{visual_mode?}", 2
|
1377
|
+
return if vma.kbd.get_mode != :visual
|
1378
|
+
if !visual_mode?
|
1379
|
+
debug "end_visual_mode, !visual_mode?"
|
1380
|
+
# TODO: should not happen
|
1381
|
+
end
|
1334
1382
|
debug "End visual mode"
|
1335
|
-
|
1336
|
-
$kbd.set_mode(:command)
|
1383
|
+
vma.kbd.to_previous_mode
|
1337
1384
|
@visual_mode = false
|
1338
1385
|
return true
|
1339
1386
|
end
|
@@ -1462,7 +1509,7 @@ class Buffer < String
|
|
1462
1509
|
#TODO: show message box
|
1463
1510
|
end
|
1464
1511
|
@last_save = Time.now
|
1465
|
-
|
1512
|
+
debug "file saved on #{@last_save}"
|
1466
1513
|
sleep 3
|
1467
1514
|
}
|
1468
1515
|
end
|
@@ -1501,13 +1548,14 @@ class Buffer < String
|
|
1501
1548
|
end
|
1502
1549
|
|
1503
1550
|
def save()
|
1504
|
-
check_if_modified_outside
|
1551
|
+
check_if_modified_outside #TODO
|
1505
1552
|
if !@fname
|
1506
1553
|
save_as()
|
1507
1554
|
return
|
1508
1555
|
end
|
1509
1556
|
message("Saving file #{@fname}")
|
1510
1557
|
write_contents_to_file(@fname)
|
1558
|
+
hook.call(:file_saved, self)
|
1511
1559
|
end
|
1512
1560
|
|
1513
1561
|
def close()
|
@@ -135,10 +135,26 @@ class Buffer < String
|
|
135
135
|
return true
|
136
136
|
end
|
137
137
|
|
138
|
+
def complete_current_word(rep)
|
139
|
+
debug "complete_current_word", 2
|
140
|
+
p = @pos - 1
|
141
|
+
return if !is_legal_pos(p)
|
142
|
+
(word, range) = get_word_in_pos(p, boundary: :word)
|
143
|
+
debug [word, range].to_s, 2
|
144
|
+
endpos = range.begin+rep.size
|
145
|
+
replace_range(range, rep)
|
146
|
+
set_pos(endpos)
|
147
|
+
end
|
148
|
+
|
149
|
+
def replace_range(range, text)
|
150
|
+
delete_range(range.first, range.last)
|
151
|
+
insert_txt_at(text, range.begin)
|
152
|
+
end
|
153
|
+
|
138
154
|
def delete2(range_id, mark = nil)
|
139
155
|
@paste_lines = false
|
140
156
|
range = get_range(range_id, mark: mark)
|
141
|
-
return if range == nil
|
157
|
+
return false if range == nil
|
142
158
|
debug "RANGE"
|
143
159
|
debug range.inspect
|
144
160
|
debug range.inspect
|
@@ -146,6 +162,7 @@ class Buffer < String
|
|
146
162
|
delete_range(range.first, range.last)
|
147
163
|
pos = [range.first, @pos].min
|
148
164
|
set_pos(pos)
|
165
|
+
return true
|
149
166
|
end
|
150
167
|
|
151
168
|
def delete(op, x = nil)
|