vimamsa 0.1.19 → 0.1.20

Sign up to get free protection for your applications and to get access to all the features.
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
-