vimamsa 0.1.16 → 0.1.18

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: 4603a715f3fd3b549cc38a9744d93617b3a87ba3d95268f77ed2c98c2c04643d
4
- data.tar.gz: 26e82f3a6564a78dcd7188a69037f97bae3fb53c43be807560facfab8e70dd51
3
+ metadata.gz: 4d45a54c1e25d490c27465b9649d09fa3b0e5db85e91324fb8c70201de9ff5a1
4
+ data.tar.gz: f7393daa458da9e7c3b1e769049f7205e96e4ba157c162f9dacbdae700b6731d
5
5
  SHA512:
6
- metadata.gz: 1f05aad90407dfdd0e9c310f08f5e79274a5901f714d63e353e7291f25c7f4dba3d402163f338cebf01fef4f8fae07522f85a58d62e76086661007f24b14a0bd
7
- data.tar.gz: f503976439de2a311778b48a427354fc21a1b42434eb6a0bcfa5e3c00144fc3508abe029a058249c2b433e9f41f983679f44927ae095b1ec4a4eb36fafdbfe93
6
+ metadata.gz: e4d8be7daf217add0cef74e246bebf114d886f60739bc700d532035067f9a3c26dabde5ffbec7ef662278a6f7829f0513210a961e4b9c661b0f9c52ea839971a
7
+ data.tar.gz: 33315be557aaf4f294005e80a1c8b9be61da65b9d0d21cc90b8e03bddb0c4cf34df332217e11787d5e2dd3da1a0de459065c342b44f8a37f1aec5cd34f7ed4c1
data/README.md CHANGED
@@ -4,7 +4,7 @@ Vi/Vim -inspired experimental GUI-oriented text editor written with Ruby and GTK
4
4
 
5
5
 
6
6
  ## Requirements
7
- - Ruby 2.0+
7
+ - Ruby 3.0+
8
8
  - GTK 4
9
9
 
10
10
  ## Installation
data/lib/vimamsa/ack.rb CHANGED
@@ -13,7 +13,6 @@ Will search all .txt files in the following directories:
13
13
  </span>"
14
14
 
15
15
  callback = proc { |x| FileContentSearch.search_buffer(x) }
16
- # gui_one_input_action(nfo, "Search:", "search", callback)
17
16
 
18
17
  params = {}
19
18
  params["inputs"] = {}
@@ -21,7 +20,6 @@ Will search all .txt files in the following directories:
21
20
  params["inputs"]["extensions"] = { :label => "Limit to file extensions:", :type => :entry }
22
21
  params["inputs"]["extensions"][:initial_text] = conf(:default_search_extensions).join(",")
23
22
  params["inputs"]["btn1"] = { :label => "Search", :type => :button }
24
- # callback = proc { |x| gui_replace_callback(x) }
25
23
 
26
24
  params[:callback] = callback
27
25
  PopupFormGenerator.new(params).run
@@ -106,20 +104,100 @@ Will search the following directories:
106
104
  If .vma_project exists in parent directory of current file, searches within that directory.
107
105
  </span>"
108
106
 
109
- callback = proc { |x| ack_buffer(x) }
107
+ callback = proc { |x| Ack.new.ack_buffer(x) }
110
108
  gui_one_input_action(nfo, "Search:", "search", callback)
111
109
  end
112
110
 
113
- def ack_buffer(_instr, b = nil)
114
- instr = Shellwords.escape(_instr)
115
- bufstr = ""
116
- for path in vma.get_content_search_paths
117
- bufstr += run_cmd("ack -Q --type-add=gd=.gd -ki --nohtml --nojs --nojson #{instr} #{path}")
111
+ def group_by_folder(list)
112
+ bh = {}
113
+ for b in list
114
+ fpath = b[:fpath]
115
+ if !fpath.nil?
116
+ bname = File.basename(b[:fpath])
117
+ dname = File.dirname(b[:fpath])
118
+ else
119
+ #TODO
120
+ end
121
+ bh[dname] ||= {}
122
+ bh[dname][:files] ||= []
123
+ bh[dname][:files] << { bname: bname, nfo: b }
124
+ end
125
+ arr = []
126
+
127
+ for k in bh.keys.sort
128
+ tp = tilde_path(k)
129
+ arr << { type: :dir, path: tp }
130
+ for f in bh[k][:files].sort_by { |x| x[:bname] }
131
+ arr << { type: :file, bname: f[:bname], nfo: f[:nfo] }
132
+ end
118
133
  end
