vimamsa 0.1.19 → 0.1.20

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d29e057a168e6c2152c0d8da4c6957b863bd44e7dd9328ba2d5520ae11ab49a2
4
- data.tar.gz: 4cdad5268d59c11e83335818bbcdd5627fe3e75045ab2602f84fd0d7440c6d7d
3
+ metadata.gz: 6b635655f9d50eb870f5593b8d2e63cfacff5ed0aece9b197ca8805622799ab0
4
+ data.tar.gz: 8c579b33d9d5e5d48c25fef3da47ca77eb9ba9bf713cf7c2895c1af5e2cf2d30
5
5
  SHA512:
6
- metadata.gz: c9ac4b15042dd07cab99b7be0859e714684073ff4438b8048f33bd9c21779b545d61f1ff17608d1ab15fe2e31a356e2af24df6002d027621958776b42c568db8
7
- data.tar.gz: afdf6cab6f002f925542831c7e439eace41b9fd4217e8f659d9774e2c7609309ba55e1d1042447d0c091437ab379ca76c0c6fb515c7a90a7720603f1bad68b89
6
+ metadata.gz: 1027546a7e21d7832e546f4ccd7eb9064aece5b7c13bef4d83477082351b2cc74e136c952999c69de70581aa651af2a5e8fd14960a1b52c91a0d0a7d08bd530c
7
+ data.tar.gz: 3784552302bd4f7541320785f250fe9c4aa36e6bcd7d1317f9f85b776900211a1f7d5644891de6ae224703dca6ce9c0eda12fc894d1d4f73523e6bd149b6aebf
data/custom_example.rb CHANGED
@@ -4,6 +4,7 @@
4
4
  # c = Converter.new(lambda { |x| h = {}; x.split(/\s+/).each { |y| h[y] = 1 }; h.keys.join(" ") }, :lambda, :uniqwords)
5
5
 
6
6
  # Eval selected text as ruby code (e.g. use as calculator)
7
+
7
8
  # bindkey "V , e", "vma.buf.convert_selected_text(:eval)"
8
9
  # syntax: bindkey "mode key1 key2 ..."
9
10
 
@@ -26,7 +27,6 @@
26
27
 
27
28
 
28
29
 
29
-
30
30
  def insert_date()
31
31
  # $buffer.insert_txt("#{DateTime.now().strftime("==========\n%Y-%m-%d")}\n")
32
32
  vma.buf.insert_txt("#{DateTime.now().strftime("%Y-%m-%d")}\n")
@@ -6,6 +6,11 @@ require 'mkmf'
6
6
  module_name = "vimamsa"
7
7
  extension_name = 'vmaext'
8
8
 
9
+ # $CFLAGS << " -Wall -fpermissive "
10
+ # $CXXFLAGS << " -Wall -fpermissive "
11
+
12
+ # have_library( 'stdc++' );
13
+
9
14
  dir_config(extension_name) # The destination
10
15
  create_makefile(extension_name) # Create Makefile
11
16
 
data/lib/vimamsa/ack.rb CHANGED
@@ -4,21 +4,13 @@ class FileContentSearch
4
4
  def self.start_gui()
5
5
  search_paths = vma.get_content_search_paths.join("<br/>")
6
6
 
7
- nfo = "<span size='x-large'>Search contents of text files</span>
8
- Will search all .txt files in the following directories:
9
- #{search_paths}
10
-
11
- <span>Hint: add empty file named .vma_project to directories you want to search in.
12
- If .vma_project exists in parent directory of current file, searches within that directory.
13
- </span>"
14
-
15
7
  callback = proc { |x| FileContentSearch.search_buffer(x) }
16
8
 
17
9
  params = {}
18
10
  params["inputs"] = {}
19
11
  params["inputs"]["search"] = { :label => "Search:", :type => :entry }
20
12
  params["inputs"]["extensions"] = { :label => "Limit to file extensions:", :type => :entry }
21
- params["inputs"]["extensions"][:initial_text] = conf(:default_search_extensions).join(",")
13
+ params["inputs"]["extensions"][:initial_text] = cnf.default_search_extensions!.join(",")
22
14
  params["inputs"]["btn1"] = { :label => "Search", :type => :button }
23
15
 
