vimamsa 0.1.14 → 0.1.16
Sign up to get free protection for your applications and to get access to all the features.
- 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)
|