119
- if bufstr.size > 5
120
- b = create_new_buffer(bufstr, "ack")
121
- Gui.highlight_match(b, _instr, color: cnf.match.highlight.color!)
122
- else
123
- message("No results for input:#{instr}")
134
+ return arr
135
+ end
136
+
137
+ class Ack
138
+ attr_reader :buf
139
+ @@cur = nil # Current object of class
140
+
141
+ def self.cur()
142
+ return @@cur
143
+ end
144
+
145
+ def self.init()
146
+ end
147
+
148
+ def initialize()
149
+ @buf = nil
150
+ @line_to_id = {}
151
+ end
152
+
153
+ def ack_buffer(_instr, b = nil)
154
+ instr = Shellwords.escape(_instr)
155
+ bufstr = ""
156
+ for path in vma.get_content_search_paths
157
+ bufstr += run_cmd("ack -Q --type-add=gd=.gd -ki --nohtml --nojs --nojson #{instr} #{path}")
158
+ end
159
+
160
+ b = ""
161
+ list = []
162
+ for x in bufstr.lines
163
+ if x.match(/(.*?):(\d+):(.+)/) # non greedy: *?
164
+ fn = $1
165
+ lineno = $2
166
+ matchpart = $3
167
+ pp [fn, lineno, matchpart]
168
+ b << "[#{fn},#{lineno},#{matchpart}]\n"
169
+ list << { fpath: fn, lineno: lineno, matchpart: matchpart }
170
+ end
171
+ end
172
+
173
+ gb = group_by_folder(list)
174
+ s = ""
175
+ @line_to_nfo = {}
176
+ i = 0
177
+ for x in gb
178
+ if x[:type] == :file
179
+ s << "╰─#{x[:bname]}:#{x[:nfo][:lineno]}:#{x[:nfo][:matchpart]}\n"
180
+ @line_to_nfo[i] = x
181
+ end
182
+ if x[:type] == :dir
183
+ s << "📂#{x[:path]}:\n"
184
+ end
185
+ i += 1
186
+ end
187
+
188
+ if s.size > 5
189
+ @buf = create_new_buffer(s, "ack")
190
+ @buf.module = self
191
+ @buf.line_action_handler = self.method("select_line")
192
+ Gui.highlight_match(@buf, _instr, color: cnf.match.highlight.color!)
193
+ else
194
+ message("No results for input:#{instr}")
195
+ end
196
+ end
197
+
198
+ def select_line(lineno)
199
+ debug "def select_line #{lineno}", 2
200
+ nfo = @line_to_nfo[lineno][:nfo]
201
+ jump_to_file(nfo[:fpath], nfo[:lineno].to_i)
124
202
  end
125
203
  end
@@ -6,13 +6,10 @@ class Action
6
6
  @id = id
7
7
  @method = method
8
8
  @opt = opt
9
-
10
- $actions[id] = self
9
+ vma.actions.register(id, self) # TODO: handle this in Editor class
11
10
  end
12
11
  end
13
12
 
14
- $actions = {}
15
-
16
13
  def reg_act(id, callfunc, name = "", opt = {})
17
14
  if callfunc.class == Proc
18
15
  a = Action.new(id, name, callfunc, opt)
@@ -31,108 +28,126 @@ def missing_callfunc
31
28
  debug "missing_callfunc"
32
29
  end
33
30
 
34
- #TODO: remove
35
- # def call(id)
36
- # call_action(id)
37
- # end
31
+ #TODO: remove?
32
+ def call_action(id)
33
+ vma.actions.call(id)
34
+ end
38
35
 
39
- $acth = []
36
+ class ActionList
37
+ def initialize
38
+ @acth = []
39
+ @actions = {}
40
+ end
40
41
 
41
- def call_action(id)
42
- $acth << id
43
- a = $actions[id]
44
- if a
45
- a.method.call()
46
- else
47
- message("Unknown action: " + id.inspect)
42
+ def register(id, obj)
43
+ @actions[id] = obj
48
44
  end
49
- end
50
45
 
