vimamsa 0.1.12 → 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/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 +58 -28
- data/lib/vimamsa/editor.rb +23 -50
- data/lib/vimamsa/gui.rb +8 -27
- data/lib/vimamsa/gui_select_window.rb +9 -8
- data/lib/vimamsa/gui_sourceview.rb +100 -34
- 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 +14 -1
- 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 +56 -1
- data/lib/vimamsa/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9bd13f53f2d774550226da6e379842c2d54bde6e8ffa5362d4769940d93a033e
|
4
|
+
data.tar.gz: 5f2db7ad2c5402a816f186e266194f1a7545b1a2a71fd532f9140634835fc3f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d41917d0e0cfa9a876579bea6aaaafee3b3eff3757d74c399922a5db71220889f278df03bd1bc3e1177002fa906e3d30792280004dd5270d2b135dd6006f51ca
|
7
|
+
data.tar.gz: c4935e09ecb5a714cb481ac00386e698aee72583030f03cf9b7c182c71066513339c2c0c4aa6f723e00630e659704e95a107007a76af936d08e67a8e6ded5c5f
|
data/lib/vimamsa/ack.rb
CHANGED
@@ -111,14 +111,15 @@ Will search the following directories:
|
|
111
111
|
gui_one_input_action(nfo, "Search:", "search", callback)
|
112
112
|
end
|
113
113
|
|
114
|
-
def ack_buffer(
|
115
|
-
instr = Shellwords.escape(
|
114
|
+
def ack_buffer(_instr, b = nil)
|
115
|
+
instr = Shellwords.escape(_instr)
|
116
116
|
bufstr = ""
|
117
117
|
for path in vma.get_content_search_paths
|
118
118
|
bufstr += run_cmd("ack -Q --type-add=gd=.gd -ki --nohtml --nojs --nojson #{instr} #{path}")
|
119
119
|
end
|
120
120
|
if bufstr.size > 5
|
121
|
-
create_new_buffer(bufstr,"ack")
|
121
|
+
b = create_new_buffer(bufstr,"ack")
|
122
|
+
highlight_match(b, _instr, color: "#10bd8e")
|
122
123
|
else
|
123
124
|
message("No results for input:#{instr}")
|
124
125
|
end
|
data/lib/vimamsa/actions.rb
CHANGED
@@ -32,11 +32,14 @@ def missing_callfunc
|
|
32
32
|
end
|
33
33
|
|
34
34
|
#TODO: remove
|
35
|
-
def call(id)
|
36
|
-
call_action(id)
|
37
|
-
end
|
35
|
+
# def call(id)
|
36
|
+
# call_action(id)
|
37
|
+
# end
|
38
|
+
|
39
|
+
$acth = []
|
38
40
|
|
39
41
|
def call_action(id)
|
42
|
+
$acth << id
|
40
43
|
a = $actions[id]
|
41
44
|
if a
|
42
45
|
a.method.call()
|
@@ -45,11 +48,15 @@ def call_action(id)
|
|
45
48
|
end
|
46
49
|
end
|
47
50
|
|
51
|
+
def last_action
|
52
|
+
return $acth[-1]
|
53
|
+
end
|
54
|
+
|
48
55
|
def search_actions()
|
49
56
|
l = []
|
50
|
-
opt = { :title => "Search actions
|
57
|
+
opt = { :title => "Search for actions", :desc => "Fuzzy search for actions. <up> or <down> to change selcted. <enter> to select current." }
|
51
58
|
$select_keys = ["h", "l", "f", "d", "s", "a", "g", "z"]
|
52
|
-
|
59
|
+
|
53
60
|
gui_select_update_window(l, $select_keys.collect { |x| x.upcase },
|
54
61
|
"search_actions_select_callback",
|
55
62
|
"search_actions_update_callback",
|
@@ -109,7 +116,7 @@ def search_actions_select_callback(search_str, idx)
|
|
109
116
|
eval(acc)
|
110
117
|
elsif acc.class == Symbol
|
111
118
|
debug "Symbol"
|
112
|
-
|
119
|
+
call_action(acc)
|
113
120
|
end
|
114
121
|
end
|
115
122
|
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require "gstreamer"
|
2
|
+
|
3
|
+
# following the example gstreamer-4.2.0/sample/helloworld_e.rb
|
4
|
+
class Audio
|
5
|
+
@@playbin = nil
|
6
|
+
|
7
|
+
def self.stop
|
8
|
+
@@playbin.stop if !@@playbin.nil?
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.play(fn)
|
12
|
+
playbin = @@playbin
|
13
|
+
if playbin.nil?
|
14
|
+
playbin = Gst::ElementFactory.make("playbin")
|
15
|
+
if playbin.nil?
|
16
|
+
puts "'playbin' gstreamer plugin missing"
|
17
|
+
return
|
18
|
+
end
|
19
|
+
else
|
20
|
+
if playbin.current_state == "playing"
|
21
|
+
playbin.stop # Stop previous play
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# playbin.volume
|
26
|
+
# playbin.volume=1.0
|
27
|
+
# playbin.stream_time
|
28
|
+
# playbin.current_state
|
29
|
+
|
30
|
+
# take the commandline argument and ensure that it is a uri
|
31
|
+
if Gst.valid_uri?(fn)
|
32
|
+
uri = fn
|
33
|
+
else
|
34
|
+
uri = Gst.filename_to_uri(fn)
|
35
|
+
end
|
36
|
+
playbin.uri = uri
|
37
|
+
@@playbin = playbin
|
38
|
+
|
39
|
+
bus = playbin.bus
|
40
|
+
bus.add_watch do |bus, message|
|
41
|
+
|
42
|
+
case message.type
|
43
|
+
when Gst::MessageType::EOS
|
44
|
+
puts "End-of-stream"
|
45
|
+
when Gst::MessageType::ERROR
|
46
|
+
error, debug = message.parse_error
|
47
|
+
puts "Debugging info: #{debug || "none"}"
|
48
|
+
puts "Error: #{error.message}"
|
49
|
+
end
|
50
|
+
true
|
51
|
+
end
|
52
|
+
|
53
|
+
message("Start playing audio: #{fn}")
|
54
|
+
|
55
|
+
# start play back and listed to events
|
56
|
+
playbin.play
|
57
|
+
end
|
58
|
+
end
|
data/lib/vimamsa/buffer.rb
CHANGED
@@ -5,7 +5,6 @@ require "pathname"
|
|
5
5
|
require "openssl"
|
6
6
|
require "ripl/multi_line"
|
7
7
|
|
8
|
-
$paste_lines = false
|
9
8
|
$buffer_history = []
|
10
9
|
|
11
10
|
$update_highlight = false
|
@@ -15,7 +14,7 @@ $ifuncon = false
|
|
15
14
|
class Buffer < String
|
16
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
|
17
16
|
attr_writer :call_func, :update_highlight
|
18
|
-
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
|
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
|
19
18
|
|
20
19
|
@@num_buffers = 0
|
21
20
|
|
@@ -32,6 +31,9 @@ class Buffer < String
|
|
32
31
|
gui_create_buffer(@id, self)
|
33
32
|
debug "NEW BUFFER fn=#{fname} ID:#{@id}"
|
34
33
|
|
34
|
+
# If true, we will create new line after this and paste there
|
35
|
+
@paste_lines = false
|
36
|
+
|
35
37
|
@module = nil
|
36
38
|
|
37
39
|
@last_save = @last_asked_from_user = @file_last_cheked = Time.now
|
@@ -398,7 +400,6 @@ class Buffer < String
|
|
398
400
|
gui_set_buffer_contents(@id, self.to_s)
|
399
401
|
@images = [] #TODO: if reload
|
400
402
|
hpt_scan_images(self)
|
401
|
-
hpt_scan_audio(self)
|
402
403
|
|
403
404
|
# add_hl_update(@update_hl_startpos, @update_hl_endpos)
|
404
405
|
end
|
@@ -803,7 +804,7 @@ class Buffer < String
|
|
803
804
|
end
|
804
805
|
|
805
806
|
def copy(range_id)
|
806
|
-
|
807
|
+
@paste_lines = false
|
807
808
|
debug "range_id: #{range_id}"
|
808
809
|
debug range_id.inspect
|
809
810
|
range = get_range(range_id)
|
@@ -966,9 +967,14 @@ class Buffer < String
|
|
966
967
|
set_line_and_column_pos(nil, nil)
|
967
968
|
end
|
968
969
|
|
969
|
-
def delete2(range_id)
|
970
|
-
|
971
|
-
|
970
|
+
def delete2(range_id, mark = nil)
|
971
|
+
# if mark != nil
|
972
|
+
# debug mark, 2
|
973
|
+
# return
|
974
|
+
# end
|
975
|
+
|
976
|
+
@paste_lines = false
|
977
|
+
range = get_range(range_id, mark: mark)
|
972
978
|
return if range == nil
|
973
979
|
debug "RANGE"
|
974
980
|
debug range.inspect
|
@@ -980,7 +986,7 @@ class Buffer < String
|
|
980
986
|
end
|
981
987
|
|
982
988
|
def delete(op, x = nil)
|
983
|
-
|
989
|
+
@paste_lines = false
|
984
990
|
# Delete selection
|
985
991
|
if op == SELECTION && visual_mode?
|
986
992
|
(startpos, endpos) = get_visual_mode_range2
|
@@ -1028,7 +1034,7 @@ class Buffer < String
|
|
1028
1034
|
end
|
1029
1035
|
|
1030
1036
|
# Ranges to use in delete or copy operations
|
1031
|
-
def get_range(range_id)
|
1037
|
+
def get_range(range_id, mark: nil)
|
1032
1038
|
range = nil
|
1033
1039
|
if range_id == :to_word_end
|
1034
1040
|
# TODO: better way to make the search than + 150 from current position
|
@@ -1045,6 +1051,16 @@ class Buffer < String
|
|
1045
1051
|
range = get_range(:to_word_end)
|
1046
1052
|
end
|
1047
1053
|
# Ripl.start :binding => binding
|
1054
|
+
|
1055
|
+
elsif range_id == :to_mark
|
1056
|
+
debug "TO MARK"
|
1057
|
+
start = @line_ends[@lpos]
|
1058
|
+
mpos = @marks[mark]
|
1059
|
+
if !mpos.nil?
|
1060
|
+
range = start..mpos
|
1061
|
+
else
|
1062
|
+
return nil
|
1063
|
+
end
|
1048
1064
|
elsif range_id == :to_line_end
|
1049
1065
|
debug "TO LINE END"
|
1050
1066
|
range = @pos..(@line_ends[@lpos] - 1)
|
@@ -1068,15 +1084,18 @@ class Buffer < String
|
|
1068
1084
|
end
|
1069
1085
|
return range if range == nil
|
1070
1086
|
if range.last < range.first
|
1071
|
-
range
|
1087
|
+
range = range.last..range.first
|
1088
|
+
# range.last = range.first
|
1072
1089
|
end
|
1073
1090
|
if range.first < 0
|
1074
|
-
range.first = 0
|
1091
|
+
# range.first = 0
|
1092
|
+
range = 0..range.last
|
1075
1093
|
end
|
1076
1094
|
if range.last >= self.size
|
1077
|
-
range.last = self.size - 1
|
1095
|
+
# range.last = self.size - 1
|
1096
|
+
range = range.first..(self.size - 1)
|
1078
1097
|
end
|
1079
|
-
|
1098
|
+
debug range, 2
|
1080
1099
|
return range
|
1081
1100
|
end
|
1082
1101
|
|
@@ -1487,6 +1506,10 @@ class Buffer < String
|
|
1487
1506
|
end
|
1488
1507
|
|
1489
1508
|
def insert_txt_at(c, pos)
|
1509
|
+
if c.nil? or pos.nil?
|
1510
|
+
error("input c=nil || pos=nil")
|
1511
|
+
return
|
1512
|
+
end
|
1490
1513
|
c = c.force_encoding("UTF-8"); #TODO:correct?
|
1491
1514
|
c = "\n" if c == "\r"
|
1492
1515
|
add_delta([pos, INSERT, c.size, c], true)
|
@@ -1608,26 +1631,32 @@ class Buffer < String
|
|
1608
1631
|
@clipboard_paste_running = true
|
1609
1632
|
clipboard = vma.gui.window.display.clipboard
|
1610
1633
|
clipboard.read_text_async do |_clipboard, result|
|
1611
|
-
|
1612
|
-
|
1634
|
+
begin
|
1635
|
+
text = clipboard.read_text_finish(result)
|
1636
|
+
rescue Gio::IOError::NotSupported
|
1637
|
+
# Happens when pasting from KeePassX and clipboard cleared
|
1638
|
+
debug Gio::IOError::NotSupported
|
1639
|
+
else
|
1640
|
+
paste_finish(text, at, register)
|
1641
|
+
end
|
1613
1642
|
end
|
1614
1643
|
end
|
1615
1644
|
|
1616
1645
|
def paste_finish(text, at, register)
|
1617
|
-
# if text == ""
|
1618
|
-
# return if !$clipboard.any?
|
1619
|
-
# if register == nil
|
1620
|
-
# text = $clipboard[-1]
|
1621
|
-
# else
|
1622
|
-
# text = $register[register]
|
1623
|
-
# end
|
1624
|
-
# end
|
1625
1646
|
debug "PASTE: #{text}"
|
1647
|
+
|
1648
|
+
# If we did not put this text to clipboard
|
1649
|
+
if text != $clipboard[-1]
|
1650
|
+
@paste_lines = false
|
1651
|
+
end
|
1652
|
+
|
1653
|
+
text = sanitize_input(text)
|
1654
|
+
|
1626
1655
|
$clipboard << text
|
1627
1656
|
|
1628
1657
|
return if text == ""
|
1629
1658
|
|
1630
|
-
if
|
1659
|
+
if @paste_lines
|
1631
1660
|
debug "PASTE LINES"
|
1632
1661
|
put_to_new_next_line(text)
|
1633
1662
|
else
|
@@ -1669,7 +1698,7 @@ class Buffer < String
|
|
1669
1698
|
add_delta([lrange.begin, DELETE, lrange.end - lrange.begin + 1], true)
|
1670
1699
|
set_clipboard(s)
|
1671
1700
|
update_pos(lrange.begin)
|
1672
|
-
|
1701
|
+
@paste_lines = true
|
1673
1702
|
#recalc_line_ends
|
1674
1703
|
end
|
1675
1704
|
|
@@ -1686,7 +1715,7 @@ class Buffer < String
|
|
1686
1715
|
|
1687
1716
|
def copy_active_selection(x = nil)
|
1688
1717
|
debug "!COPY SELECTION"
|
1689
|
-
|
1718
|
+
@paste_lines = false
|
1690
1719
|
return if !@visual_mode
|
1691
1720
|
|
1692
1721
|
debug "COPY SELECTION"
|
@@ -1766,7 +1795,7 @@ class Buffer < String
|
|
1766
1795
|
debug "copy num_lines:#{num_lines}"
|
1767
1796
|
end
|
1768
1797
|
set_clipboard(self[line_range(@lpos, num_lines)])
|
1769
|
-
|
1798
|
+
@paste_lines = true
|
1770
1799
|
end
|
1771
1800
|
|
1772
1801
|
def put_file_path_to_clipboard
|
@@ -1786,6 +1815,7 @@ class Buffer < String
|
|
1786
1815
|
end
|
1787
1816
|
|
1788
1817
|
def end_visual_mode()
|
1818
|
+
return if !visual_mode?
|
1789
1819
|
debug "End visual mode"
|
1790
1820
|
#TODO:take previous mode (insert|command) from stack?
|
1791
1821
|
$kbd.set_mode(:command)
|
@@ -2025,7 +2055,7 @@ class Buffer < String
|
|
2025
2055
|
end
|
2026
2056
|
end
|
2027
2057
|
|
2028
|
-
#TODO
|
2058
|
+
#TODO: function not used
|
2029
2059
|
def write_to_file(savepath, s)
|
2030
2060
|
if is_path_writable(savepath)
|
2031
2061
|
IO.write(savepath, self.to_s)
|
data/lib/vimamsa/editor.rb
CHANGED
@@ -26,10 +26,6 @@ def handle_drag_and_drop(fname)
|
|
26
26
|
buf.handle_drag_and_drop(fname)
|
27
27
|
end
|
28
28
|
|
29
|
-
def mkdir_if_not_exists(_dirpath)
|
30
|
-
dirpath = File.expand_path(_dirpath)
|
31
|
-
Dir.mkdir(dirpath) unless File.exist?(dirpath)
|
32
|
-
end
|
33
29
|
|
34
30
|
class Editor
|
35
31
|
attr_reader :file_content_search_paths, :file_name_search_paths, :gui, :hook, :macro
|
@@ -49,6 +45,7 @@ class Editor
|
|
49
45
|
@converters = {}
|
50
46
|
@paint_stack = []
|
51
47
|
@_plugins = {}
|
48
|
+
@errors
|
52
49
|
end
|
53
50
|
|
54
51
|
def open_file_listener(added)
|
@@ -93,11 +90,10 @@ class Editor
|
|
93
90
|
$kbd = @kbd
|
94
91
|
require "vimamsa/key_bindings_vimlike"
|
95
92
|
sleep(0.03)
|
96
|
-
|
97
93
|
|
98
94
|
FileManager.init
|
99
95
|
BufferManager.init
|
100
|
-
|
96
|
+
|
101
97
|
@gui.init_menu
|
102
98
|
|
103
99
|
mkdir_if_not_exists("~/.vimamsa")
|
@@ -136,10 +132,11 @@ class Editor
|
|
136
132
|
|
137
133
|
if conf(:enable_lsp)
|
138
134
|
require "vimamsa/langservp"
|
135
|
+
require "vimamsa/audio" # TODO:config
|
139
136
|
@langsrv["ruby"] = LangSrv.new("ruby")
|
140
137
|
@langsrv["cpp"] = LangSrv.new("cpp")
|
141
138
|
end
|
142
|
-
|
139
|
+
|
143
140
|
# build_options
|
144
141
|
|
145
142
|
fname = nil
|
@@ -282,6 +279,11 @@ class Editor
|
|
282
279
|
debug "CAN OPEN?: #{can_open}"
|
283
280
|
return can_open
|
284
281
|
end
|
282
|
+
|
283
|
+
def error(message)
|
284
|
+
debug "ERORR #{caller[0]} #{str}", 2
|
285
|
+
@errors << [message, caller]
|
286
|
+
end
|
285
287
|
end
|
286
288
|
|
287
289
|
def _quit()
|
@@ -389,7 +391,7 @@ def show_key_bindings()
|
|
389
391
|
kbd_s << vma.kbd.to_s
|
390
392
|
kbd_s << "\n"
|
391
393
|
kbd_s << "===============================================\n"
|
392
|
-
b = create_new_buffer(kbd_s,"key-bindings")
|
394
|
+
b = create_new_buffer(kbd_s, "key-bindings")
|
393
395
|
gui_set_file_lang(b.id, "hyperplaintext")
|
394
396
|
#
|
395
397
|
end
|
@@ -456,6 +458,11 @@ def minibuffer_delete()
|
|
456
458
|
$minibuffer.delete(BACKWARD_CHAR)
|
457
459
|
end
|
458
460
|
|
461
|
+
def error(str)
|
462
|
+
puts caller[0]
|
463
|
+
debug "#{caller[0]} ERROR: #{str}", 2
|
464
|
+
end
|
465
|
+
|
459
466
|
def message(s)
|
460
467
|
s = "[#{DateTime.now().strftime("%H:%M")}] #{s}"
|
461
468
|
debug s
|
@@ -502,16 +509,16 @@ def create_new_file(filename = nil, file_contents = "\n")
|
|
502
509
|
vma.kbd.set_mode_to_default
|
503
510
|
vma.buffers.set_current_buffer_by_id(buffer.id)
|
504
511
|
|
505
|
-
# Do set_content twice (once in Buffer.new) to force redraw and work around a bug
|
512
|
+
# Do set_content twice (once in Buffer.new) to force redraw and work around a bug
|
506
513
|
# The bug: if switching a child of scrolledWindow to a textview with a file smaller than the window, it won't get drawn properly if in previous (larger) file the ScrolledWindow was scrolled down.
|
507
514
|
buffer.set_content(file_contents)
|
508
515
|
|
509
516
|
return buffer
|
510
517
|
end
|
511
518
|
|
512
|
-
def create_new_buffer(file_contents = "\n",prefix="buf", setcurrent=true)
|
519
|
+
def create_new_buffer(file_contents = "\n", prefix = "buf", setcurrent = true)
|
513
520
|
debug "NEW BUFFER CREATED"
|
514
|
-
buffer = Buffer.new(file_contents,nil,prefix)
|
521
|
+
buffer = Buffer.new(file_contents, nil, prefix)
|
515
522
|
vma.buffers.add(buffer)
|
516
523
|
vma.buffers.set_current_buffer_by_id(buffer.id) if setcurrent
|
517
524
|
buffer.set_content(file_contents)
|
@@ -585,6 +592,10 @@ def open_new_file(filename, file_contents = "")
|
|
585
592
|
message "Switching to: #{filename}"
|
586
593
|
vma.buffers.set_current_buffer(b)
|
587
594
|
else
|
595
|
+
if !is_path_writable(filename)
|
596
|
+
message("Path #{filename} cannot be written to")
|
597
|
+
return false
|
598
|
+
end
|
588
599
|
message "New file opened: #{filename}"
|
589
600
|
fname = filename
|
590
601
|
bf = load_buffer(fname)
|
@@ -622,45 +633,7 @@ def get_file_line_pointer(s)
|
|
622
633
|
return nil
|
623
634
|
end
|
624
635
|
|
625
|
-
|
626
|
-
system("xdg-open", url)
|
627
|
-
end
|
628
|
-
|
629
|
-
def open_with_default_program(url)
|
630
|
-
system("xdg-open", url)
|
631
|
-
end
|
632
|
-
|
633
|
-
def run_cmd(cmd)
|
634
|
-
tmpf = Tempfile.new("vmarun", "/tmp").path
|
635
|
-
cmd = "#{cmd} > #{tmpf}"
|
636
|
-
debug "CMD:\n#{cmd}"
|
637
|
-
system("bash", "-c", cmd)
|
638
|
-
res_str = File.read(tmpf)
|
639
|
-
return res_str
|
640
|
-
end
|
641
|
-
|
642
|
-
require "open3"
|
643
|
-
|
644
|
-
def exec_cmd(bin_name, arg1 = nil, arg2 = nil, arg3 = nil, arg4 = nil, arg5 = nil)
|
645
|
-
assert_binary_exists(bin_name)
|
646
|
-
if !arg5.nil?
|
647
|
-
p = Open3.popen2(bin_name, arg1, arg2, arg3, arg4, arg5)
|
648
|
-
elsif !arg4.nil?
|
649
|
-
p = Open3.popen2(bin_name, arg1, arg2, arg3, arg4)
|
650
|
-
elsif !arg3.nil?
|
651
|
-
p = Open3.popen2(bin_name, arg1, arg2, arg3)
|
652
|
-
elsif !arg2.nil?
|
653
|
-
p = Open3.popen2(bin_name, arg1, arg2)
|
654
|
-
elsif !arg1.nil?
|
655
|
-
p = Open3.popen2(bin_name, arg1)
|
656
|
-
else
|
657
|
-
p = Open3.popen2(bin_name)
|
658
|
-
end
|
659
|
-
|
660
|
-
ret_str = p[1].read
|
661
|
-
return ret_str
|
662
|
-
end
|
663
|
-
|
636
|
+
# TODO: Implement using https://github.com/blackwinter/ruby-filemagic
|
664
637
|
def file_is_text_file(fpath)
|
665
638
|
debug "file_is_text_file(#{fpath})"
|
666
639
|
fpath = File.expand_path(fpath)
|
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)
|
@@ -313,9 +286,15 @@ class VMAgui
|
|
313
286
|
# Run proc after animated scrolling has stopped (e.g. after page down)
|
314
287
|
def run_after_scrolling(p)
|
315
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
|
316
294
|
while Time.now - @last_adj_time < 0.1
|
317
295
|
sleep 0.1
|
318
296
|
end
|
297
|
+
debug "SCROLLING ENDED", 2
|
319
298
|
run_as_idle p
|
320
299
|
}
|
321
300
|
end
|
@@ -346,6 +325,7 @@ class VMAgui
|
|
346
325
|
end
|
347
326
|
|
348
327
|
def handle_deltas()
|
328
|
+
view.delete_cursor_char
|
349
329
|
while d = buf.deltas.shift
|
350
330
|
pos = d[0]
|
351
331
|
op = d[1]
|
@@ -624,6 +604,7 @@ class VMAgui
|
|
624
604
|
@sw = Gtk::ScrolledWindow.new
|
625
605
|
@sw.set_policy(:automatic, :automatic)
|
626
606
|
|
607
|
+
|
627
608
|
@last_adj_time = Time.now
|
628
609
|
@sw.vadjustment.signal_connect("value-changed") { |x|
|
629
610
|
# pp x.page_increment
|
@@ -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)
|
@@ -34,6 +34,7 @@ class VSourceView < GtkSource::View
|
|
34
34
|
# puts "drag-data-received"
|
35
35
|
# puts
|
36
36
|
# if data.uris.size >= 1
|
37
|
+
|
37
38
|
# imgpath = CGI.unescape(data.uris[0])
|
38
39
|
# m = imgpath.match(/^file:\/\/(.*)/)
|
39
40
|
# if m
|
@@ -46,8 +47,14 @@ class VSourceView < GtkSource::View
|
|
46
47
|
|
47
48
|
# Mainly after page-up or page-down
|
48
49
|
signal_connect("move-cursor") do |widget, event|
|
49
|
-
|
50
|
-
|
50
|
+
if event.name == "GTK_MOVEMENT_PAGES" and (last_action == "page_up" or last_action == "page_down")
|
51
|
+
# Ripl.start :binding => binding
|
52
|
+
|
53
|
+
debug("MOVE-CURSOR", 2)
|
54
|
+
# $update_cursor = true
|
55
|
+
handle_scrolling()
|
56
|
+
end
|
57
|
+
|
51
58
|
# handle_scrolling()
|
52
59
|
# curpos = buffer.cursor_position
|
53
60
|
# debug "MOVE CURSOR (sig): #{curpos}"
|
@@ -110,47 +117,116 @@ class VSourceView < GtkSource::View
|
|
110
117
|
end
|
111
118
|
|
112
119
|
def register_signals()
|
120
|
+
check_controllers
|
113
121
|
|
114
|
-
#
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
122
|
+
# Implement mouse selections using @cnt_mo and @cnt_drag
|
123
|
+
@cnt_mo = Gtk::EventControllerMotion.new
|
124
|
+
self.add_controller(@cnt_mo)
|
125
|
+
@cnt_mo.signal_connect "motion" do |gesture, x, y|
|
126
|
+
if !@range_start.nil? and !x.nil? and !y.nil? and buf.visual_mode?
|
127
|
+
i = coord_to_iter(x, y, true)
|
128
|
+
@bufo.set_pos(i) if !i.nil? and @last_iter != i
|
129
|
+
@last_iter = i
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
@last_coord = nil
|
134
|
+
@cnt_drag = Gtk::GestureDrag.new
|
135
|
+
self.add_controller(@cnt_drag)
|
136
|
+
@cnt_drag.signal_connect "drag-begin" do |gesture, x, y|
|
137
|
+
debug "drag-begin", 2
|
138
|
+
i = coord_to_iter(x, y, true)
|
139
|
+
pp i
|
140
|
+
@range_start = i
|
141
|
+
if !buf.visual_mode?
|
142
|
+
buf.start_visual_mode
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
@cnt_drag.signal_connect "drag-end" do |gesture, offsetx, offsety|
|
147
|
+
debug "drag-end", 2
|
148
|
+
|
149
|
+
# Not enough drag
|
150
|
+
if offsetx.abs < 5 and offsety.abs < 5
|
151
|
+
buf.end_visual_mode
|
152
|
+
end
|
153
|
+
@range_start = nil
|
154
|
+
end
|
119
155
|
|
120
|
-
check_controllers
|
121
156
|
click = Gtk::GestureClick.new
|
122
157
|
click.set_propagation_phase(Gtk::PropagationPhase::CAPTURE)
|
123
158
|
self.add_controller(click)
|
124
159
|
# Detect mouse click
|
125
160
|
@click = click
|
161
|
+
|
162
|
+
@range_start = nil
|
126
163
|
click.signal_connect "pressed" do |gesture, n_press, x, y, z|
|
127
|
-
debug "SourceView, GestureClick x=#{x} y=#{y}"
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
164
|
+
debug "SourceView, GestureClick released x=#{x} y=#{y}"
|
165
|
+
|
166
|
+
if buf.visual_mode?
|
167
|
+
buf.end_visual_mode
|
168
|
+
end
|
132
169
|
|
133
170
|
xloc = (x - gutter_width).to_i
|
134
171
|
yloc = (y + visible_rect.y).to_i
|
135
172
|
debug "xloc=#{xloc} yloc=#{yloc}"
|
136
173
|
|
174
|
+
i = coord_to_iter(xloc, yloc)
|
175
|
+
# @range_start = i
|
176
|
+
|
137
177
|
# This needs to happen after xloc calculation, otherwise xloc gets a wrong value (around 200 bigger)
|
138
178
|
if vma.gui.current_view != self
|
139
179
|
vma.gui.set_current_view(self)
|
140
180
|
end
|
141
181
|
|
142
|
-
i
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
182
|
+
@bufo.set_pos(i) if !i.nil?
|
183
|
+
true
|
184
|
+
end
|
185
|
+
|
186
|
+
click.signal_connect "released" do |gesture, n_press, x, y, z|
|
187
|
+
debug "SourceView, GestureClick released x=#{x} y=#{y}"
|
188
|
+
|
189
|
+
xloc = (x - gutter_width).to_i
|
190
|
+
yloc = (y + visible_rect.y).to_i
|
191
|
+
debug "xloc=#{xloc} yloc=#{yloc}"
|
192
|
+
|
193
|
+
# This needs to happen after xloc calculation, otherwise xloc gets a wrong value (around 200 bigger)
|
194
|
+
if vma.gui.current_view != self
|
195
|
+
vma.gui.set_current_view(self)
|
148
196
|
end
|
149
197
|
|
198
|
+
i = coord_to_iter(xloc, yloc)
|
199
|
+
|
200
|
+
# if i != @range_start
|
201
|
+
# debug "RANGE #{[@range_start, i]}", 2
|
202
|
+
# end
|
203
|
+
|
204
|
+
@bufo.set_pos(i) if !i.nil?
|
205
|
+
# @range_start = nil
|
150
206
|
true
|
151
207
|
end
|
152
208
|
end
|
153
209
|
|
210
|
+
def coord_to_iter(xloc, yloc, transform_coord = false)
|
211
|
+
if transform_coord
|
212
|
+
xloc = (xloc - gutter_width).to_i
|
213
|
+
yloc = (yloc + visible_rect.y).to_i
|
214
|
+
end
|
215
|
+
|
216
|
+
# Try to get exact character position
|
217
|
+
i = get_iter_at_location(xloc, yloc)
|
218
|
+
|
219
|
+
# If doesn't work, at least get the start of correct line
|
220
|
+
# TODO: sometimes end of line is better choice
|
221
|
+
if i.nil?
|
222
|
+
r = get_line_at_y(yloc)
|
223
|
+
i = r[0] if !r.nil?
|
224
|
+
end
|
225
|
+
|
226
|
+
return i.offset if !i.nil?
|
227
|
+
return nil
|
228
|
+
end
|
229
|
+
|
154
230
|
def handle_scrolling()
|
155
231
|
delete_cursorchar
|
156
232
|
# curpos = buffer.cursor_position
|
@@ -158,18 +234,13 @@ class VSourceView < GtkSource::View
|
|
158
234
|
return nil if vma.gui.nil?
|
159
235
|
return nil if @bufo.nil?
|
160
236
|
vma.gui.run_after_scrolling proc {
|
237
|
+
debug "START UPDATE POS AFTER SCROLLING", 2
|
161
238
|
delete_cursorchar
|
162
239
|
bc = window_to_buffer_coords(Gtk::TextWindowType::WIDGET, gutter_width + 2, 60)
|
163
240
|
if !bc.nil?
|
164
|
-
|
165
|
-
i = get_iter_at_location(bc[0], bc[1])
|
166
|
-
if i.nil?
|
167
|
-
# If doesn't work, at least get the start of correct line
|
168
|
-
i = get_line_at_y(bc[1])
|
169
|
-
i = i[0]
|
170
|
-
end
|
241
|
+
i = coord_to_iter(bc[0], bc[1])
|
171
242
|
if !i.nil?
|
172
|
-
@bufo.set_pos(i
|
243
|
+
@bufo.set_pos(i)
|
173
244
|
end
|
174
245
|
end
|
175
246
|
$update_cursor = false
|
@@ -342,8 +413,6 @@ class VSourceView < GtkSource::View
|
|
342
413
|
itr2 = buffer.get_iter_at(:offset => pos + 1)
|
343
414
|
buffer.place_cursor(itr)
|
344
415
|
|
345
|
-
# $view.signal_emit("extend-selection", Gtk::MovementStep.new(:PAGES), -1, false)
|
346
|
-
|
347
416
|
within_margin = 0.075 #margin as a [0.0,0.5) fraction of screen size
|
348
417
|
use_align = false
|
349
418
|
xalign = 0.5 #0.0=top 1.0=bottom, 0.5=center
|
@@ -358,9 +427,6 @@ class VSourceView < GtkSource::View
|
|
358
427
|
$idle_scroll_to_mark = true
|
359
428
|
ensure_cursor_visible
|
360
429
|
|
361
|
-
# scroll_to_iter(itr, within_margin, use_align, xalign, yalign)
|
362
|
-
|
363
|
-
# $view.signal_emit("extend-selection", Gtk::TextExtendSelection.new, itr,itr,itr2)
|
364
430
|
draw_cursor
|
365
431
|
|
366
432
|
return true
|
@@ -477,9 +543,9 @@ class VSourceView < GtkSource::View
|
|
477
543
|
end
|
478
544
|
# elsif @bufo.visual_mode?
|
479
545
|
elsif ctype == :visual
|
480
|
-
debug "VISUAL MODE"
|
546
|
+
# debug "VISUAL MODE"
|
481
547
|
(_start, _end) = @bufo.get_visual_mode_range2
|
482
|
-
debug "#{_start}, #{_end}"
|
548
|
+
# debug "#{_start}, #{_end}"
|
483
549
|
itr = buffer.get_iter_at(:offset => _start)
|
484
550
|
itr2 = buffer.get_iter_at(:offset => _end + 1)
|
485
551
|
# Pango-CRITICAL **: pango_layout_get_cursor_pos: assertion 'index >= 0 && index <= layout->length' failed
|
@@ -1,8 +1,10 @@
|
|
1
1
|
def hpt_check_cur_word(w)
|
2
2
|
debug "check_cur_word(w)"
|
3
|
-
m = w.match(/⟦(.*)⟧/)
|
3
|
+
m = w.match(/⟦((audio|img):)(.*)⟧/)
|
4
4
|
if m
|
5
|
-
|
5
|
+
# Ripl.start :binding => binding
|
6
|
+
|
7
|
+
fpfx = m[3]
|
6
8
|
if vma.buf.fname
|
7
9
|
dn = File.dirname(vma.buf.fname)
|
8
10
|
|
@@ -23,8 +25,13 @@ def hpt_check_cur_word(w)
|
|
23
25
|
end
|
24
26
|
|
25
27
|
if fn
|
26
|
-
|
27
|
-
|
28
|
+
if m[2] == "audio"
|
29
|
+
# Thread.new { Audio.play(fn) }
|
30
|
+
Audio.play(fn)
|
31
|
+
else
|
32
|
+
message "HPT opening file #{fn}"
|
33
|
+
return fn
|
34
|
+
end
|
28
35
|
# open_existing_file(fn)
|
29
36
|
# return true
|
30
37
|
else
|
data/lib/vimamsa/key_actions.rb
CHANGED
@@ -104,6 +104,10 @@ reg_act(:execute_current_line_in_terminal_autoclose, proc { buf.execute_current_
|
|
104
104
|
reg_act(:show_images, proc { hpt_scan_images() }, "Show images inserted with ⟦img:file.png⟧ syntax")
|
105
105
|
reg_act(:delete_current_file, proc { bufs.delete_current_buffer() }, "Delete current file")
|
106
106
|
|
107
|
+
|
108
|
+
reg_act(:audio_stop, proc { Audio.stop }, "Stop audio playback")
|
109
|
+
|
110
|
+
|
107
111
|
act_list = {
|
108
112
|
# File handling
|
109
113
|
:buf_save => { :proc => proc { buf.save },
|
@@ -267,7 +267,12 @@ class KeyBindingTree
|
|
267
267
|
for st in @state_trail
|
268
268
|
st = st[0] if st.class == Array
|
269
269
|
if first
|
270
|
-
|
270
|
+
trailpfx = ""
|
271
|
+
if !st.major_modes.empty?
|
272
|
+
mmid = st.major_modes.first
|
273
|
+
trailpfx = "#{@modes[mmid].to_s}>"
|
274
|
+
end
|
275
|
+
s_trail << "[#{trailpfx}#{st.to_s}]"
|
271
276
|
else
|
272
277
|
s_trail << " #{st.to_s}"
|
273
278
|
end
|
@@ -475,6 +480,7 @@ class KeyBindingTree
|
|
475
480
|
end
|
476
481
|
|
477
482
|
def handle_key_bindigs_action(action, c)
|
483
|
+
$acth << action
|
478
484
|
$method_handles_repeat = false #TODO:??
|
479
485
|
n = 1
|
480
486
|
if $next_command_count and !(action.class == String and action.include?("set_next_command_count"))
|
@@ -531,7 +537,7 @@ def exec_action(action)
|
|
531
537
|
$kbd.last_action = $kbd.cur_action
|
532
538
|
$kbd.cur_action = action
|
533
539
|
if action.class == Symbol
|
534
|
-
return
|
540
|
+
return call_action(action)
|
535
541
|
elsif action.class == Proc
|
536
542
|
return action.call
|
537
543
|
else
|
@@ -3,6 +3,8 @@ vma.kbd.add_mode("I", :insert, :insert)
|
|
3
3
|
vma.kbd.add_mode("V", :visual, :visual)
|
4
4
|
vma.kbd.add_mode("M", :minibuffer) #TODO: needed?
|
5
5
|
vma.kbd.add_mode("R", :readchar)
|
6
|
+
# vma.kbd.add_mode("audio", :audio, :command)
|
7
|
+
vma.kbd.add_minor_mode("audio", :audio, :command)
|
6
8
|
vma.kbd.add_mode("B", :browse, :command)
|
7
9
|
vma.kbd.add_mode("X", :replace, :command, name: "Replace")
|
8
10
|
vma.kbd.set_default_mode(:command)
|
@@ -49,6 +51,15 @@ bindkey "C , b", :start_buf_manager
|
|
49
51
|
bindkey "C , w", :toggle_active_window
|
50
52
|
bindkey "C , , w", :toggle_two_column
|
51
53
|
|
54
|
+
bindkey "C , u s", :audio_stop
|
55
|
+
bindkey "C m a", "vma.kbd.set_mode(:audio)"
|
56
|
+
bindkey "audio s", :audio_stop
|
57
|
+
bindkey "audio space", :audio_stop
|
58
|
+
bindkey "audio q || audio esc", "vma.kbd.set_mode_to_default"
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
|
52
63
|
# bindkey "C , f o", :open_file_dialog
|
53
64
|
bindkey "CI ctrl-o", :open_file_dialog
|
54
65
|
# bindkey "M enter", :minibuffer_end
|
@@ -63,7 +74,7 @@ bindkey "C z ", :start_browse_mode
|
|
63
74
|
bindkey "B h", :history_switch_backwards
|
64
75
|
bindkey "B l", :history_switch_forwards
|
65
76
|
#bindkey 'B z', :center_on_current_line
|
66
|
-
bindkey "B z", "center_on_current_line();
|
77
|
+
bindkey "B z", "center_on_current_line();call_action(:exit_browse_mode)"
|
67
78
|
bindkey "B enter || B return || B esc || B j || B ctrl!", :exit_browse_mode
|
68
79
|
bindkey "B s", :page_up
|
69
80
|
bindkey "B d", :page_down
|
@@ -162,6 +173,7 @@ default_keys = {
|
|
162
173
|
"C , d b" => "debug_print_buffer",
|
163
174
|
"C , d c" => "debug_dump_clipboard",
|
164
175
|
"C , d d" => "debug_dump_deltas",
|
176
|
+
|
165
177
|
"VC O" => "buf.jump(END_OF_LINE)",
|
166
178
|
"VC $" => "buf.jump(END_OF_LINE)",
|
167
179
|
|
@@ -197,6 +209,7 @@ default_keys = {
|
|
197
209
|
"C d $" => "buf.delete2(:to_line_end)",
|
198
210
|
# 'C d e'=> 'buf.delete_to_next_word_end',
|
199
211
|
"C d <num> e" => "delete_next_word",
|
212
|
+
"C d ' <char>" => "buf.delete2(:to_mark,<char>)",
|
200
213
|
"C r <char>" => "buf.replace_with_char(<char>)", # TODO
|
201
214
|
"C , l b" => "load_buffer_list",
|
202
215
|
"C , l l" => "save_buffer_list",
|
data/lib/vimamsa/main.rb
CHANGED
data/lib/vimamsa/rbvma.rb
CHANGED
@@ -68,6 +68,24 @@ def gui_grep()
|
|
68
68
|
gui_one_input_action("Grep", "Search:", "grep", callback)
|
69
69
|
end
|
70
70
|
|
71
|
+
def highlight_match(bf, str, color: "#aa0000ff")
|
72
|
+
vbuf = bf.view.buffer
|
73
|
+
r = Regexp.new(Regexp.escape(str), Regexp::IGNORECASE)
|
74
|
+
|
75
|
+
hlparts = []
|
76
|
+
|
77
|
+
tt = vma.gui.view.buffer.create_tag("highlight_match_tag")
|
78
|
+
tt.weight = 650
|
79
|
+
tt.foreground = color
|
80
|
+
|
81
|
+
ind = scan_indexes(bf, r)
|
82
|
+
ind.each { |x|
|
83
|
+
itr = vbuf.get_iter_at(:offset => x)
|
84
|
+
itr2 = vbuf.get_iter_at(:offset => x + str.size)
|
85
|
+
vbuf.apply_tag(tt, itr, itr2)
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
71
89
|
def grep_cur_buffer(search_str, b = nil)
|
72
90
|
debug "grep_cur_buffer(search_str)"
|
73
91
|
lines = vma.buf.split("\n")
|
@@ -76,18 +94,21 @@ def grep_cur_buffer(search_str, b = nil)
|
|
76
94
|
fpath = vma.buf.pathname.expand_path.to_s + ":" if vma.buf.pathname
|
77
95
|
res_str = ""
|
78
96
|
|
97
|
+
hlparts = []
|
79
98
|
$grep_matches = []
|
80
99
|
lines.each_with_index { |l, i|
|
81
100
|
if r.match(l)
|
82
|
-
|
83
|
-
|
101
|
+
res_str << "#{i + 1}:"
|
102
|
+
# ind = scan_indexes(l, r)
|
103
|
+
res_str << "#{l}\n"
|
84
104
|
$grep_matches << i + 1 # Lines start from index 1
|
85
105
|
end
|
86
106
|
}
|
87
107
|
$grep_bufid = vma.buffers.current_buf
|
88
|
-
b =
|
89
|
-
|
90
|
-
|
108
|
+
b = create_new_buffer(res_str, "grep")
|
109
|
+
vbuf = vma.gui.view.buffer
|
110
|
+
|
111
|
+
highlight_match(b, search_str, color: "#10bd8e")
|
91
112
|
|
92
113
|
b.line_action_handler = proc { |lineno|
|
93
114
|
debug "GREP HANDLER:#{lineno}"
|
@@ -99,10 +120,6 @@ def grep_cur_buffer(search_str, b = nil)
|
|
99
120
|
}
|
100
121
|
end
|
101
122
|
|
102
|
-
# def invoke_grep_search()
|
103
|
-
# start_minibuffer_cmd("", "", :grep_cur_buffer)
|
104
|
-
# end
|
105
|
-
|
106
123
|
def gui_one_input_action(title, field_label, button_title, callback, opt = {})
|
107
124
|
a = OneInputAction.new(nil, title, field_label, button_title, callback, opt)
|
108
125
|
a.run
|
@@ -188,6 +205,13 @@ module Gtk
|
|
188
205
|
end
|
189
206
|
end
|
190
207
|
|
208
|
+
def set_margin_all(widget, m)
|
209
|
+
widget.margin_bottom = m
|
210
|
+
widget.margin_top = m
|
211
|
+
widget.margin_end = m
|
212
|
+
widget.margin_start = m
|
213
|
+
end
|
214
|
+
|
191
215
|
class OneInputAction
|
192
216
|
def initialize(main_window, title, field_label, button_title, callback, opt = {})
|
193
217
|
@window = Gtk::Window.new()
|
data/lib/vimamsa/util.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
require "open3"
|
2
|
+
|
3
|
+
|
1
4
|
# Run idle proc once
|
2
|
-
# Delay execution of proc until Gtk has fully processed the last calls.
|
5
|
+
# Delay execution of proc until Gtk has fully processed the last calls.
|
3
6
|
def run_as_idle(p)
|
4
7
|
if p.class == Proc
|
5
8
|
Thread.new {
|
@@ -8,6 +11,48 @@ def run_as_idle(p)
|
|
8
11
|
end
|
9
12
|
end
|
10
13
|
|
14
|
+
def open_url(url)
|
15
|
+
system("xdg-open", url)
|
16
|
+
end
|
17
|
+
|
18
|
+
def open_with_default_program(url)
|
19
|
+
system("xdg-open", url)
|
20
|
+
end
|
21
|
+
|
22
|
+
def run_cmd(cmd)
|
23
|
+
tmpf = Tempfile.new("vmarun", "/tmp").path
|
24
|
+
cmd = "#{cmd} > #{tmpf}"
|
25
|
+
debug "CMD:\n#{cmd}"
|
26
|
+
system("bash", "-c", cmd)
|
27
|
+
res_str = File.read(tmpf)
|
28
|
+
return res_str
|
29
|
+
end
|
30
|
+
|
31
|
+
def exec_cmd(bin_name, arg1 = nil, arg2 = nil, arg3 = nil, arg4 = nil, arg5 = nil)
|
32
|
+
assert_binary_exists(bin_name)
|
33
|
+
if !arg5.nil?
|
34
|
+
p = Open3.popen2(bin_name, arg1, arg2, arg3, arg4, arg5)
|
35
|
+
elsif !arg4.nil?
|
36
|
+
p = Open3.popen2(bin_name, arg1, arg2, arg3, arg4)
|
37
|
+
elsif !arg3.nil?
|
38
|
+
p = Open3.popen2(bin_name, arg1, arg2, arg3)
|
39
|
+
elsif !arg2.nil?
|
40
|
+
p = Open3.popen2(bin_name, arg1, arg2)
|
41
|
+
elsif !arg1.nil?
|
42
|
+
p = Open3.popen2(bin_name, arg1)
|
43
|
+
else
|
44
|
+
p = Open3.popen2(bin_name)
|
45
|
+
end
|
46
|
+
|
47
|
+
ret_str = p[1].read
|
48
|
+
return ret_str
|
49
|
+
end
|
50
|
+
|
51
|
+
def mkdir_if_not_exists(_dirpath)
|
52
|
+
dirpath = File.expand_path(_dirpath)
|
53
|
+
Dir.mkdir(dirpath) unless File.exist?(dirpath)
|
54
|
+
end
|
55
|
+
|
11
56
|
class HSafe
|
12
57
|
def initialize(hash)
|
13
58
|
@h = hash
|
@@ -139,6 +184,16 @@ def read_file(text, path)
|
|
139
184
|
return content
|
140
185
|
end
|
141
186
|
|
187
|
+
def sanitize_input(str)
|
188
|
+
if str.encoding != Encoding::UTF_8
|
189
|
+
str = text.encode(Encoding::UTF_8)
|
190
|
+
end
|
191
|
+
str.gsub!(/\r\n/, "\n")
|
192
|
+
return str
|
193
|
+
end
|
194
|
+
|
195
|
+
|
196
|
+
|
142
197
|
def is_url(s)
|
143
198
|
return s.match(/(https?|file):\/\/.*/) != nil
|
144
199
|
end
|
data/lib/vimamsa/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vimamsa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sami Sieranoja
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-10-
|
11
|
+
date: 2023-10-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -190,6 +190,7 @@ files:
|
|
190
190
|
- lib/vimamsa.rb
|
191
191
|
- lib/vimamsa/ack.rb
|
192
192
|
- lib/vimamsa/actions.rb
|
193
|
+
- lib/vimamsa/audio.rb
|
193
194
|
- lib/vimamsa/buffer.rb
|
194
195
|
- lib/vimamsa/buffer_list.rb
|
195
196
|
- lib/vimamsa/buffer_manager.rb
|