vimamsa 0.1.14 → 0.1.15
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 +11 -13
- 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 +5 -1
- data/lib/vimamsa/gui_sourceview.rb +38 -17
- 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 +31 -21
- 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 +11 -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: ea3e4fa5b65895cba0a20cae08fad4f422008e786f4cd3ab405d39bf630f52db
|
4
|
+
data.tar.gz: 65b80bb0e663f64d241e51130aac9e13106c58ff20f698c095e5cf43b416ce41
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c056fa3ed552a410b7a9f06ebfb0f2eb1444feba9a5810a520e8012a245b83bd156115566d2965095e8d7bacc184883e1bb16e724efa26c9abd0180c2640050
|
7
|
+
data.tar.gz: 9196b537289ac4a08b09c53dbbdf03ccd5bec1cb50d3de4b40a03352cf64c0fc0776d489803a421d00d72bad72fd96cefc45865f27d1df5f22b67b9906c4edf9
|
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,33 @@ 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
|
+
return true if vma.gui.windows[k][:sw].child.bufo == self
|
99
|
+
end
|
100
|
+
return false
|
101
|
+
end
|
102
|
+
|
103
|
+
def update_access_time
|
104
|
+
@access_time = Time.now
|
105
|
+
end
|
106
|
+
|
107
|
+
# This function is to be called whenever keyboard events start affecting this buffer
|
108
|
+
# e.g. switching between buffers, opening a new (this) file
|
94
109
|
def set_active
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
110
|
+
debug "def set_active", 2
|
111
|
+
if vma.kbd.get_scope != :editor
|
112
|
+
# If current keyboard mode is not an editor wide mode spanning multiple buffers(e.g. browsing)
|
113
|
+
restore_kbd_mode
|
99
114
|
end
|
100
115
|
end
|
101
116
|
|
117
|
+
# Restore the previous keyboard mode specific to this buffer
|
118
|
+
def restore_kbd_mode
|
119
|
+
vma.kbd.set_mode_stack(@mode_stack.clone)
|
120
|
+
end
|
121
|
+
|
102
122
|
def set_executable
|
103
123
|
if File.exist?(@fname)
|
104
124
|
FileUtils.chmod("+x", @fname)
|
@@ -114,6 +134,7 @@ class Buffer < String
|
|
114
134
|
end
|
115
135
|
|
116
136
|
def lsp_jump_to_def()
|
137
|
+
message("LSP not activated") if @lsp.nil?
|
117
138
|
if !@lsp.nil?
|
118
139
|
fpuri = URI.join("file:///", @fname).to_s
|
119
140
|
r = @lsp.get_definition(fpuri, @lpos, @cpos)
|
@@ -124,8 +145,9 @@ class Buffer < String
|
|
124
145
|
end
|
125
146
|
|
126
147
|
def init_lsp()
|
127
|
-
if
|
128
|
-
@lsp = LangSrv.get(@lang
|
148
|
+
if cnf.lsp.enabled?
|
149
|
+
@lsp = LangSrv.get(@lang)
|
150
|
+
|
129
151
|
if @lang == "php"
|
130
152
|
# Ripl.start :binding => binding
|
131
153
|
end
|
@@ -157,7 +179,7 @@ class Buffer < String
|
|
157
179
|
debug "Guessed LANG: #{lang.id}"
|
158
180
|
@lang = lang.id
|
159
181
|
end
|
160
|
-
|
182
|
+
debug @lang.inspect
|
161
183
|
|
162
184
|
if @lang
|
163
185
|
gui_set_file_lang(@id, @lang)
|
@@ -224,6 +246,11 @@ class Buffer < String
|
|
224
246
|
return false
|
225
247
|
end
|
226
248
|
|
249
|
+
def scan_all_words
|
250
|
+
words = self.scan(/\b\w+\b/).uniq
|
251
|
+
return words
|
252
|
+
end
|
253
|
+
|
227
254
|
def add_image(imgpath, pos)
|
228
255
|
return if !is_legal_pos(pos)
|
229
256
|
|
@@ -350,6 +377,8 @@ class Buffer < String
|
|
350
377
|
|
351
378
|
self.replace(str)
|
352
379
|
@line_ends = scan_indexes(self, /\n/)
|
380
|
+
words = scan_all_words
|
381
|
+
Autocomplete.add_words(words)
|
353
382
|
|
354
383
|
if cnf.btree.experimental?
|
355
384
|
@bt = BufferTree.new(self)
|
@@ -515,7 +544,6 @@ class Buffer < String
|
|
515
544
|
end
|
516
545
|
end
|
517
546
|
|
518
|
-
|
519
547
|
def undo()
|
520
548
|
debug @edit_history.inspect
|
521
549
|
return if !@edit_history.any?
|
@@ -677,11 +705,6 @@ class Buffer < String
|
|
677
705
|
end
|
678
706
|
end
|
679
707
|
|
680
|
-
def replace_range(range, text)
|
681
|
-
delete_range(range.first, range.last)
|
682
|
-
insert_txt_at(text, range.begin)
|
683
|
-
end
|
684
|
-
|
685
708
|
def current_line_range()
|
686
709
|
range = line_range(@lpos, 1)
|
687
710
|
return range
|
@@ -792,7 +815,7 @@ class Buffer < String
|
|
792
815
|
@line_ends.sort!
|
793
816
|
end
|
794
817
|
end
|
795
|
-
|
818
|
+
|
796
819
|
# Ranges to use in delete or copy operations
|
797
820
|
def get_range(range_id, mark: nil)
|
798
821
|
range = nil
|
@@ -1036,15 +1059,28 @@ class Buffer < String
|
|
1036
1059
|
end
|
1037
1060
|
end
|
1038
1061
|
|
1039
|
-
def
|
1040
|
-
|
1041
|
-
|
1062
|
+
def get_word_in_pos(p, boundary: :space)
|
1063
|
+
maxws = 200 # max word size
|
1064
|
+
if boundary == :space
|
1065
|
+
wem = scan_marks(p, p + maxws, /(?<=\S)\s/, -1)
|
1066
|
+
wsm = scan_marks(p - maxws, p, /((?<=\s)\S)|^\S/)
|
1067
|
+
word_start = wsm[-1]
|
1068
|
+
word_end = wem[0]
|
1069
|
+
elsif boundary == :word
|
1070
|
+
wsm = scan_marks(p - maxws, p, /\b\w/)
|
1071
|
+
word_start = wsm[-1]
|
1072
|
+
word_end = p
|
1073
|
+
end
|
1042
1074
|
|
1043
|
-
word_start =
|
1044
|
-
word_end =
|
1045
|
-
word_start = pos if word_start == nil
|
1046
|
-
word_end = pos if word_end == nil
|
1075
|
+
word_start = p if word_start == nil
|
1076
|
+
word_end = p if word_end == nil
|
1047
1077
|
word = self[word_start..word_end]
|
1078
|
+
|
1079
|
+
return [word, (word_start..word_end)]
|
1080
|
+
end
|
1081
|
+
|
1082
|
+
def get_cur_nonwhitespace_word()
|
1083
|
+
(word, range) = get_word_in_pos(@pos, boundary: :space)
|
1048
1084
|
debug "'WORD: #{word}'"
|
1049
1085
|
# message("Open link #{word}")
|
1050
1086
|
linep = get_file_line_pointer(word)
|
@@ -1097,7 +1133,6 @@ class Buffer < String
|
|
1097
1133
|
end
|
1098
1134
|
end
|
1099
1135
|
|
1100
|
-
|
1101
1136
|
def replace_with_char(char)
|
1102
1137
|
debug "self_pos:'#{self[@pos]}'"
|
1103
1138
|
return if self[@pos] == "\n"
|
@@ -1228,6 +1263,13 @@ class Buffer < String
|
|
1228
1263
|
$kbd.set_mode(:visual)
|
1229
1264
|
end
|
1230
1265
|
|
1266
|
+
def start_selection()
|
1267
|
+
@visual_mode = true
|
1268
|
+
@selection_start = @pos
|
1269
|
+
$kbd.set_mode(:visual)
|
1270
|
+
#TODO: implement without setting kbd mode
|
1271
|
+
end
|
1272
|
+
|
1231
1273
|
def copy_active_selection(x = nil)
|
1232
1274
|
debug "!COPY SELECTION"
|
1233
1275
|
@paste_lines = false
|
@@ -1330,10 +1372,15 @@ class Buffer < String
|
|
1330
1372
|
end
|
1331
1373
|
|
1332
1374
|
def end_visual_mode()
|
1333
|
-
|
1375
|
+
debug "end_visual_mode, #{vma.kbd.get_mode}, #{visual_mode?}", 2
|
1376
|
+
vma.kbd.dump_state
|
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)
|