24
16
  params[:callback] = callback
@@ -92,17 +84,12 @@ end
92
84
  def gui_ack()
93
85
  search_paths = vma.get_content_search_paths.join("<br/>")
94
86
 
95
- nfo = "<html><h2>Search contents of all files using ack</h2>
96
- <div style='width:300px'>
97
- <p>Hint: add empty file named .vma_project to dirs you want to search.</p>\n<p>If .vma_project exists in parent dir of current file, searches within that dir</p></div></html>"
98
-
99
87
  nfo = "<span size='x-large'>Search contents of all files using ack</span>
100
88
  Will search the following directories:
101
89
  #{search_paths}
102
90
 
103
- <span>Hint: add empty file named .vma_project to directories you want to search in.
104
- If .vma_project exists in parent directory of current file, searches within that directory.
105
- </span>"
91
+ <span>Note: Directory determined automatically as the first parent directory of a last accessed file which includes file/dir named .git or .vma_project. Or, if not found, the last accessed directory.
92
+ </span>"
106
93
 
107
94
  callback = proc { |x| Ack.new.ack_buffer(x) }
108
95
  gui_one_input_action(nfo, "Search:", "search", callback)
@@ -151,6 +138,10 @@ class Ack
151
138
  end
152
139
 
153
140
  def ack_buffer(_instr, b = nil)
141
+ if _instr.nil? or _instr.strip.size <= 1
142
+ message("No input for ack")
143
+ return
144
+ end
154
145
  instr = Shellwords.escape(_instr)
155
146
  bufstr = ""
156
147
  for path in vma.get_content_search_paths
@@ -271,7 +271,7 @@ class Buffer < String
271
271
 
272
272
  def unindent
273
273
  debug("unindent", 2)