51
- def last_action
52
- return $acth[-1]
53
- end
46
+ def include?(act)
47
+ return @actions.has_key?(act)
48
+ end
54
49
 
55
- def search_actions()
56
- l = []
57
- opt = { :title => "Search for actions", :desc => "Fuzzy search for actions. <up> or <down> to change selcted. <enter> to select current." }
58
- $select_keys = ["h", "l", "f", "d", "s", "a", "g", "z"]
50
+ def [](id)
51
+ @actions[id]
52
+ end
59
53
 
60
- gui_select_update_window(l, $select_keys.collect { |x| x.upcase },
61
- "search_actions_select_callback",
62
- "search_actions_update_callback",
63
- opt)
64
- end
54
+ def call(id)
55
+ @acth << id
56
+ a = @actions[id]
57
+ if a
58
+ a.method.call()
59
+ else
60
+ message("Unknown action: " + id.inspect)
61
+ end
62
+ end
65
63
 
66
- $item_list = []
64
+ def last_action
65
+ return @acth[-1]
66
+ end
67
67
 
68
- def search_actions_update_callback(search_str = "")
69
- return [] if search_str == ""
68
+ def gui_search()
69
+ l = []
70
+ opt = { :title => "Search for actions", :desc => "Fuzzy search for actions. <up> or <down> to change selcted. <enter> to select current.",
71
+ :columns => [{ :title => "Shortcut", :id => 0 }, { :title => "Action", :id => 1 }] }
70
72
 
71
- item_list2 = []
72
- for act_id in $actions.keys
73
- act = $actions[act_id]
74
- item = {}
75
- item[:key] = ""
73
+ @select_keys = ["h", "l", "f", "d", "s", "a", "g", "z"]
76
74
 
77
- for mode_str in ["C", "V"]
78
- c_kbd = vma.kbd.act_bindings[mode_str][act_id]
79
- if c_kbd.class == String
80
- item[:key] = "[#{mode_str} #{c_kbd}] "
81
- break
82
- end
83
- end
84
- # c_kbd = vma.kbd.act_bindings[mode_str][nfo[:action]]
85
- item[:action] = act_id
86
- item[:str] = act_id.to_s
87
- if $actions[act_id].method_name != ""
88
- item[:str] = $actions[act_id].method_name
89
- end
90
- item_list2 << item
75
+ gui_select_update_window(l, @select_keys.collect { |x| x.upcase },
76
+ self.method("search_actions_select_callback"),
77
+ self.method("search_actions_update_callback"),
78
+ opt)
91
79
  end
92
80
 
93
- item_list = item_list2
81
+ @item_list = []
94
82
 
95
- a = filter_items(item_list, 0, search_str)
96
- debug a.inspect
83
+ def search_actions_update_callback(search_str = "")
84
+ return [] if search_str == ""
97
85
 
98
- r = a.collect { |x| [x[0][0], 0, x] }
99
- debug r.inspect
100
- $item_list = r
86
+ item_list2 = []
87
+ for act_id in @actions.keys
88
+ act = @actions[act_id]
89
+ item = {}
90
+ item[:key] = ""
101
91
 
102
- # Ripl.start :binding => binding
92
+ for mode_str in ["C", "V"]
93
+ c_kbd = vma.kbd.act_bindings[mode_str][act_id]
94
+ if c_kbd.class == String
95
+ item[:key] = "[#{mode_str}] #{c_kbd} "
96
+ item[:key] = "" if item[:key].size > 15
97
+ break
98
+ end
99
+ end
100
+ # c_kbd = vma.kbd.act_bindings[mode_str][nfo[:action]]
101
+ item[:action] = act_id
102
+ item[:str] = act_id.to_s
103
+ if @actions[act_id].method_name != ""
104
+ item[:str] = @actions[act_id].method_name
105
+ end
106
+ item_list2 << item
107
+ end
103
108
 
104
- r = a.collect { |x| ["#{x[0][:key]}#{x[0][:str]}", 0, x] }
105
- return r
106
- end
109
+ item_list = item_list2
107
110
 
108
- def search_actions_select_callback(search_str, idx)
109
- item = $item_list[idx][2]
110
- acc = item[0][:action]
111
+ a = filter_items(item_list, 0, search_str)
112
+ debug a.inspect
111
113
 
