vimamsa 0.1.11 → 0.1.13
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/exe/vimamsa +1 -4
- data/lib/vimamsa/ack.rb +4 -3
- data/lib/vimamsa/actions.rb +13 -6
- data/lib/vimamsa/audio.rb +58 -0
- data/lib/vimamsa/buffer.rb +59 -32
- data/lib/vimamsa/buffer_manager.rb +2 -1
- data/lib/vimamsa/easy_jump.rb +1 -1
- data/lib/vimamsa/editor.rb +24 -51
- data/lib/vimamsa/file_finder.rb +8 -8
- data/lib/vimamsa/gui.rb +114 -142
- data/lib/vimamsa/gui_menu.rb +4 -0
- data/lib/vimamsa/gui_select_window.rb +9 -8
- data/lib/vimamsa/gui_sourceview.rb +189 -38
- data/lib/vimamsa/hyper_plain_text.rb +11 -4
- data/lib/vimamsa/key_actions.rb +4 -0
- data/lib/vimamsa/key_binding_tree.rb +8 -2
- data/lib/vimamsa/key_bindings_vimlike.rb +16 -2
- data/lib/vimamsa/main.rb +0 -7
- data/lib/vimamsa/rbvma.rb +0 -6
- data/lib/vimamsa/search_replace.rb +33 -9
- data/lib/vimamsa/util.rb +64 -1
- data/lib/vimamsa/version.rb +1 -1
- metadata +3 -2
data/lib/vimamsa/gui.rb
CHANGED
@@ -90,33 +90,6 @@ def page_down
|
|
90
90
|
return true
|
91
91
|
end
|
92
92
|
|
93
|
-
def paste_system_clipboard()
|
94
|
-
|
95
|
-
#TODO: Check if something useful in this old GTK3 code.
|
96
|
-
utf8_string = Gdk::Atom.intern("UTF8_STRING")
|
97
|
-
|
98
|
-
clipboard = Gtk::Clipboard.get_default($vmag.window.display)
|
99
|
-
received_text = ""
|
100
|
-
|
101
|
-
target_string = Gdk::Selection::TARGET_STRING
|
102
|
-
ti = clipboard.request_contents(target_string)
|
103
|
-
|
104
|
-
if clipboard.wait_is_text_available?
|
105
|
-
received_text = clipboard.wait_for_text
|
106
|
-
end
|
107
|
-
|
108
|
-
if received_text != "" and !received_text.nil?
|
109
|
-
max_clipboard_items = 100
|
110
|
-
if received_text != $clipboard[-1]
|
111
|
-
#TODO: HACK
|
112
|
-
$paste_lines = false
|
113
|
-
end
|
114
|
-
$clipboard << received_text
|
115
|
-
# debug $clipboard[-1]
|
116
|
-
$clipboard = $clipboard[-([$clipboard.size, max_clipboard_items].min)..-1]
|
117
|
-
end
|
118
|
-
return received_text
|
119
|
-
end
|
120
93
|
|
121
94
|
def set_system_clipboard(arg)
|
122
95
|
vma.gui.window.display.clipboard.set(arg)
|
@@ -178,38 +151,6 @@ def gui_set_cursor_pos(id, pos)
|
|
178
151
|
vma.buf.view.set_cursor_pos(pos)
|
179
152
|
end
|
180
153
|
|
181
|
-
def gui_set_active_window(winid)
|
182
|
-
sw = vma.gui.sw
|
183
|
-
if winid == 2
|
184
|
-
sw = vma.gui.sw2
|
185
|
-
end
|
186
|
-
|
187
|
-
sw.set_child(view)
|
188
|
-
view.grab_focus
|
189
|
-
|
190
|
-
vma.gui.view = view
|
191
|
-
vma.gui.buf1 = view.buffer
|
192
|
-
$view = view
|
193
|
-
$vbuf = view.buffer
|
194
|
-
end
|
195
|
-
|
196
|
-
#TODO:delete?
|
197
|
-
def gui_attach_buf_to_window(id, winid)
|
198
|
-
view = vma.gui.buffers[id]
|
199
|
-
sw = vma.gui.sw
|
200
|
-
if winid == 2
|
201
|
-
sw = vma.gui.sw2
|
202
|
-
end
|
203
|
-
|
204
|
-
sw.set_child(view)
|
205
|
-
view.grab_focus
|
206
|
-
|
207
|
-
vma.gui.view = view
|
208
|
-
vma.gui.buf1 = view.buffer
|
209
|
-
$view = view
|
210
|
-
$vbuf = view.buffer
|
211
|
-
end
|
212
|
-
|
213
154
|
def gui_set_current_buffer(id)
|
214
155
|
vma.gui.set_current_buffer(id)
|
215
156
|
return
|
@@ -328,72 +269,63 @@ class VMAgui
|
|
328
269
|
@da.show
|
329
270
|
end
|
330
271
|
|
331
|
-
def
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
@overlay.remove(@da)
|
336
|
-
end
|
337
|
-
return
|
338
|
-
else
|
339
|
-
@da = Gtk::Fixed.new
|
340
|
-
@overlay.add_overlay(@da)
|
341
|
-
@overlay.set_overlay_pass_through(@da, true)
|
272
|
+
def remove_overlay_cursor()
|
273
|
+
if !@cursorov.nil?
|
274
|
+
@overlay.remove_overlay(@cursorov)
|
275
|
+
@cursorov = nil
|
342
276
|
end
|
277
|
+
end
|
343
278
|
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
da.signal_connect "draw" do |widget, cr|
|
362
|
-
cr.save
|
363
|
-
for pos in wpos
|
364
|
-
(x, y) = @view.pos_to_coord(pos)
|
365
|
-
|
366
|
-
layout = da.create_pango_layout("XY")
|
367
|
-
desc = Pango::FontDescription.new("sans bold 11")
|
368
|
-
layout.font_description = desc
|
369
|
-
|
370
|
-
cr.move_to(x, y)
|
371
|
-
# cr.move_to(gutter_width, 300)
|
372
|
-
cr.pango_layout_path(layout)
|
373
|
-
|
374
|
-
cr.set_source_rgb(1.0, 0.0, 0.0)
|
375
|
-
cr.fill_preserve
|
376
|
-
end
|
377
|
-
cr.restore
|
378
|
-
false # = draw other
|
379
|
-
# true # = Don't draw others
|
279
|
+
def overlay_draw_cursor(textpos)
|
280
|
+
# return
|
281
|
+
remove_overlay_cursor
|
282
|
+
GLib::Idle.add(proc { self.overlay_draw_cursor_(textpos) })
|
283
|
+
# overlay_draw_cursor_(textpos)
|
284
|
+
end
|
285
|
+
|
286
|
+
# Run proc after animated scrolling has stopped (e.g. after page down)
|
287
|
+
def run_after_scrolling(p)
|
288
|
+
Thread.new {
|
289
|
+
# After running
|
290
|
+
# view.signal_emit("move-cursor", Gtk::MovementStep.new(:PAGES)
|
291
|
+
# have to wait for animated page down scrolling to actually start
|
292
|
+
# Then have to wait determine that it has stopped if scrolling adjustment stops changing. There should be a better way to do this.
|
293
|
+
sleep 0.1
|
294
|
+
while Time.now - @last_adj_time < 0.1
|
295
|
+
sleep 0.1
|
380
296
|
end
|
381
|
-
|
297
|
+
debug "SCROLLING ENDED", 2
|
298
|
+
run_as_idle p
|
299
|
+
}
|
300
|
+
end
|
382
301
|
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
302
|
+
# To draw on empty lines and line-ends (where select_range doesn't work)
|
303
|
+
def overlay_draw_cursor_(textpos)
|
304
|
+
# Thread.new {
|
305
|
+
# GLib::Idle.add(proc { p.call; false })
|
306
|
+
# }
|
307
|
+
|
308
|
+
# while Time.now - @last_adj_time < 0.3
|
309
|
+
# return true
|
310
|
+
# end
|
390
311
|
|
391
|
-
|
312
|
+
remove_overlay_cursor
|
313
|
+
@cursorov = Gtk::Fixed.new
|
314
|
+
@overlay.add_overlay(@cursorov)
|
392
315
|
|
393
|
-
@
|
316
|
+
(x, y) = @view.pos_to_coord(textpos)
|
317
|
+
pp [x, y]
|
318
|
+
|
319
|
+
# Trying to draw only background of character "I"
|
320
|
+
label = Gtk::Label.new("<span background='#00ffaaff' foreground='#00ffaaff' weight='ultrabold'>I</span>")
|
321
|
+
label.use_markup = true
|
322
|
+
@cursorov.put(label, x, y)
|
323
|
+
@cursorov.show
|
324
|
+
return false
|
394
325
|
end
|
395
326
|
|
396
327
|
def handle_deltas()
|
328
|
+
view.delete_cursor_char
|
397
329
|
while d = buf.deltas.shift
|
398
330
|
pos = d[0]
|
399
331
|
op = d[1]
|
@@ -551,6 +483,7 @@ class VMAgui
|
|
551
483
|
return true
|
552
484
|
end
|
553
485
|
|
486
|
+
# Remove widget event controllers added by gtk, and add our own.
|
554
487
|
def reset_controllers
|
555
488
|
clist = @window.observe_controllers
|
556
489
|
to_remove = []
|
@@ -629,23 +562,32 @@ class VMAgui
|
|
629
562
|
end
|
630
563
|
end
|
631
564
|
|
565
|
+
def idle_set_size()
|
566
|
+
# Need to wait for a while to window to be maximized to get correct @window.width
|
567
|
+
sleep 0.1
|
568
|
+
width = @window.width / 2
|
569
|
+
height = @window.height - 5
|
570
|
+
# Ripl.start :binding => binding
|
571
|
+
@window.unmaximize
|
572
|
+
@window.set_size_request(width, height)
|
573
|
+
return false
|
574
|
+
end
|
575
|
+
|
632
576
|
def init_window
|
633
577
|
@last_debug_idle = Time.now
|
634
578
|
app = Gtk::Application.new("net.samiddhi.vimamsa.r#{rand(1000)}", :flags_none)
|
635
579
|
@app = app
|
636
580
|
|
637
|
-
|
581
|
+
Gtk::Settings.default.gtk_application_prefer_dark_theme = true
|
582
|
+
Gtk::Settings.default.gtk_theme_name = "Adwaita"
|
638
583
|
|
639
|
-
|
640
|
-
# @window = Gtk::Window.new()
|
584
|
+
app.signal_connect "activate" do
|
641
585
|
@window = Gtk::ApplicationWindow.new(app)
|
642
586
|
@window.set_application(app)
|
643
587
|
|
644
|
-
|
645
|
-
#
|
646
|
-
|
647
|
-
# @window.set_default_size((sw * 0.45).to_i, sh - 20) #TODO:gtk4
|
648
|
-
@window.set_default_size(800, 600)
|
588
|
+
@window.maximize
|
589
|
+
# Need to let Gtk process after maximize
|
590
|
+
run_as_idle proc { idle_set_size }
|
649
591
|
|
650
592
|
@window.title = "Multiple Views"
|
651
593
|
@vpaned = Gtk::Paned.new(:vertical)
|
@@ -659,15 +601,22 @@ class VMAgui
|
|
659
601
|
|
660
602
|
reset_controllers
|
661
603
|
|
662
|
-
# @window.signal_connect("key-pressed") { puts "Hello World!" }
|
663
|
-
# @window.signal_connect("clicked") { puts "Hello World!" }
|
664
|
-
|
665
|
-
# @menubar = Gtk::PopoverMenuBar.new #TODO:gtk4
|
666
|
-
# @menubar.expand = false #TODO:gtk4
|
667
|
-
|
668
604
|
@sw = Gtk::ScrolledWindow.new
|
669
605
|
@sw.set_policy(:automatic, :automatic)
|
670
606
|
|
607
|
+
|
608
|
+
@last_adj_time = Time.now
|
609
|
+
@sw.vadjustment.signal_connect("value-changed") { |x|
|
610
|
+
# pp x.page_increment
|
611
|
+
# pp x.page_size
|
612
|
+
# pp x.step_increment
|
613
|
+
# pp x.upper
|
614
|
+
# pp x.value
|
615
|
+
# pp x
|
616
|
+
@last_adj_time = Time.now
|
617
|
+
# puts "@sw.vadjustment"
|
618
|
+
}
|
619
|
+
|
671
620
|
# @sw.signal_connect("clicked") { puts "Hello World!" }
|
672
621
|
# @sw.signal_connect("key-pressed") { puts "Hello World!" }
|
673
622
|
@overlay = Gtk::Overlay.new
|
@@ -813,10 +762,10 @@ class VMAgui
|
|
813
762
|
@vbox.remove(@overlay)
|
814
763
|
|
815
764
|
# numbers: left, top, width, height
|
816
|
-
@pane.set_start_child(@
|
817
|
-
@pane.set_end_child(@
|
765
|
+
@pane.set_start_child(@overlay2)
|
766
|
+
@pane.set_end_child(@overlay)
|
818
767
|
|
819
|
-
@vbox.attach(@pane, 0,
|
768
|
+
@vbox.attach(@pane, 0, 2, 2, 1)
|
820
769
|
|
821
770
|
@sw2.vexpand = true
|
822
771
|
@sw2.hexpand = true
|
@@ -831,7 +780,7 @@ class VMAgui
|
|
831
780
|
last = vma.buffers.get_last_visited_id
|
832
781
|
set_buffer_to_window(last, 2)
|
833
782
|
else
|
834
|
-
bf = create_new_buffer "\n\n"
|
783
|
+
bf = create_new_buffer "\n\n", "buff", false
|
835
784
|
set_buffer_to_window(bf.id, 2)
|
836
785
|
end
|
837
786
|
end
|
@@ -848,8 +797,14 @@ class VMAgui
|
|
848
797
|
else
|
849
798
|
set_active_window(1)
|
850
799
|
end
|
800
|
+
end
|
851
801
|
|
852
|
-
|
802
|
+
# activate that window which has the given view
|
803
|
+
def set_current_view(view)
|
804
|
+
w = @windows.find { |k, v| v[:sw].child == view }
|
805
|
+
if !w.nil?
|
806
|
+
set_active_window(w[0])
|
807
|
+
end
|
853
808
|
end
|
854
809
|
|
855
810
|
def set_active_window(id)
|
@@ -868,16 +823,26 @@ class VMAgui
|
|
868
823
|
@sw = @windows[id][:sw]
|
869
824
|
@overlay = @windows[id][:overlay]
|
870
825
|
|
826
|
+
vma.buffers.set_current_buffer_by_id(@sw.child.bufo.id)
|
827
|
+
|
871
828
|
#TODO: set buf & view of active window??
|
872
829
|
|
873
830
|
end
|
874
831
|
|
832
|
+
def current_view
|
833
|
+
return @sw.child
|
834
|
+
end
|
835
|
+
|
875
836
|
def set_buffer_to_window(bufid, winid)
|
876
837
|
view = @buffers[bufid]
|
877
838
|
debug "vma.gui.set_buffer_to_window(#{bufid}), winid=#{winid}"
|
878
839
|
buf1 = view.buffer
|
879
840
|
|
880
841
|
@windows[winid][:sw].set_child(view)
|
842
|
+
idle_ensure_cursor_drawn
|
843
|
+
|
844
|
+
# @overlay = Gtk::Overlay.new
|
845
|
+
# @overlay.add_overlay(view)
|
881
846
|
|
882
847
|
#TODO:???
|
883
848
|
# @view = view
|
@@ -896,19 +861,26 @@ class VMAgui
|
|
896
861
|
$view = view
|
897
862
|
$vbuf = buf1
|
898
863
|
|
899
|
-
#
|
900
|
-
|
864
|
+
# Check if buffer is already open in another column
|
901
865
|
if @two_column and @active_column == 2 and id == @sw1.child.bufo.id
|
902
866
|
toggle_active_window
|
903
|
-
elsif @two_column
|
867
|
+
elsif @two_column && @active_column == 1 && !@sw2.child.nil? && id == @sw2.child.bufo.id
|
868
|
+
#TODO: should not need !@sw2.child.nil? here. If this happens then other column is empty.
|
904
869
|
toggle_active_window
|
905
870
|
else
|
906
871
|
@sw.set_child(view)
|
907
872
|
end
|
908
873
|
view.grab_focus
|
909
|
-
|
910
|
-
|
911
|
-
|
912
|
-
|
874
|
+
|
875
|
+
idle_ensure_cursor_drawn
|
876
|
+
end
|
877
|
+
|
878
|
+
def idle_ensure_cursor_drawn
|
879
|
+
run_as_idle proc { self.ensure_cursor_drawn }
|
880
|
+
end
|
881
|
+
|
882
|
+
def ensure_cursor_drawn
|
883
|
+
# view.place_cursor_onscreen #TODO: needed?
|
884
|
+
view.draw_cursor
|
913
885
|
end
|
914
886
|
end
|
data/lib/vimamsa/gui_menu.rb
CHANGED
@@ -43,6 +43,10 @@ module Vimamsa
|
|
43
43
|
add_to_menu "Actions.experimental.EnableDebug", { :label => "Enable debug", :action => :enable_debug }
|
44
44
|
add_to_menu "Actions.experimental.DisableDebug", { :label => "Disable debug", :action => :disable_debug }
|
45
45
|
add_to_menu "Actions.experimental.ShowImages", { :label => "Show images ⟦img:path⟧", :action => :show_images }
|
46
|
+
|
47
|
+
|
48
|
+
add_to_menu "View.TwoColumn", { :label => "Start two column mode", :action => :toggle_two_column }
|
49
|
+
|
46
50
|
|
47
51
|
add_to_menu "Actions.EncryptFile", { :label => "Encrypt file", :action => :encrypt_file }
|
48
52
|
add_to_menu "Help.KeyBindings", { :label => "Show key bindings", :action => :show_key_bindings }
|
@@ -69,13 +69,19 @@ class SelectUpdateWindow
|
|
69
69
|
|
70
70
|
@window.add(vbox)
|
71
71
|
|
72
|
+
if !opt[:desc].nil?
|
73
|
+
descl = Gtk::Label.new(opt[:desc])
|
74
|
+
set_margin_all(descl,15)
|
75
|
+
# vbox.append(descl, :expand => false, :fill => false, :padding => 0)
|
76
|
+
vbox.append(descl)
|
77
|
+
end
|
78
|
+
|
72
79
|
@entry = Gtk::SearchEntry.new
|
73
80
|
@entry.width_chars = 45
|
74
81
|
container = Gtk::Box.new(:horizontal, 10)
|
75
82
|
# container.halign = :start
|
76
83
|
container.halign = :center
|
77
|
-
container.
|
78
|
-
:expand => false, :fill => false, :padding => 0)
|
84
|
+
container.append(@entry)
|
79
85
|
|
80
86
|
# create tree view
|
81
87
|
@model = Gtk::ListStore.new(String, String)
|
@@ -135,11 +141,6 @@ class SelectUpdateWindow
|
|
135
141
|
@entry.signal_connect("changed") { debug "[changed] " }
|
136
142
|
@entry.signal_connect("next-match") { debug "[next-match] " }
|
137
143
|
|
138
|
-
if !opt[:desc].nil?
|
139
|
-
descl = Gtk::Label.new(opt[:desc])
|
140
|
-
vbox.pack_start(descl, :expand => false, :fill => false, :padding => 0)
|
141
|
-
end
|
142
|
-
|
143
144
|
# label = Gtk::Label.new(<<-EOF)
|
144
145
|
# Search:
|
145
146
|
# EOF
|
@@ -147,7 +148,7 @@ class SelectUpdateWindow
|
|
147
148
|
# label = Gtk::Label.new("Input:")
|
148
149
|
# vbox.pack_start(label, :expand => false, :fill => false, :padding => 0)
|
149
150
|
|
150
|
-
vbox.
|
151
|
+
vbox.append(container)
|
151
152
|
sw = Gtk::ScrolledWindow.new(nil, nil)
|
152
153
|
# sw.shadow_type = :etched_in #TODO:gtk4
|
153
154
|
sw.set_policy(:never, :automatic)
|