274
- conf(:tab_width).times {
274
+ cnf.tab.width!.times {
275
275
  p = @pos - 1
276
276
  if p >= 0
277
277
  if self[p] == " "
@@ -754,7 +754,7 @@ class Buffer < String
754
754
  end
755
755
 
756
756
  def update_highlights(pos, changeamount, changestr)
757
- return if !self.is_highlighted # $cnf[:syntax_highlight]
757
+ return if !self.is_highlighted
758
758
  lpos, cpos = get_line_and_col_pos(pos)
759
759
  if @highlights and @highlights[lpos]
760
760
  hl = @highlights[lpos]
@@ -1063,7 +1063,11 @@ class Buffer < String
1063
1063
  # message("Open link #{word}")
1064
1064
  linep = get_file_line_pointer(word)
1065
1065
  debug "linep'#{linep}'"
1066
- path = File.expand_path(word)
1066
+ if word[0] != "/" and word[0] != "~"
1067
+ path = File.expand_path("#{bufs.last_dir}/#{word}")
1068
+ else
1069
+ path = File.expand_path(word)
1070
+ end
1067
1071
  wtype = nil
1068
1072
  if is_url(word)
1069
1073
  wtype = :url
@@ -1089,7 +1093,7 @@ class Buffer < String
1089
1093
  return [fn, :hpt_link]
1090
1094
  end
1091
1095
  end
1092
-
1096
+
1093
1097
  return [word, wtype]
1094
1098
  end
1095
1099
 
@@ -1158,7 +1162,7 @@ class Buffer < String
1158
1162
  c = c.force_encoding("UTF-8"); #TODO:correct?
1159
1163
 
1160
1164
  c = "\n" if c == "\r"
1161
- if $cnf[:indent_based_on_last_line] and c == "\n" and @lpos > 0
1165
+ if cnf.indent_based_on_last_line? and c == "\n" and @lpos > 0
1162
1166
  # Indent start of new line based on last line
1163
1167
  last_line = line(@lpos)
1164
1168
  m = /^( +)([^ ]+|$)/.match(last_line)
@@ -1593,3 +1597,4 @@ def backup_all_buffers()
1593
1597
  end
1594
1598
  message("Backup all buffers")
1595
1599
  end
1600
+
@@ -264,7 +264,7 @@ class Buffer < String
264
264
  convert = cnf.tab.to_spaces_default?
265
265
  convert = true if cnf.tab.to_spaces_languages?.include?(@lang)
266
266
  convert = false if cnf.tab.to_spaces_not_languages?.include?(@lang)
267
- tw = conf(:tab_width)
267
+ tw = cnf.tab.width!
268
268
  if convert
269
269
  indent_to = (@cpos / tw) * tw + tw
270
270
  indentdiff = indent_to - @cpos
@@ -65,7 +65,7 @@ class BufferList
65
65
  # TODO: implement using heap/priorityque
66
66
  @list.sort_by! { |x| x.access_time }
67
67
  end
68
-
68
+
69
69
  def each(&block)
70
70
  for x in slist
71
71
  block.call(x)
@@ -187,21 +187,55 @@ class BufferList
187
187
  @navigation_idx = 0
188
188
  end
189
189
 
190
- def history_switch_backwards
191
- @navigation_idx += 1
190
+ def history_switch(dir = -1)
191
+ # -1: from newest towards oldest
192
+ # +1: from oldest towards newest
193
+
194
+ @navigation_idx += dir * -1
192
195
  @navigation_idx = 0 if @navigation_idx >= list.size
196
+ @navigation_idx = list.size - 1 if @navigation_idx < 0
197
+
198
+ # most recent is at end of slist
193
199
  b = slist[-1 - @navigation_idx]
194
- debug "IND:#{@navigation_idx} RECENT:#{slist.collect { |x| x.fname }.join(" ")}"
200
+ puts "@navigation_idx=#{@navigation_idx}"
201
+ non_active = slist.select{|x|!x.is_active?}
202
+ return if non_active.size == 0
203
+
204
+ # Take another one from the history if buffer is already open in a window (active)
205
+ navtmp = @navigation_idx
206
+ i = 1
207
+ while b.is_active?
208
+ pp "b.is_active b=#{b.id}"
209
+ navtmp += dir * -1
210
+ b = slist[-1 - navtmp]
211
+ if b.nil? # went past the beginning or end of array slist
212
+ # Start from the end
213
+ if navtmp != 0 and dir == -1 # did not already start from the end
214
+ navtmp = 0
215
+ i = 0
216
+ b = slist[-1 - navtmp]
217
+ elsif navtmp == list.size and dir == 1
218
+ navtmp = list.size
219
+ i = 0
220
+ b = slist[-1 - navtmp]
221
+ else
222
+ return # No buffer exists which is not active already
223
+ end
224
+ end
225
+ i += 1
226
+ end
227
+ @navigation_idx = navtmp
228
+
229
+ pp "IND:#{@navigation_idx} RECENT:#{slist.collect { |x| x.fname }.join("\n")}"
195
230
  set_current_buffer(b.id, false)
196
231
  end
197
232
 
198
- def history_switch_forwards()
199
- @navigation_idx -= 1
200
- @navigation_idx = list.size - 1 if @navigation_idx < 0
233
+ def history_switch_backwards()
234
+ history_switch(-1)
235
+ end
201
236
 
202
- b = slist[-1 - @navigation_idx]
203
- debug "IND:#{@navigation_idx} RECENT:#{slist.collect { |x| x.fname }.join(" ")}"
204
- set_current_buffer(b.id, false)
237
+ def history_switch_forwards()
238
+ history_switch(+1)
205
239
  end
206
240
 
207
241
  def get_last_non_active_buffer
data/lib/vimamsa/conf.rb CHANGED
@@ -1,43 +1,36 @@
1
- $cnf = {} # TODO
2
1
 
3
- def conf(id)
4
- return $cnf[id]
5
- end
6
-
7
- def set_conf(id, val)
8
- $cnf[id] = val
9
- end
10
-
11
- def setcnf(id, val)
12
- set_conf(id, val)
13
- end
14
-
15
- setcnf :custom_lsp, {}
16
-
17
- setcnf :indent_based_on_last_line, true
18
- setcnf :extensions_to_open, [".txt", ".h", ".c", ".cpp", ".hpp", ".rb", ".inc", ".php", ".sh", ".m", ".gd", ".js", ".py"]
19
- setcnf :default_search_extensions, ["txt", "rb"]
20
-
21
- setcnf "log.verbose", 1
22
- setcnf :enable_lsp, false
23
-
24
- setcnf :tab_width, 2
25
- setcnf :tab_to_spaces_default, false
26
- setcnf :tab_to_spaces_languages, ["c", "java", "ruby", "hyperplaintext", "php"]
27
- setcnf :tab_to_spaces_not_languages, ["makefile"]
28
-
29
- setcnf :workspace_folders, []
30
-
31
-
32
- # New way to configure:
33
- # To set conf value:
2
+ # Set conf value by:
34
3
  # cnf.foo.bar.baz = 3
35
4
 
36
- #To get conf value:
5
+ # Get conf value by:
37
6
  # cnf.foo.bar.baz?
38
7
  # cnf.foo.bar.baz!
39
8
  # get(cnf.foo.bar.baz)
40
- # (All get the same result)
9
+ # (All ways get the same result)
10
+
11
+ $confh = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }
12
+ # set cnf.foo.bar.baz, 3
13
+ # => $confh = {:foo=>{:bar=>{:baz=>3}}}
14
+ def set(_id, val)
15
+ a = $confh
16
+ id = _id.to_a
17
+ last = id.pop
18
+ for x in id
19
+ a = a[x]
20
+ end
21
+ a[last] = val
22
+ end
23
+
24
+ def get(id)
25
+ id = id.to_a
26
+ a = $confh
27
+ for x in id
28
+ return nil if a[x].nil?
29
+ return nil if a.empty?
30
+ a = a[x]
31
+ end
32
+ return a
33
+ end
41
34
 
42
35
  class ConfId
43
36
  def initialize(first)
@@ -104,32 +97,6 @@ class Conf
104
97
  end
105
98
  end
106
99
 
107
-
108
-
109
- $confh = Hash.new { |h, k| h[k] = Hash.new(&h.default_proc) }
110
- # set cnf.foo.bar.baz, 3
111
- # => $confh = {:foo=>{:bar=>{:baz=>3}}}
112
- def set(_id, val)
113
- a = $confh
114
- id = _id.to_a
115
- last = id.pop
116
- for x in id
117
- a = a[x]
118
- end
119
- a[last] = val
120
- end
121
-
122
- def get(id)
123
- id = id.to_a
124
- a = $confh
125
- for x in id
126
- return nil if a[x].nil?
127
- return nil if a.empty?
128
- a = a[x]
129
- end
130
- return a
131
- end
132
-
133
100
  $vimamsa_conf = Conf.new
134
101
 
135
102
  def cnf()
@@ -158,6 +125,7 @@ cnf.lsp.enabled = false
158
125
  cnf.font.size = 11
159
126
  cnf.font.family = "Monospace"
160
127
 
128
+ cnf.startup_file=false
161
129
 
162
130
  cnf.macro.animation_delay = 0.02
163
131
 
data/lib/vimamsa/debug.rb CHANGED
@@ -63,7 +63,7 @@ def savedebug(message, e)
63
63
  dbginfo["trace"] = e.backtrace() if e
64
64
  dbginfo["trace_str"] = dbginfo["trace"].join("\n")
65
65
  dbginfo["edit_history"] = buf.edit_history
66
- dbginfo["cnf"] = $cnf
66
+ dbginfo["cnf"] = $vimamsa_conf
67
67
  dbginfo["register"] = vma.register
68
68
  dbginfo["clipboard"] = vma.clipboard
69
69
  # dbginfo["last_event"] = $last_event
@@ -91,37 +91,29 @@ class Editor
91
91
 
92
92
  @gui.init_menu
93
93
 
94
- mkdir_if_not_exists("~/.config/vimamsa")
95
- mkdir_if_not_exists("~/.config/vimamsa/backup")
96
- mkdir_if_not_exists("~/.config/vimamsa/listen")
97
- listen_dir = File.expand_path "~/.config/vimamsa/listen"
94
+ mkdir_if_not_exists(get_dot_path(""))
95
+ mkdir_if_not_exists(get_dot_path("backup"))
96
+ mkdir_if_not_exists(get_dot_path("testfoobar")) #TODO
97
+ listen_dir = get_dot_path("listen")
98
+ mkdir_if_not_exists(listen_dir)
98
99
  listener = Listen.to(listen_dir) do |modified, added, removed|
99
100
  debug([modified: modified, added: added, removed: removed])
100
101
  open_file_listener(added)
101
102
  end
102
103
  listener.start
103
104
 
104
- custom_fn = File.expand_path("~/.config/vimamsa/custom.rb")
105
+ custom_fn = get_dot_path("custom.rb")
105
106
  if !File.exist?(custom_fn)
106
107
  example_custom = IO.read(ppath("custom_example.rb"))
107
108
  IO.write(custom_fn, example_custom)
108
109
  end
109
110
 
110
- mkdir_if_not_exists("~/.config/vimamsa/custom.rb")
111
-
112
- $cnf[:theme] = "Twilight_edit"
113
- $cnf[:syntax_highlight] = true
114
111
  settings_path = get_dot_path("settings.rb")
115
112
  if File.exist?(settings_path)
116
- $cnf = eval(IO.read(settings_path))
113
+ # = eval(IO.read(settings_path))
114
+ #TODO
117
115
  end
118
116
 
119
- # set_gui_style(1)
120
-
121
- #TODO: remove
122
- dotfile = read_file("", "~/.config/vimamsarc")
123
- eval(dotfile) if dotfile
124
-
125
117
  custom_script = read_file("", custom_fn)
126
118
  eval(custom_script) if custom_script
127
119
 
@@ -137,13 +129,12 @@ class Editor
137
129
  require "vimamsa/langservp"
138
130
  @langsrv["ruby"] = LangSrv.new("ruby")
139
131
  @langsrv["cpp"] = LangSrv.new("cpp")
132
+ #TODO: if language enabled in config?
140
133
  end
141
134
 
142
- # build_options
143
-
144
135
  fname = nil
145
- if conf(:startup_file)
146
- fname_ = File.expand_path(conf(:startup_file))
136
+ if cnf.startup_file?
137
+ fname_ = File.expand_path(cnf.startup_file!)
147
138
  if File.exist?(fname_)
148
139
  fname = fname_
149
140
  end
@@ -275,7 +266,7 @@ class Editor
275
266
  end
276
267
 
277
268
  def can_open_extension?(filepath)
278
- exts = $cnf[:extensions_to_open]
269
+ exts = cnf.extensions_to_open!
279
270
  extname = Pathname.new(filepath).extname.downcase
280
271
  can_open = exts.include?(extname)
281
272
  debug "CAN OPEN?: #{can_open}"
@@ -645,11 +636,16 @@ def find_project_dir_of_fn(fn)
645
636
  parent_dirs = (0..(pcomp.size - 2)).collect { |x| "/" + pcomp[0..x].join("/") }.reverse
646
637
  projdir = nil
647
638
  for pdir in parent_dirs
648
- candfn = "#{pdir}/.vma_project"
649
- if File.exist?(candfn)
650
- projdir = pdir
651
- break
639
+ candfns = []
640
+ candfns << "#{pdir}/.vma_project"
641
+ candfns << "#{pdir}/.git"
642
+ for candfn in candfns
643
+ if File.exist?(candfn)
644
+ projdir = pdir
645
+ break
646
+ end
652
647
  end
648
+ return if !projdir.nil?
653
649
  end
654
650
  return projdir
655
651
  end
@@ -1,31 +1,87 @@
1
1
  require "parallel"
2
+ require "stridx"
2
3
 
3
4
  # Limit file search to these extensions:
4
- $find_extensions = [".txt", ".h", ".c", ".cpp", ".hpp", ".rb"]
5
- $search_dirs = []
5
+ cnf.find_extensions = [".txt", ".h", ".c", ".cpp", ".hpp", ".rb", ".java", ".js", ".py"]
6
+ cnf.search_dirs = []
7
+
8
+ class StringIndex
9
+ def initialize()
10
+ @idx = StrIdx::StringIndex.new
11
+ end
12
+
13
+ def find(str, minChars: 2)
14
+ minChars = 3 if minChars.class != Integer
15
+ minChars = 2 if minChars < 2
16
+ minChars = 6 if minChars > 6 #TODO: implement option in C++
17
+
18
+ @idx.find(str)
19
+ end
20
+
21
+ def add(str, id)
22
+ @idx.add(str, id)
23
+ end
24
+ end
25
+
26
+ # ruby -e "$:.unshift File.dirname(__FILE__); require 'stridx'; idx = CppStringIndex.new(2); idx.add('foobar00',3); idx.add('fo0br',5); pp idx.find('foo');"
6
27
 
7
28
  class FileFinder
29
+ @@idx_updating = true
30
+ @@dir_list = []
31
+
8
32
  def self.update_index()
9
33
  message("Start updating file index")
10
34
  Thread.new {
11
35
  recursively_find_files()
12
- message("Finnish updating file index")
13
36
  }
14
37
  end
15
38
 
16
39
  def initialize()
17
40
  vma.hook.register(:shutdown, self.method("save"))
18
41
  @@dir_list = vma.marshal_load("file_index")
42
+ @@dir_list ||= []
43
+ update_search_idx
44
+ end
45
+
46
+ def self.update_search_idx
47
+ Thread.new {
48
+ sleep 0.1
49
+ @@idx = StringIndex.new
50
+ @@idx_updating = true
51
+
52
+ aa = []; @@dir_list.each_with_index { |x, i| aa << [x, i] }
53
+
54
+ # Parallel.map(aa, in_threads: 8) do |(x, i)|
55
+ # @@idx.add(x, i)
56
+ # end
57
+
58
+ i = 0
59
+ for x in @@dir_list
60
+ i += 1
61
+ # str_idx_addToIndex(x, i)
62
+ @@idx.add(x, i)
63
+ end
64
+ @@idx_updating = false
65
+ message("Finish updating file index")
66
+ }
67
+ end
68
+
69
+ def updating?
70
+ @@idx_updating
71
+ end
72
+
73
+ def update_search_idx
74
+ FileFinder.update_search_idx
19
75
  end
20
76
 
21
77
  def save()
22
- debug "SAVE FILE INDEX", 2
78
+ debug "SAVE FILE INDEX", 2
23
79
  vma.marshal_save("file_index", @@dir_list)
24
80
  end
25
81
 
26
82
  def start_gui()
27
- if $search_dirs.empty?
28
- message("FileFinder: No $search_dirs defined")
83
+ if cnf.search_dirs!.empty?
84
+ message("FileFinder: No cnf.search_dirs defined")
29
85
  return
30
86
  end
31
87
  l = []
@@ -46,7 +102,7 @@ class FileFinder
46
102
 
47
103
  def gui_file_finder_update_callback(search_str = "")
48
104
  debug "FILE FINDER UPDATE CALLBACK: #{search_str}"
49
- if (search_str.size > 1)
105
+ if (search_str.size >= 3)
50
106
  files = filter_files(search_str)
51
107
  @file_search_list = files
52
108
  return files
@@ -67,19 +123,32 @@ class FileFinder
67
123
  debug("START find files")
68
124
  dlist = []
69
125
 
70
- for d in $search_dirs
126
+ for d in cnf.search_dirs!
71
127
  debug("FIND FILEs IN #{d}")
72
- dlist = dlist + Dir.glob("#{d}/**/*").select { |e| File.file?(e) and $find_extensions.include?(File.extname(e)) }
128
+ dlist = dlist + Dir.glob("#{d}/**/*").select { |e| File.file?(e) and cnf.find_extensions!.include?(File.extname(e)) }
73
129
  debug("FIND FILEs IN #{d} END")
74
130
  end
75
131
  @@dir_list = dlist
132
+ update_search_idx
76
133
  debug("END find files")
77
134
  return @@dir_list
78
135
  end
79
136
 
80
137
  def filter_files(search_str)
138
+ puts "search list: #{@@dir_list.size}"
81
139
  dir_hash = {}
82
140
 
141
+ res = @@idx.find(search_str)
142
+ resultarr = []
143
+ for (idx, score) in res
144
+ fn = @@dir_list[idx - 1]
145
+ puts "#{idx} #{score} #{fn}"
146
+ resultarr << [fn, score]
147
+ end
148
+ return resultarr
149
+
150
+ # Ripl.start :binding => binding
151
+
83
152
  scores = Parallel.map(@@dir_list, in_threads: 8) do |file|
84
153
  [file, srn_dst(search_str, file)]
85
154
  end
@@ -95,4 +164,3 @@ class FileFinder
95
164
  return dir_hash
96
165
  end
97
166
  end
98
-