112
- debug "Selected:" + acc.to_s
113
- gui_select_window_close(0)
114
+ r = a.collect { |x| [x[0][0], 0, x] }
115
+ debug r.inspect
116
+ @item_list = r
114
117
 
115
- if acc.class == String
116
- eval(acc)
117
- elsif acc.class == Symbol
118
- debug "Symbol"
119
- call_action(acc)
118
+ r = a.collect { |x| [x[0][:key], x[0][:str]] }
119
+ return r
120
120
  end
121
- end
122
121
 
123
- def filter_items(item_list, item_key, search_str)
124
- item_hash = {}
125
- # debug item_list.inspect
126
- scores = Parallel.map(item_list, in_threads: 8) do |item|
127
- if item[:str].class != String
128
- puts item.inspect
129
- exit!
122
+ def search_actions_select_callback(search_str, idx)
123
+ item = @item_list[idx][2]
124
+ acc = item[0][:action]
125
+
126
+ debug "Selected:" + acc.to_s
127
+ gui_select_window_close(0)
128
+
129
+ if acc.class == String
130
+ eval(acc)
131
+ elsif acc.class == Symbol
132
+ debug "Symbol"
133
+ call(acc)
130
134
  end
131
- [item, srn_dst(search_str, item[:str])]
132
135
  end
133
- scores.sort_by! { |x| -x[1] }
134
- debug scores.inspect
135
- scores = scores[0..30]
136
136
 
137
- return scores
137
+ def filter_items(item_list, item_key, search_str)
138
+ item_hash = {}
139
+ # debug item_list.inspect
140
+ scores = Parallel.map(item_list, in_threads: 8) do |item|
141
+ if item[:str].class != String
142
+ puts item.inspect
143
+ exit!
144
+ end
145
+ [item, srn_dst(search_str, item[:str])]
146
+ end
147
+ scores.sort_by! { |x| -x[1] }
148
+ debug scores.inspect
149
+ scores = scores[0..30]
150
+
151
+ return scores
152
+ end
138
153
  end
@@ -12,7 +12,7 @@ $update_highlight = false
12
12
  $ifuncon = false
13
13
 
14
14
  class Buffer < String
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, :access_time
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, :access_time, :selection_active
16
16
  attr_writer :call_func, :update_highlight
17
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, :mode_stack, :default_mode
18
18
 
@@ -24,6 +24,7 @@ class Buffer < String
24
24
 
25
25
  update_access_time
26
26
  @images = []
27
+ @prefix = prefix
27
28
  @audiofiles = []
28
29
  @lang = nil
29
30
  @id = @@num_buffers
@@ -47,27 +48,10 @@ class Buffer < String
47
48
  @is_parsing_syntax = false
48
49
  @last_update = Time.now - 100
49
50
  @highlights = {}
50
- if fname != nil
51
- @fname = File.expand_path(fname)
52
- detect_file_language()
53
- else
54
- @fname = fname
55
- end
51
+
52
+ set_filename(fname)
56
53
  @hl_queue = []
57
54
  @line_action_handler = nil
