vimamsa 0.1.5 → 0.1.8
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/exe/vimamsa +4 -2
- data/lib/vimamsa/ack.rb +0 -4
- data/lib/vimamsa/actions.rb +26 -38
- data/lib/vimamsa/buffer.rb +117 -60
- data/lib/vimamsa/buffer_list.rb +27 -3
- data/lib/vimamsa/buffer_manager.rb +83 -0
- data/lib/vimamsa/conf.rb +21 -0
- data/lib/vimamsa/debug.rb +9 -8
- data/lib/vimamsa/easy_jump.rb +129 -125
- data/lib/vimamsa/editor.rb +66 -48
- data/lib/vimamsa/file_finder.rb +7 -8
- data/lib/vimamsa/file_history.rb +15 -8
- data/lib/vimamsa/file_manager.rb +9 -8
- data/lib/vimamsa/gui.rb +560 -0
- data/lib/vimamsa/gui_menu.rb +110 -0
- data/lib/vimamsa/gui_select_window.rb +177 -0
- data/lib/vimamsa/gui_sourceview.rb +294 -0
- data/lib/vimamsa/hyper_plain_text.rb +8 -10
- data/lib/vimamsa/{default_key_bindings.rb → key_actions.rb} +71 -190
- data/lib/vimamsa/key_binding_tree.rb +48 -36
- data/lib/vimamsa/key_bindings_vimlike.rb +260 -0
- data/lib/vimamsa/macro.rb +6 -6
- data/lib/vimamsa/main.rb +1 -2
- data/lib/vimamsa/rbvma.rb +25 -1031
- data/lib/vimamsa/search.rb +1 -5
- data/lib/vimamsa/search_replace.rb +4 -6
- data/lib/vimamsa/version.rb +1 -1
- data/vimamsa.gemspec +1 -1
- metadata +12 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6000318b31060bff83029148c2cf47cc6ff8c5939d2fc1d54951a54e8b49a538
|
4
|
+
data.tar.gz: 500cd81fe9bd605276a0802f182980c5a93d77ab5d2221548586673e85a85832
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b687b1b72df46bd9bc35622b239e9525e2dc15884f1066557e82c474e99c280577a32a3a7f60a776f5b6be0866dc86c79e2b364780413821a491160ad73875f
|
7
|
+
data.tar.gz: d5e8da0e6263f74f27ee84781efdea5126411a68ace27d244da6c5b9203924196d10bbe91541319af91539089c6391dfadfde3f76cbac6f475b2002c1fbaa16c
|
data/exe/vimamsa
CHANGED
@@ -16,7 +16,9 @@ listen_dir = File.expand_path("~/.vimamsa/listen")
|
|
16
16
|
if File.exist?(listen_dir) and !ARGV[0].nil?
|
17
17
|
tmpf = Tempfile.new("vmarun", listen_dir)
|
18
18
|
fp = tmpf.path
|
19
|
-
|
19
|
+
paramfn = File.expand_path(ARGV[0])
|
20
|
+
puts paramfn
|
21
|
+
tmpf.write(paramfn)
|
20
22
|
tmpf.close
|
21
23
|
tstart = Time.new
|
22
24
|
timeout = false
|
@@ -36,5 +38,5 @@ $LOAD_PATH.unshift(File.expand_path("ext"))
|
|
36
38
|
require "vimamsa"
|
37
39
|
# Ilib:ext
|
38
40
|
# r rbvma -e "puts VMA.new.run"
|
39
|
-
$vmag =
|
41
|
+
$vmag = VMAgui.new()
|
40
42
|
$vmag.run
|
data/lib/vimamsa/ack.rb
CHANGED
data/lib/vimamsa/actions.rb
CHANGED
@@ -1,73 +1,62 @@
|
|
1
1
|
class Action
|
2
|
-
attr_accessor :id, :method_name, :method
|
2
|
+
attr_accessor :id, :method_name, :method, :opt
|
3
3
|
|
4
|
-
def initialize(id, method_name, method,
|
4
|
+
def initialize(id, method_name, method, opt = {})
|
5
5
|
@method_name = method_name
|
6
6
|
@id = id
|
7
7
|
@method = method
|
8
|
+
@opt = opt
|
9
|
+
|
8
10
|
$actions[id] = self
|
9
11
|
end
|
10
12
|
end
|
11
13
|
|
12
14
|
$actions = {}
|
13
15
|
|
14
|
-
|
15
|
-
# if callfunc.class == Proc
|
16
|
-
# a = Action.new(id, name, callfunc, scope)
|
17
|
-
# else
|
18
|
-
# a = Action.new(id, name, method(callfunc), scope)
|
19
|
-
# end
|
20
|
-
# end
|
21
|
-
|
22
|
-
def reg_act(id, callfunc, name = "", scope = [])
|
16
|
+
def reg_act(id, callfunc, name = "", opt = {})
|
23
17
|
if callfunc.class == Proc
|
24
|
-
a = Action.new(id, name, callfunc,
|
18
|
+
a = Action.new(id, name, callfunc, opt)
|
25
19
|
else
|
26
20
|
begin
|
27
21
|
m = method(callfunc)
|
28
22
|
rescue NameError
|
29
23
|
m = method("missing_callfunc")
|
30
24
|
end
|
31
|
-
a = Action.new(id, name, m,
|
25
|
+
a = Action.new(id, name, m, opt)
|
32
26
|
end
|
27
|
+
return a
|
33
28
|
end
|
34
29
|
|
35
30
|
def missing_callfunc
|
36
|
-
|
31
|
+
debug "missing_callfunc"
|
37
32
|
end
|
38
33
|
|
39
|
-
|
34
|
+
#TODO: remove
|
40
35
|
def call(id)
|
36
|
+
call_action(id)
|
37
|
+
end
|
38
|
+
|
39
|
+
def call_action(id)
|
41
40
|
a = $actions[id]
|
42
41
|
if a
|
43
|
-
# Ripl.start :binding => binding
|
44
42
|
a.method.call()
|
43
|
+
else
|
44
|
+
message("Unknown action: " + id.inspect)
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
48
|
def search_actions()
|
49
49
|
l = []
|
50
50
|
$select_keys = ["h", "l", "f", "d", "s", "a", "g", "z"]
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
gui_select_update_window(l, $select_keys.collect { |x| x.upcase },
|
52
|
+
"search_actions_select_callback",
|
53
|
+
"search_actions_update_callback")
|
54
54
|
end
|
55
55
|
|
56
56
|
$item_list = []
|
57
57
|
|
58
58
|
def search_actions_update_callback(search_str = "")
|
59
|
-
# item_list = $actions.collect {|x| x[1].id.to_s}
|
60
59
|
return [] if search_str == ""
|
61
|
-
# item_list = $action_list.collect { |x|
|
62
|
-
# actname = x[:action].to_s
|
63
|
-
# if x[:action].class == Symbol
|
64
|
-
# mn = $actions[x[:action]].method_name
|
65
|
-
# actname = mn if mn.size > 0
|
66
|
-
# end
|
67
|
-
# r = { :str => actname, :key => x[:key], :action => x[:action] }
|
68
|
-
# }
|
69
|
-
|
70
|
-
# => {:str=>"insert_new_line", :key=>"I return", :action=>:insert_new_line}
|
71
60
|
|
72
61
|
item_list2 = []
|
73
62
|
for act_id in $actions.keys
|
@@ -81,16 +70,15 @@ def search_actions_update_callback(search_str = "")
|
|
81
70
|
end
|
82
71
|
item_list2 << item
|
83
72
|
end
|
84
|
-
|
73
|
+
|
85
74
|
item_list = item_list2
|
86
75
|
|
87
76
|
a = filter_items(item_list, 0, search_str)
|
88
|
-
|
77
|
+
debug a.inspect
|
89
78
|
|
90
79
|
r = a.collect { |x| [x[0][0], 0, x] }
|
91
|
-
|
80
|
+
debug r.inspect
|
92
81
|
$item_list = r
|
93
|
-
# Ripl.start :binding => binding
|
94
82
|
|
95
83
|
r = a.collect { |x| ["[#{x[0][:key]}] #{x[0][:str]}", 0, x] }
|
96
84
|
return r
|
@@ -100,13 +88,13 @@ def search_actions_select_callback(search_str, idx)
|
|
100
88
|
item = $item_list[idx][2]
|
101
89
|
acc = item[0][:action]
|
102
90
|
|
103
|
-
|
104
|
-
|
91
|
+
debug "Selected:" + acc.to_s
|
92
|
+
gui_select_window_close(0)
|
105
93
|
|
106
94
|
if acc.class == String
|
107
95
|
eval(acc)
|
108
96
|
elsif acc.class == Symbol
|
109
|
-
|
97
|
+
debug "Symbol"
|
110
98
|
call(acc)
|
111
99
|
end
|
112
100
|
end
|
@@ -118,7 +106,7 @@ def filter_items(item_list, item_key, search_str)
|
|
118
106
|
[item, srn_dst(search_str, item[:str])]
|
119
107
|
end
|
120
108
|
scores.sort_by! { |x| -x[1] }
|
121
|
-
|
109
|
+
debug scores.inspect
|
122
110
|
scores = scores[0..30]
|
123
111
|
|
124
112
|
return scores
|
data/lib/vimamsa/buffer.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "digest"
|
2
2
|
require "tempfile"
|
3
|
+
require "fileutils"
|
3
4
|
require "pathname"
|
4
5
|
require "openssl"
|
5
6
|
require "ripl/multi_line"
|
@@ -15,7 +16,7 @@ class Buffer < String
|
|
15
16
|
|
16
17
|
attr_reader :pos, :lpos, :cpos, :deltas, :edit_history, :fname, :call_func, :pathname, :basename, :update_highlight, :marks, :is_highlighted, :syntax_detect_failed, :id, :lang
|
17
18
|
attr_writer :call_func, :update_highlight
|
18
|
-
attr_accessor :
|
19
|
+
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
|
19
20
|
|
20
21
|
@@num_buffers = 0
|
21
22
|
|
@@ -26,8 +27,8 @@ class Buffer < String
|
|
26
27
|
@lang = nil
|
27
28
|
@id = @@num_buffers
|
28
29
|
@@num_buffers += 1
|
29
|
-
|
30
|
-
|
30
|
+
gui_create_buffer(@id)
|
31
|
+
debug "NEW BUFFER fn=#{fname} ID:#{@id}"
|
31
32
|
|
32
33
|
@module = nil
|
33
34
|
|
@@ -58,7 +59,7 @@ class Buffer < String
|
|
58
59
|
end
|
59
60
|
|
60
61
|
t1 = Time.now
|
61
|
-
|
62
|
+
gui_set_current_buffer(@id)
|
62
63
|
gui_set_window_title(@title, @subtitle)
|
63
64
|
|
64
65
|
set_content(str)
|
@@ -70,13 +71,29 @@ class Buffer < String
|
|
70
71
|
@active_kbd_mode = nil
|
71
72
|
end
|
72
73
|
|
74
|
+
def list_str()
|
75
|
+
if @fname.nil?
|
76
|
+
x = @title
|
77
|
+
else
|
78
|
+
x = @fname
|
79
|
+
end
|
80
|
+
return x
|
81
|
+
end
|
82
|
+
|
73
83
|
def set_active
|
74
84
|
if !@active_kbd_mode.nil?
|
75
85
|
$kbd.set_mode(@active_kbd_mode)
|
76
86
|
else
|
77
87
|
$kbd.set_mode_to_default
|
78
88
|
end
|
79
|
-
#
|
89
|
+
# gui_set_current_buffer(@id)
|
90
|
+
end
|
91
|
+
|
92
|
+
def set_executable
|
93
|
+
if File.exists?(@fname)
|
94
|
+
FileUtils.chmod("+x", @fname)
|
95
|
+
message("Set executable: #{@fname}")
|
96
|
+
end
|
80
97
|
end
|
81
98
|
|
82
99
|
def detect_file_language
|
@@ -96,7 +113,7 @@ class Buffer < String
|
|
96
113
|
# lang.get_metadata("block-comment-end")
|
97
114
|
@lang_nfo = lang
|
98
115
|
if !lang.nil? and !lang.id.nil?
|
99
|
-
|
116
|
+
debug "Guessed LANG: #{lang.id}"
|
100
117
|
@lang = lang.id
|
101
118
|
end
|
102
119
|
|
@@ -105,11 +122,32 @@ class Buffer < String
|
|
105
122
|
end
|
106
123
|
end
|
107
124
|
|
125
|
+
def view()
|
126
|
+
# Get the VSourceView < GtkSource::View object corresponding to this buffer
|
127
|
+
return vma.gui.buffers[@id]
|
128
|
+
end
|
129
|
+
|
108
130
|
def add_image(imgpath, pos)
|
109
131
|
return if !is_legal_pos(pos)
|
110
|
-
|
111
|
-
|
112
|
-
|
132
|
+
|
133
|
+
pixbuf = GdkPixbuf::Pixbuf.new(:file => imgpath)
|
134
|
+
|
135
|
+
# puts GdkPixbuf::InterpType.constants
|
136
|
+
# GdkPixbuf::InterpType::HYPER
|
137
|
+
# https://docs.gtk.org/gdk-pixbuf/enum.InterpType.html#bilinear
|
138
|
+
# https://docs.gtk.org/gdk-pixbuf/method.Pixbuf.scale_simple.html
|
139
|
+
imglimit = view.visible_rect.width - 5
|
140
|
+
if pixbuf.width > imglimit
|
141
|
+
nwidth = imglimit
|
142
|
+
nheight = (pixbuf.height * (imglimit.to_f / pixbuf.width)).to_i
|
143
|
+
pixbuf = pixbuf.scale_simple(nwidth, nheight, GdkPixbuf::InterpType::HYPER)
|
144
|
+
end
|
145
|
+
|
146
|
+
vbuf = view.buffer
|
147
|
+
itr = vbuf.get_iter_at(:offset => pos)
|
148
|
+
itr2 = vbuf.get_iter_at(:offset => pos + 1)
|
149
|
+
vbuf.delete(itr, itr2)
|
150
|
+
vbuf.insert(itr, pixbuf)
|
113
151
|
end
|
114
152
|
|
115
153
|
def is_legal_pos(pos, op = :read)
|
@@ -141,7 +179,6 @@ class Buffer < String
|
|
141
179
|
b = " \n"
|
142
180
|
txt = a + b
|
143
181
|
insert_txt_at(txt, lr.end + 1)
|
144
|
-
qt_process_deltas
|
145
182
|
imgpos = lr.end + 1 + a.size
|
146
183
|
add_image(fname, imgpos)
|
147
184
|
end
|
@@ -191,25 +228,25 @@ class Buffer < String
|
|
191
228
|
ok = true
|
192
229
|
@bt.each_line { |r|
|
193
230
|
if lines[i] != r #or true
|
194
|
-
|
195
|
-
|
196
|
-
#
|
197
|
-
#
|
198
|
-
|
199
|
-
|
200
|
-
|
231
|
+
debug "NO MATCH FOR LINE:"
|
232
|
+
debug "i=#{i}["
|
233
|
+
# debug "[orig]pos=#{leaf.pos} |#{leaf.data}|"
|
234
|
+
# debug "spos=#{spos} nchar=#{leaf.nchar} epos=#{epos} a[]=\nr=|#{r}|"
|
235
|
+
debug "fromtree:|#{r}|"
|
236
|
+
debug "frombuf:|#{lines[i]}"
|
237
|
+
debug "]"
|
201
238
|
ok = false
|
202
239
|
end
|
203
240
|
i += 1
|
204
241
|
}
|
205
242
|
|
206
|
-
|
207
|
-
|
243
|
+
debug "BT: NO ERRORS" if ok
|
244
|
+
debug "BT: ERRORS" if !ok
|
208
245
|
end
|
209
246
|
|
210
247
|
def set_content(str)
|
211
248
|
@encrypted_str = nil
|
212
|
-
@
|
249
|
+
@gui_update_highlight = true
|
213
250
|
@ftype = nil
|
214
251
|
if str[0..10] == "VMACRYPT001"
|
215
252
|
@encrypted_str = str[11..-1]
|
@@ -263,7 +300,7 @@ class Buffer < String
|
|
263
300
|
@update_hl_startpos = 0 #TODO
|
264
301
|
@update_hl_endpos = self.size - 1
|
265
302
|
|
266
|
-
|
303
|
+
gui_set_buffer_contents(@id, self.to_s)
|
267
304
|
|
268
305
|
# add_hl_update(@update_hl_startpos, @update_hl_endpos)
|
269
306
|
end
|
@@ -272,6 +309,12 @@ class Buffer < String
|
|
272
309
|
@fname = filename
|
273
310
|
@pathname = Pathname.new(fname) if @fname
|
274
311
|
@basename = @pathname.basename if @fname
|
312
|
+
|
313
|
+
@title = File.basename(@fname)
|
314
|
+
@dirname = File.dirname(@fname)
|
315
|
+
userhome = File.expand_path("~")
|
316
|
+
@subtitle = @dirname.gsub(/^#{userhome}/, "~")
|
317
|
+
|
275
318
|
detect_file_language
|
276
319
|
end
|
277
320
|
|
@@ -417,11 +460,11 @@ class Buffer < String
|
|
417
460
|
end
|
418
461
|
|
419
462
|
def update_index(pos, changeamount)
|
420
|
-
#
|
463
|
+
# debug "pos #{pos}, changeamount #{changeamount}, @pos #{@pos}"
|
421
464
|
@edit_pos_history.collect! { |x| r = x if x <= pos; r = x + changeamount if x > pos; r }
|
422
465
|
# TODO: handle between removal case
|
423
466
|
for k in @marks.keys
|
424
|
-
#
|
467
|
+
# debug "change(?): pos=#{pos}, k=#{k}, #{@marks[k]}, #{changeamount}"
|
425
468
|
if @marks[k] > pos
|
426
469
|
@marks[k] = @marks[k] + changeamount
|
427
470
|
end
|
@@ -447,7 +490,6 @@ class Buffer < String
|
|
447
490
|
return if @edit_pos_history.empty?
|
448
491
|
@edit_pos_history_i -= 1
|
449
492
|
@edit_pos_history_i = @edit_pos_history.size - 1 if @edit_pos_history_i < 0
|
450
|
-
# Ripl.start :binding => binding
|
451
493
|
debug "@edit_pos_history_i=#{@edit_pos_history_i}"
|
452
494
|
set_pos(@edit_pos_history[-@edit_pos_history_i])
|
453
495
|
center_on_current_line
|
@@ -563,8 +605,7 @@ class Buffer < String
|
|
563
605
|
ls = nil
|
564
606
|
ls = @line_ends[a] if a != nil
|
565
607
|
# if a != nil and ls != @line_ends[a]
|
566
|
-
#
|
567
|
-
# Ripl.start :binding => binding
|
608
|
+
# debug "NO MATCH @line_ends[a]"
|
568
609
|
# end
|
569
610
|
|
570
611
|
if ls == nil
|
@@ -576,7 +617,6 @@ class Buffer < String
|
|
576
617
|
end
|
577
618
|
|
578
619
|
def get_line_end(pos)
|
579
|
-
#Ripl.start :binding => binding
|
580
620
|
return @line_ends.select { |x| x > pos }.min
|
581
621
|
end
|
582
622
|
|
@@ -670,7 +710,7 @@ class Buffer < String
|
|
670
710
|
end
|
671
711
|
|
672
712
|
debug "Scan line_end time: #{Time.now - t1}"
|
673
|
-
#
|
713
|
+
#debug @line_ends
|
674
714
|
end
|
675
715
|
|
676
716
|
def sanity_check_line_ends()
|
@@ -687,7 +727,7 @@ class Buffer < String
|
|
687
727
|
end
|
688
728
|
|
689
729
|
def update_bufpos_on_change(positions, xpos, changeamount)
|
690
|
-
#
|
730
|
+
# debug "xpos=#{xpos} changeamount=#{changeamount}"
|
691
731
|
positions.collect { |x|
|
692
732
|
r = nil
|
693
733
|
r = x if x < xpos
|
@@ -722,7 +762,7 @@ class Buffer < String
|
|
722
762
|
i_nl = scan_indexes(changestr, /\n/)
|
723
763
|
i_nl.collect! { |x| x + pos }
|
724
764
|
end
|
725
|
-
#
|
765
|
+
# debug "change:#{changeamount}"
|
726
766
|
#TODO: this is the bottle neck in insert_txt action
|
727
767
|
@line_ends.collect! { |x|
|
728
768
|
r = nil
|
@@ -752,7 +792,7 @@ class Buffer < String
|
|
752
792
|
elsif new_pos >= 0
|
753
793
|
@pos = new_pos
|
754
794
|
end
|
755
|
-
|
795
|
+
gui_set_cursor_pos(@id, @pos)
|
756
796
|
calculate_line_and_column_pos
|
757
797
|
end
|
758
798
|
|
@@ -870,10 +910,10 @@ class Buffer < String
|
|
870
910
|
range = @pos..wmarks[0]
|
871
911
|
end
|
872
912
|
elsif range_id == :to_line_end
|
873
|
-
|
913
|
+
debug "TO LINE END"
|
874
914
|
range = @pos..(@line_ends[@lpos] - 1)
|
875
915
|
elsif range_id == :to_line_start
|
876
|
-
|
916
|
+
debug "TO LINE START: #{@lpos}"
|
877
917
|
|
878
918
|
if @cpos == 0
|
879
919
|
range = nil
|
@@ -909,15 +949,15 @@ class Buffer < String
|
|
909
949
|
end
|
910
950
|
|
911
951
|
def move(direction)
|
912
|
-
|
952
|
+
debug "cpos:#{@cpos} lpos:#{@lpos} @larger_cpos:#{@larger_cpos}"
|
913
953
|
if direction == :forward_page
|
914
|
-
|
954
|
+
debug "FORWARD PAGE"
|
915
955
|
visible_range = get_visible_area()
|
916
956
|
set_pos(visible_range[1])
|
917
957
|
top_where_cursor()
|
918
958
|
end
|
919
959
|
if direction == :backward_page
|
920
|
-
|
960
|
+
debug "backward PAGE"
|
921
961
|
visible_range = get_visible_area()
|
922
962
|
set_pos(visible_range[0])
|
923
963
|
bottom_where_cursor()
|
@@ -1020,7 +1060,7 @@ class Buffer < String
|
|
1020
1060
|
if wtype == :url
|
1021
1061
|
open_url(word)
|
1022
1062
|
elsif wtype == :linepointer
|
1023
|
-
|
1063
|
+
debug word.inspect
|
1024
1064
|
jump_to_file(word[0], word[1])
|
1025
1065
|
elsif wtype == :textfile
|
1026
1066
|
open_existing_file(word)
|
@@ -1087,10 +1127,10 @@ class Buffer < String
|
|
1087
1127
|
word_start = pos if word_start == nil
|
1088
1128
|
word_end = pos if word_end == nil
|
1089
1129
|
word = self[word_start..word_end]
|
1090
|
-
|
1130
|
+
debug "'WORD: #{word}'"
|
1091
1131
|
message("'#{word}'")
|
1092
1132
|
linep = get_file_line_pointer(word)
|
1093
|
-
|
1133
|
+
debug "linep'#{linep}'"
|
1094
1134
|
path = File.expand_path(word)
|
1095
1135
|
wtype = nil
|
1096
1136
|
if is_url(word)
|
@@ -1103,7 +1143,7 @@ class Buffer < String
|
|
1103
1143
|
wtype = :file
|
1104
1144
|
end
|
1105
1145
|
# elsif hpt_check_cur_word(word) #TODO: check only
|
1106
|
-
#
|
1146
|
+
# debug word
|
1107
1147
|
elsif linep != nil
|
1108
1148
|
wtype = :linepointer
|
1109
1149
|
word = linep
|
@@ -1131,14 +1171,14 @@ class Buffer < String
|
|
1131
1171
|
word_start = pos if word_start == nil
|
1132
1172
|
word_end = pos if word_end == nil
|
1133
1173
|
word = self[word_start..word_end]
|
1134
|
-
|
1174
|
+
debug "'#{word}'"
|
1135
1175
|
message("'#{word}'")
|
1136
|
-
#
|
1176
|
+
#debug wm
|
1137
1177
|
end
|
1138
1178
|
|
1139
1179
|
def jump_to_next_instance_of_word()
|
1140
1180
|
if $kbd.last_action == $kbd.cur_action and @current_word != nil
|
1141
|
-
#
|
1181
|
+
# debug "REPEATING *"
|
1142
1182
|
else
|
1143
1183
|
start_search = [@pos - 150, 0].max
|
1144
1184
|
|
@@ -1237,10 +1277,10 @@ class Buffer < String
|
|
1237
1277
|
|
1238
1278
|
if target == FIRST_NON_WHITESPACE
|
1239
1279
|
l = current_line()
|
1240
|
-
|
1280
|
+
debug l.inspect
|
1241
1281
|
@cpos = line(@lpos).size - 1
|
1242
1282
|
a = scan_indexes(l, /\S/)
|
1243
|
-
|
1283
|
+
debug a.inspect
|
1244
1284
|
if a.any?
|
1245
1285
|
@cpos = a[0]
|
1246
1286
|
else
|
@@ -1324,9 +1364,9 @@ class Buffer < String
|
|
1324
1364
|
calculate_line_and_column_pos
|
1325
1365
|
end
|
1326
1366
|
|
1327
|
-
def execute_current_line_in_terminal()
|
1367
|
+
def execute_current_line_in_terminal(autoclose = false)
|
1328
1368
|
s = get_current_line
|
1329
|
-
exec_in_terminal(s)
|
1369
|
+
exec_in_terminal(s, autoclose)
|
1330
1370
|
end
|
1331
1371
|
|
1332
1372
|
def insert_new_line()
|
@@ -1346,8 +1386,17 @@ class Buffer < String
|
|
1346
1386
|
# Indent start of new line based on last line
|
1347
1387
|
last_line = line(@lpos)
|
1348
1388
|
m = /^( +)([^ ]+|$)/.match(last_line)
|
1349
|
-
|
1350
|
-
|
1389
|
+
if m
|
1390
|
+
c = c + " " * m[1].size if m
|
1391
|
+
end
|
1392
|
+
|
1393
|
+
#if tab indent
|
1394
|
+
m = /^(\t+)([^\t]+|$)/.match(last_line)
|
1395
|
+
if m
|
1396
|
+
c = c + "\t" * m[1].size if m
|
1397
|
+
end
|
1398
|
+
|
1399
|
+
# debug m.inspect
|
1351
1400
|
end
|
1352
1401
|
if mode == BEFORE
|
1353
1402
|
insert_pos = @pos
|
@@ -1360,8 +1409,8 @@ class Buffer < String
|
|
1360
1409
|
|
1361
1410
|
#self.insert(insert_pos,c)
|
1362
1411
|
add_delta([insert_pos, INSERT, c.size, c], true)
|
1363
|
-
#
|
1364
|
-
#
|
1412
|
+
#debug("encoding: #{c.encoding}")
|
1413
|
+
#debug "c.size: #{c.size}"
|
1365
1414
|
#recalc_line_ends #TODO: optimize?
|
1366
1415
|
calculate_line_and_column_pos
|
1367
1416
|
#need_redraw!
|
@@ -1435,7 +1484,7 @@ class Buffer < String
|
|
1435
1484
|
text = $register[register]
|
1436
1485
|
end
|
1437
1486
|
end
|
1438
|
-
|
1487
|
+
debug "PASTE: #{text}"
|
1439
1488
|
|
1440
1489
|
return if text == ""
|
1441
1490
|
|
@@ -1481,7 +1530,6 @@ class Buffer < String
|
|
1481
1530
|
def start_visual_mode()
|
1482
1531
|
@visual_mode = true
|
1483
1532
|
@selection_start = @pos
|
1484
|
-
qt_set_selection_start(@id, selection_start)
|
1485
1533
|
$kbd.set_mode(:visual)
|
1486
1534
|
end
|
1487
1535
|
|
@@ -1491,7 +1539,13 @@ class Buffer < String
|
|
1491
1539
|
return if !@visual_mode
|
1492
1540
|
|
1493
1541
|
debug "COPY SELECTION"
|
1494
|
-
|
1542
|
+
s = self[get_visual_mode_range]
|
1543
|
+
if x == :append
|
1544
|
+
debug "APPEND"
|
1545
|
+
s += "\n" + get_clipboard()
|
1546
|
+
end
|
1547
|
+
|
1548
|
+
set_clipboard(s)
|
1495
1549
|
end_visual_mode
|
1496
1550
|
return true
|
1497
1551
|
end
|
@@ -1636,10 +1690,14 @@ class Buffer < String
|
|
1636
1690
|
else
|
1637
1691
|
savepath = buflist.get_last_dir
|
1638
1692
|
end
|
1639
|
-
|
1640
|
-
qt_file_saveas(savepath)
|
1693
|
+
gui_file_saveas(savepath)
|
1641
1694
|
# calls back to file_saveas
|
1642
|
-
|
1695
|
+
end
|
1696
|
+
|
1697
|
+
def save_as_callback(fpath)
|
1698
|
+
set_filename(fpath)
|
1699
|
+
save()
|
1700
|
+
gui_set_window_title(@title, @subtitle) #TODO: if not active buffer?
|
1643
1701
|
end
|
1644
1702
|
|
1645
1703
|
def write_contents_to_file(fpath)
|
@@ -1720,14 +1778,13 @@ class Buffer < String
|
|
1720
1778
|
def backup()
|
1721
1779
|
fname = @fname
|
1722
1780
|
return if !@fname
|
1723
|
-
message("Backup buffer #{fname}")
|
1724
1781
|
spfx = fname.gsub("=", "==").gsub("/", "=:")
|
1725
|
-
spath = File.expand_path("
|
1782
|
+
spath = File.expand_path("~/.vimamsa/backup")
|
1726
1783
|
return false if !can_save_to_directory?(spath)
|
1727
1784
|
datetime = DateTime.now().strftime("%d%m%Y:%H%M%S")
|
1728
1785
|
savepath = "#{spath}/#{spfx}_#{datetime}"
|
1786
|
+
message("Backup buffer #{fname} TO: #{savepath}")
|
1729
1787
|
if is_path_writable(savepath)
|
1730
|
-
debug "BACKUP BUFFER TO: #{savepath}"
|
1731
1788
|
write_contents_to_file(savepath)
|
1732
1789
|
else
|
1733
1790
|
message("PATH NOT WRITABLE: #{savepath}")
|
data/lib/vimamsa/buffer_list.rb
CHANGED
@@ -23,6 +23,7 @@ end
|
|
23
23
|
class BufferList < Array
|
24
24
|
attr_reader :current_buf
|
25
25
|
|
26
|
+
|
26
27
|
def <<(_buf)
|
27
28
|
super
|
28
29
|
$buffer = _buf
|
@@ -30,8 +31,8 @@ class BufferList < Array
|
|
30
31
|
$buffer_history << @current_buf
|
31
32
|
@recent_ind = 0
|
32
33
|
$hook.call(:change_buffer, $buffer)
|
33
|
-
|
34
|
-
|
34
|
+
gui_set_current_buffer($buffer.id)
|
35
|
+
gui_set_cursor_pos($buffer.id, $buffer.pos)
|
35
36
|
end
|
36
37
|
|
37
38
|
def switch()
|
@@ -57,6 +58,12 @@ class BufferList < Array
|
|
57
58
|
buf_idx = self.index { |b| b.fname == fname }
|
58
59
|
return buf_idx
|
59
60
|
end
|
61
|
+
|
62
|
+
def get_buffer_by_id(id)
|
63
|
+
buf_idx = self.index { |b| b.id == id }
|
64
|
+
return buf_idx
|
65
|
+
end
|
66
|
+
|
60
67
|
|
61
68
|
def add_current_buf_to_history()
|
62
69
|
@recent_ind = 0
|
@@ -83,7 +90,7 @@ class BufferList < Array
|
|
83
90
|
$hook.call(:change_buffer, $buffer)
|
84
91
|
$buffer.set_active
|
85
92
|
|
86
|
-
|
93
|
+
gui_set_current_buffer($buffer.id)
|
87
94
|
gui_set_window_title($buffer.title,$buffer.subtitle)
|
88
95
|
|
89
96
|
# hpt_scan_images() if $debug # experimental
|
@@ -138,7 +145,24 @@ class BufferList < Array
|
|
138
145
|
$buffer_history = bh.reverse
|
139
146
|
end
|
140
147
|
|
148
|
+
|
149
|
+
# Close buffer in the background
|
150
|
+
# TODO: if open in another widget
|
151
|
+
def close_other_buffer(buffer_i)
|
152
|
+
return if self.size <= buffer_i
|
153
|
+
return if @current_buf == buffer_i
|
154
|
+
|
155
|
+
bufname = self[buffer_i].basename
|
156
|
+
message("Closed buffer #{bufname}")
|
157
|
+
|
158
|
+
self.slice!(buffer_i)
|
159
|
+
$buffer_history = $buffer_history.collect { |x| r = x; r = x - 1 if x > buffer_i; r = nil if x == buffer_i; r }.compact
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
|
141
164
|
def close_buffer(buffer_i, from_recent = false)
|
165
|
+
return if buffer_i.nil?
|
142
166
|
return if self.size <= buffer_i
|
143
167
|
|
144
168
|
bufname = self[buffer_i].basename
|