58
-
59
- @dirname = nil
60
- @title = "*#{prefix}-#{@id}*"
61
- @subtitle = ""
62
-
63
- if @fname
64
- @title = File.basename(@fname)
65
- @dirname = File.dirname(@fname)
66
- userhome = File.expand_path("~")
67
- # @subtitle = @dirname.gsub(/^#{userhome}/, "~")
68
- @subtitle = @fname.gsub(/^#{userhome}/, "~")
69
- end
70
-
71
55
  t1 = Time.now
72
56
 
73
57
  set_content(str)
@@ -304,7 +288,7 @@ class Buffer < String
304
288
  if is_image_file(fname)
305
289
  debug "Dropped image file"
306
290
  insert_image_after_current_line(fname)
307
- elsif vma.can_open_extension?(fname)
291
+ elsif file_is_text_file(fname)
308
292
  debug "Dropped text file"
309
293
  open_new_file(fname)
310
294
  else
@@ -325,15 +309,10 @@ class Buffer < String
325
309
  self.set_content(str)
326
310
  end
327
311
 
328
- def decrypt(password)
329
- return if @encrypted_str.nil?
330
- begin
331
- @crypt = Encrypt.new(password)
332
- str = @crypt.decrypt(@encrypted_str)
333
- rescue OpenSSL::Cipher::CipherError => e
334
- str = "incorrect password"
335
- end
336
- self.set_content(str)
312
+ def init_encrypted(crypt:, filename:, encrypted:)
313
+ @crypt = crypt
314
+ @encrypted_str = encrypted
315
+ set_filename(filename)
337
316
  end
338
317
 
339
318
  def sanitycheck_btree()
@@ -365,12 +344,6 @@ class Buffer < String
365
344
  @encrypted_str = nil
366
345
  @gui_update_highlight = true
367
346
  @ftype = nil
368
- if str[0..10] == "VMACRYPT001"
369
- @encrypted_str = str[11..-1]
370
- callback = proc { |x| self.decrypt(x) }
371
- gui_one_input_action("Decrypt file \n #{@fname}", "Password:", "decrypt", callback, { :hide => true })
372
- str = "ENCRYPTED"
373
- end
374
347
 
375
348
  if (str[-1] != "\n")
376
349
  str << "\n"
@@ -424,7 +397,10 @@ class Buffer < String
424
397
  end
425
398
 
426
399
  def set_filename(filename)
400
+ debug "set_filename(filename) #{filename}"
427
401
  @fname = filename
402
+ @title = "*#{@prefix}-#{@id}*"
403
+ return if @fname.nil?
428
404
  @pathname = Pathname.new(fname) if @fname
429
405
  @basename = @pathname.basename if @fname
430
406
 
@@ -435,6 +411,7 @@ class Buffer < String
435
411
  vma.buffers.last_dir = @dirname
436
412
 
437
413
  detect_file_language
414
+ gui_set_window_title(@title, @subtitle)
438
415
  end
439
416
 
440
417
  def get_short_path()
@@ -1051,7 +1028,7 @@ class Buffer < String
1051
1028
 
1052
1029
  # Activated when enter/return pressed
1053
1030
  def handle_line_action()
1054
- if line_action_handler.class == Proc
1031
+ if line_action_handler.class == Proc or line_action_handler.class == Method
1055
1032
  # Custom handler
1056
1033
  line_action_handler.call(lpos)
1057
1034
  else
@@ -1098,6 +1075,7 @@ class Buffer < String
1098
1075
  else
1099
1076
  wtype = :file
1100
1077
  end
1078
+ word = path
1101
1079
  # elsif hpt_check_cur_word(word) #TODO: check only
1102
1080
  # debug word
1103
1081
  elsif linep != nil
@@ -1111,6 +1089,7 @@ class Buffer < String
1111
1089
  return [fn, :hpt_link]
1112
1090
  end
1113
1091
  end
1092
+
1114
1093
  return [word, wtype]
1115
1094
  end
1116
1095
 
@@ -1258,17 +1237,26 @@ class Buffer < String
1258
1237
  @need_redraw = false
1259
1238
  end
1260
1239
 
1261
- def start_visual_mode()
1262
- @visual_mode = true
1263
- @selection_start = @pos
1264
- $kbd.set_mode(:visual)
1240
+ def selection_active?
1241
+ @selection_active
1242
+ end
1243
+
1244
+ def end_selection()
1245
+ @selection_start = nil
1246
+ @selection_active = false
1247
+ @visual_mode = false
1248
+ #TODO: remove @visual_mode
1265
1249
  end
1266
1250
 
1267
1251
  def start_selection()
1268
- @visual_mode = true
1269
1252
  @selection_start = @pos
1270
- $kbd.set_mode(:visual)
1271
- #TODO: implement without setting kbd mode
1253
+ @selection_active = true
1254
+ @visual_mode = true
1255
+ end
1256
+
1257
+ # Start selection if not already started
1258
+ def continue_selection()
1259
+ start_selection if !@selection_active
1272
1260
  end
1273
1261
 
1274
1262
  def copy_active_selection(x = nil)
@@ -1297,6 +1285,7 @@ class Buffer < String
1297
1285
  txt.gsub!(/\w+/, &:capitalize) if op == :capitalize
1298
1286
  txt.swapcase! if op == :swapcase
1299
1287
  txt.reverse! if op == :reverse
1288
+ txt = to_camel_case(txt) if op == :camelcase
1300
1289
 
1301
1290
  replace_range(r, txt)
1302
1291
  end_visual_mode
@@ -1380,6 +1369,7 @@ class Buffer < String
1380
1369
  # TODO: should not happen
1381
1370
  end
1382
1371
  debug "End visual mode"
1372
+ end_selection
1383
1373
  vma.kbd.to_previous_mode
1384
1374
  @visual_mode = false
1385
1375
  return true
@@ -74,20 +74,35 @@ class Buffer < String
74
74
  set_pos(l.end + 1)
75
75
  end
76
76
 
77
+ # Workaround for https://github.com/ruby-gnome/ruby-gnome/issues/1609
78
+ def paste_start_xclip(at, register)
79
+ @clipboard_paste_running = true
80
+ Thread.new {
81
+ text = `xclip -selection c -o`
82
+ paste_finish(text, at, register)
83
+ }
84
+ return nil
85
+ end
86
+
77
87
  # Start asynchronous read of system clipboard
78
88
  def paste_start(at, register)
79
89
  @clipboard_paste_running = true
90
+
91
+ if true or running_wayland? and !GLib::Version::or_later?(2, 79, 0)
92
+ return paste_start_xclip(at, register)
93
+ end
94
+
80
95
  clipboard = vma.gui.window.display.clipboard
81
96
  clipboard.read_text_async do |_clipboard, result|
82
97
  begin
83
98
  text = clipboard.read_text_finish(result)
84
99
  rescue Gio::IOError::NotSupported
85
- # Happens when pasting from KeePassX and clipboard cleared
86
100
  debug Gio::IOError::NotSupported
87
101
  else
88
102
  paste_finish(text, at, register)
89
103
  end
90
104
  end
105
+ return nil
91
106
  end
92
107
 
93
108
  def paste_finish(text, at, register)
@@ -141,7 +156,7 @@ class Buffer < String
141
156
  return if !is_legal_pos(p)
142
157
  (word, range) = get_word_in_pos(p, boundary: :word)
143
158
  debug [word, range].to_s, 2
144
- endpos = range.begin+rep.size
159
+ endpos = range.begin + rep.size
145
160
  replace_range(range, rep)
146
161
  set_pos(endpos)
147
162
  end
@@ -246,9 +261,9 @@ class Buffer < String
246
261
  end
247
262
 
248
263
  def insert_tab
249
- convert = conf(:tab_to_spaces_default)
250
- convert = true if conf(:tab_to_spaces_languages).include?(@lang)
251
- convert = false if conf(:tab_to_spaces_not_languages).include?(@lang)
264
+ convert = cnf.tab.to_spaces_default?
265
+ convert = true if cnf.tab.to_spaces_languages?.include?(@lang)
266
+ convert = false if cnf.tab.to_spaces_not_languages?.include?(@lang)
252
267
  tw = conf(:tab_width)
253
268
  if convert
254
269
  indent_to = (@cpos / tw) * tw + tw
@@ -65,6 +65,12 @@ class BufferList
65
65
  # TODO: implement using heap/priorityque
66
66
  @list.sort_by! { |x| x.access_time }
67
67
  end
68
+
69
+ def each(&block)
70
+ for x in slist
71
+ block.call(x)
72
+ end
73
+ end
68
74
 
69
75
  def get_last_visited_id
70
76
  last_buf = nil
@@ -155,6 +161,7 @@ class BufferList
155
161
  end
156
162
 
157
163
  # hpt_scan_images() if cnf.debug? # experimental
164
+ return bu
158
165
  end
159
166
 
160
167
  def to_s
@@ -73,7 +73,7 @@ class BufferManager
73
73
  for b in vma.buffers.list
74
74
  if !b.fname.nil?
75
75
  bname = File.basename(b.fname)
76
- dname = File.dirname(b.dirname)
76
+ dname = File.dirname(b.fname)
77
77
  else
78
78
  bname = b.list_str
79
79
  dname = "*"
data/lib/vimamsa/conf.rb CHANGED
@@ -159,3 +159,6 @@ cnf.font.size = 11
159
159
  cnf.font.family = "Monospace"
160
160
 
161
161
 
162
+ cnf.macro.animation_delay = 0.02
163
+
164
+