vimamsa 0.1.7 → 0.1.10

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.
@@ -10,11 +10,13 @@ $buffer_history = [0]
10
10
 
11
11
  $update_highlight = false
12
12
 
13
+ $ifuncon = false
14
+
13
15
  class Buffer < String
14
16
 
15
17
  #attr_reader (:pos, :cpos, :lpos)
16
18
 
17
- attr_reader :pos, :lpos, :cpos, :deltas, :edit_history, :fname, :call_func, :pathname, :basename, :update_highlight, :marks, :is_highlighted, :syntax_detect_failed, :id, :lang
19
+ 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
18
20
  attr_writer :call_func, :update_highlight
19
21
  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
20
22
 
@@ -24,11 +26,12 @@ class Buffer < String
24
26
  debug "Buffer.rb: def initialize"
25
27
  super(str)
26
28
 
29
+ @images = []
27
30
  @lang = nil
28
31
  @id = @@num_buffers
29
32
  @@num_buffers += 1
30
- gui_create_buffer(@id)
31
- puts "NEW BUFFER fn=#{fname} ID:#{@id}"
33
+ gui_create_buffer(@id, self)
34
+ debug "NEW BUFFER fn=#{fname} ID:#{@id}"
32
35
 
33
36
  @module = nil
34
37
 
@@ -71,6 +74,15 @@ class Buffer < String
71
74
  @active_kbd_mode = nil
72
75
  end
73
76
 
77
+ def list_str()
78
+ if @fname.nil?
79
+ x = @title
80
+ else
81
+ x = @fname
82
+ end
83
+ return x
84
+ end
85
+
74
86
  def set_active
75
87
  if !@active_kbd_mode.nil?
76
88
  $kbd.set_mode(@active_kbd_mode)
@@ -104,7 +116,7 @@ class Buffer < String
104
116
  # lang.get_metadata("block-comment-end")
105
117
  @lang_nfo = lang
106
118
  if !lang.nil? and !lang.id.nil?
107
- puts "Guessed LANG: #{lang.id}"
119
+ debug "Guessed LANG: #{lang.id}"
108
120
  @lang = lang.id
109
121
  end
110
122
 
@@ -113,10 +125,32 @@ class Buffer < String
113
125
  end
114
126
  end
115
127
 
128
+ def view()
129
+ # Get the VSourceView < GtkSource::View object corresponding to this buffer
130
+ return vma.gui.buffers[@id]
131
+ end
132
+
116
133
  def add_image(imgpath, pos)
117
134
  return if !is_legal_pos(pos)
118
- # insert_txt_at(" ", pos)
119
- gui_add_image(imgpath, pos)
135
+
136
+ vbuf = view.buffer
137
+ itr = vbuf.get_iter_at(:offset => pos)
138
+ itr2 = vbuf.get_iter_at(:offset => pos + 1)
139
+ vbuf.delete(itr, itr2)
140
+ anchor = vbuf.create_child_anchor(itr)
141
+
142
+ da = ResizableImage.new(imgpath, view)
143
+ view.add_child_at_anchor(da, anchor)
144
+ da.signal_connect "draw" do |widget, cr|
145
+ da.do_draw(widget, cr)
146
+ end
147
+
148
+ da.scale_image
149
+
150
+ vma.gui.handle_image_resize
151
+ @images << { :path => imgpath, :obj => da }
152
+
153
+ gui_set_current_buffer(@id)
120
154
  end
121
155
 
122
156
  def is_legal_pos(pos, op = :read)
@@ -148,6 +182,7 @@ class Buffer < String
148
182
  b = " \n"
149
183
  txt = a + b
150
184
  insert_txt_at(txt, lr.end + 1)
185
+ buf.view.handle_deltas
151
186
  imgpos = lr.end + 1 + a.size
152
187
  add_image(fname, imgpos)
153
188
  end
@@ -197,20 +232,20 @@ class Buffer < String
197
232
  ok = true
198
233
  @bt.each_line { |r|
199
234
  if lines[i] != r #or true
200
- puts "NO MATCH FOR LINE:"
201
- puts "i=#{i}["
202
- # puts "[orig]pos=#{leaf.pos} |#{leaf.data}|"
203
- # puts "spos=#{spos} nchar=#{leaf.nchar} epos=#{epos} a[]=\nr=|#{r}|"
204
- puts "fromtree:|#{r}|"
205
- puts "frombuf:|#{lines[i]}"
206
- puts "]"
235
+ debug "NO MATCH FOR LINE:"
236
+ debug "i=#{i}["
237
+ # debug "[orig]pos=#{leaf.pos} |#{leaf.data}|"
238
+ # debug "spos=#{spos} nchar=#{leaf.nchar} epos=#{epos} a[]=\nr=|#{r}|"
239
+ debug "fromtree:|#{r}|"
240
+ debug "frombuf:|#{lines[i]}"
241
+ debug "]"
207
242
  ok = false
208
243
  end
209
244
  i += 1
210
245
  }
211
246
 
212
- puts "BT: NO ERRORS" if ok
213
- puts "BT: ERRORS" if !ok
247
+ debug "BT: NO ERRORS" if ok
248
+ debug "BT: ERRORS" if !ok
214
249
  end
215
250
 
216
251
  def set_content(str)
@@ -220,7 +255,7 @@ class Buffer < String
220
255
  if str[0..10] == "VMACRYPT001"
221
256
  @encrypted_str = str[11..-1]
222
257
  callback = proc { |x| decrypt_cur_buffer(x) }
223
- gui_one_input_action("Decrypt", "Password:", "decrypt", callback)
258
+ gui_one_input_action("Decrypt", "Password:", "decrypt", callback, { :hide => true })
224
259
  str = "ENCRYPTED"
225
260
  else
226
261
  # @crypt = nil
@@ -270,6 +305,8 @@ class Buffer < String
270
305
  @update_hl_endpos = self.size - 1
271
306
 
272
307
  gui_set_buffer_contents(@id, self.to_s)
308
+ @images = [] #TODO: if reload
309
+ hpt_scan_images(self)
273
310
 
274
311
  # add_hl_update(@update_hl_startpos, @update_hl_endpos)
275
312
  end
@@ -283,6 +320,7 @@ class Buffer < String
283
320
  @dirname = File.dirname(@fname)
284
321
  userhome = File.expand_path("~")
285
322
  @subtitle = @dirname.gsub(/^#{userhome}/, "~")
323
+ vma.buffers.last_dir = @dirname
286
324
 
287
325
  detect_file_language
288
326
  end
@@ -429,11 +467,11 @@ class Buffer < String
429
467
  end
430
468
 
431
469
  def update_index(pos, changeamount)
432
- # puts "pos #{pos}, changeamount #{changeamount}, @pos #{@pos}"
470
+ # debug "pos #{pos}, changeamount #{changeamount}, @pos #{@pos}"
433
471
  @edit_pos_history.collect! { |x| r = x if x <= pos; r = x + changeamount if x > pos; r }
434
472
  # TODO: handle between removal case
435
473
  for k in @marks.keys
436
- # puts "change(?): pos=#{pos}, k=#{k}, #{@marks[k]}, #{changeamount}"
474
+ # debug "change(?): pos=#{pos}, k=#{k}, #{@marks[k]}, #{changeamount}"
437
475
  if @marks[k] > pos
438
476
  @marks[k] = @marks[k] + changeamount
439
477
  end
@@ -537,8 +575,7 @@ class Buffer < String
537
575
 
538
576
  def comment_linerange(r)
539
577
  com_str = get_com_str()
540
- #lines = $buffer[r].split(/(\n)/).each_slice(2).map { |x| x[0] }
541
- lines = $buffer[r].lines
578
+ lines = self[r].lines
542
579
  mod = ""
543
580
  lines.each { |line|
544
581
  m = line.match(/^(\s*)(\S.*)/)
@@ -574,7 +611,7 @@ class Buffer < String
574
611
  ls = nil
575
612
  ls = @line_ends[a] if a != nil
576
613
  # if a != nil and ls != @line_ends[a]
577
- # puts "NO MATCH @line_ends[a]"
614
+ # debug "NO MATCH @line_ends[a]"
578
615
  # end
579
616
 
580
617
  if ls == nil
@@ -600,14 +637,14 @@ class Buffer < String
600
637
  elsif op == :uncomment
601
638
  uncomment_linerange(first..last)
602
639
  end
603
- $buffer.end_visual_mode
640
+ self.end_visual_mode
604
641
  end
605
642
  end
606
643
 
607
644
  def uncomment_linerange(r)
608
645
  com_str = get_com_str()
609
- #r=$buffer.line_range($buffer.lpos, 2)
610
- lines = $buffer[r].split(/(\n)/).each_slice(2).map { |x| x[0] }
646
+ #r=self.line_range(self.lpos, 2)
647
+ lines = self[r].split(/(\n)/).each_slice(2).map { |x| x[0] }
611
648
  mod = lines.collect { |x| x.sub(/^(\s*)(#{com_str}\s?)/, '\1') + "\n" }.join()
612
649
  replace_range(r, mod)
613
650
  end
@@ -679,7 +716,7 @@ class Buffer < String
679
716
  end
680
717
 
681
718
  debug "Scan line_end time: #{Time.now - t1}"
682
- #puts @line_ends
719
+ #debug @line_ends
683
720
  end
684
721
 
685
722
  def sanity_check_line_ends()
@@ -696,7 +733,7 @@ class Buffer < String
696
733
  end
697
734
 
698
735
  def update_bufpos_on_change(positions, xpos, changeamount)
699
- # puts "xpos=#{xpos} changeamount=#{changeamount}"
736
+ # debug "xpos=#{xpos} changeamount=#{changeamount}"
700
737
  positions.collect { |x|
701
738
  r = nil
702
739
  r = x if x < xpos
@@ -731,7 +768,7 @@ class Buffer < String
731
768
  i_nl = scan_indexes(changestr, /\n/)
732
769
  i_nl.collect! { |x| x + pos }
733
770
  end
734
- # puts "change:#{changeamount}"
771
+ # debug "change:#{changeamount}"
735
772
  #TODO: this is the bottle neck in insert_txt action
736
773
  @line_ends.collect! { |x|
737
774
  r = nil
@@ -755,6 +792,10 @@ class Buffer < String
755
792
  return @pos == self.size
756
793
  end
757
794
 
795
+ def jump_to_pos(new_pos)
796
+ set_pos(new_pos)
797
+ end
798
+
758
799
  def set_pos(new_pos)
759
800
  if new_pos >= self.size
760
801
  @pos = self.size - 1 # TODO:??right side of last char
@@ -879,10 +920,10 @@ class Buffer < String
879
920
  range = @pos..wmarks[0]
880
921
  end
881
922
  elsif range_id == :to_line_end
882
- puts "TO LINE END"
923
+ debug "TO LINE END"
883
924
  range = @pos..(@line_ends[@lpos] - 1)
884
925
  elsif range_id == :to_line_start
885
- puts "TO LINE START: #{@lpos}"
926
+ debug "TO LINE START: #{@lpos}"
886
927
 
887
928
  if @cpos == 0
888
929
  range = nil
@@ -918,15 +959,15 @@ class Buffer < String
918
959
  end
919
960
 
920
961
  def move(direction)
921
- puts "cpos:#{@cpos} lpos:#{@lpos} @larger_cpos:#{@larger_cpos}"
962
+ debug "cpos:#{@cpos} lpos:#{@lpos} @larger_cpos:#{@larger_cpos}"
922
963
  if direction == :forward_page
923
- puts "FORWARD PAGE"
964
+ debug "FORWARD PAGE"
924
965
  visible_range = get_visible_area()
925
966
  set_pos(visible_range[1])
926
967
  top_where_cursor()
927
968
  end
928
969
  if direction == :backward_page
929
- puts "backward PAGE"
970
+ debug "backward PAGE"
930
971
  visible_range = get_visible_area()
931
972
  set_pos(visible_range[0])
932
973
  bottom_where_cursor()
@@ -1029,14 +1070,17 @@ class Buffer < String
1029
1070
  if wtype == :url
1030
1071
  open_url(word)
1031
1072
  elsif wtype == :linepointer
1032
- puts word.inspect
1033
- jump_to_file(word[0], word[1])
1073
+ jump_to_file(word[0], word[1], word[2])
1034
1074
  elsif wtype == :textfile
1035
1075
  open_existing_file(word)
1036
1076
  elsif wtype == :file
1037
1077
  open_with_default_program(word)
1038
1078
  elsif wtype == :hpt_link
1039
1079
  open_existing_file(word)
1080
+ elsif wtype == :help
1081
+ if word == "keybindings"
1082
+ call_action(:show_key_bindings)
1083
+ end
1040
1084
  else
1041
1085
  #TODO
1042
1086
  end
@@ -1096,10 +1140,10 @@ class Buffer < String
1096
1140
  word_start = pos if word_start == nil
1097
1141
  word_end = pos if word_end == nil
1098
1142
  word = self[word_start..word_end]
1099
- puts "'WORD: #{word}'"
1100
- message("'#{word}'")
1143
+ debug "'WORD: #{word}'"
1144
+ # message("Open link #{word}")
1101
1145
  linep = get_file_line_pointer(word)
1102
- puts "linep'#{linep}'"
1146
+ debug "linep'#{linep}'"
1103
1147
  path = File.expand_path(word)
1104
1148
  wtype = nil
1105
1149
  if is_url(word)
@@ -1112,10 +1156,12 @@ class Buffer < String
1112
1156
  wtype = :file
1113
1157
  end
1114
1158
  # elsif hpt_check_cur_word(word) #TODO: check only
1115
- # puts word
1159
+ # debug word
1116
1160
  elsif linep != nil
1117
1161
  wtype = :linepointer
1118
1162
  word = linep
1163
+ elsif m = word.match(/⟦help:(.*)⟧/)
1164
+ return [m[1], :help]
1119
1165
  else
1120
1166
  fn = hpt_check_cur_word(word)
1121
1167
  if !fn.nil?
@@ -1132,22 +1178,9 @@ class Buffer < String
1132
1178
  handle_word(wnfo)
1133
1179
  end
1134
1180
 
1135
- def get_cur_word()
1136
- wem = get_word_end_marks(@pos, @pos + 200)
1137
- wsm = get_word_start_marks(@pos - 200, @pos)
1138
- word_start = wsm[-1]
1139
- word_end = wem[0]
1140
- word_start = pos if word_start == nil
1141
- word_end = pos if word_end == nil
1142
- word = self[word_start..word_end]
1143
- puts "'#{word}'"
1144
- message("'#{word}'")
1145
- #puts wm
1146
- end
1147
-
1148
1181
  def jump_to_next_instance_of_word()
1149
1182
  if $kbd.last_action == $kbd.cur_action and @current_word != nil
1150
- # puts "REPEATING *"
1183
+ # debug "REPEATING *"
1151
1184
  else
1152
1185
  start_search = [@pos - 150, 0].max
1153
1186
 
@@ -1246,10 +1279,10 @@ class Buffer < String
1246
1279
 
1247
1280
  if target == FIRST_NON_WHITESPACE
1248
1281
  l = current_line()
1249
- puts l.inspect
1282
+ debug l.inspect
1250
1283
  @cpos = line(@lpos).size - 1
1251
1284
  a = scan_indexes(l, /\S/)
1252
- puts a.inspect
1285
+ debug a.inspect
1253
1286
  if a.any?
1254
1287
  @cpos = a[0]
1255
1288
  else
@@ -1323,7 +1356,7 @@ class Buffer < String
1323
1356
  d2 = [@pos, INSERT, 1, char]
1324
1357
  add_delta(d1, true)
1325
1358
  add_delta(d2, true)
1326
- debug "DELTAS:#{$buffer.deltas.inspect} "
1359
+ debug "DELTAS:#{self.deltas.inspect} "
1327
1360
  end
1328
1361
 
1329
1362
  def insert_txt_at(c, pos)
@@ -1358,14 +1391,13 @@ class Buffer < String
1358
1391
  if m
1359
1392
  c = c + " " * m[1].size if m
1360
1393
  end
1361
-
1362
1394
 
1363
1395
  #if tab indent
1364
1396
  m = /^(\t+)([^\t]+|$)/.match(last_line)
1365
1397
  if m
1366
1398
  c = c + "\t" * m[1].size if m
1367
1399
  end
1368
-
1400
+
1369
1401
  # debug m.inspect
1370
1402
  end
1371
1403
  if mode == BEFORE
@@ -1379,8 +1411,8 @@ class Buffer < String
1379
1411
 
1380
1412
  #self.insert(insert_pos,c)
1381
1413
  add_delta([insert_pos, INSERT, c.size, c], true)
1382
- #puts("encoding: #{c.encoding}")
1383
- #puts "c.size: #{c.size}"
1414
+ #debug("encoding: #{c.encoding}")
1415
+ #debug "c.size: #{c.size}"
1384
1416
  #recalc_line_ends #TODO: optimize?
1385
1417
  calculate_line_and_column_pos
1386
1418
  #need_redraw!
@@ -1417,7 +1449,6 @@ class Buffer < String
1417
1449
  for d in deltas
1418
1450
  add_delta(d, true, true)
1419
1451
  end
1420
- # $buffer.update_content(IO.read('test.txt'))
1421
1452
  end
1422
1453
 
1423
1454
  def need_redraw!
@@ -1454,7 +1485,7 @@ class Buffer < String
1454
1485
  text = $register[register]
1455
1486
  end
1456
1487
  end
1457
- puts "PASTE: #{text}"
1488
+ debug "PASTE: #{text}"
1458
1489
 
1459
1490
  return if text == ""
1460
1491
 
@@ -1511,7 +1542,7 @@ class Buffer < String
1511
1542
  debug "COPY SELECTION"
1512
1543
  s = self[get_visual_mode_range]
1513
1544
  if x == :append
1514
- puts "APPEND"
1545
+ debug "APPEND"
1515
1546
  s += "\n" + get_clipboard()
1516
1547
  end
1517
1548
 
@@ -1653,7 +1684,7 @@ class Buffer < String
1653
1684
  # If current file has fname, save to that fname
1654
1685
  # Else search for previously open files and save to the directory of
1655
1686
  # the last viewed file that has a filename
1656
- # $buffers[$buffer_history.reverse[1]].fname
1687
+ # selffers[$buffer_history.reverse[1]].fname
1657
1688
 
1658
1689
  if @fname
1659
1690
  savepath = File.dirname(@fname)
@@ -1680,21 +1711,23 @@ class Buffer < String
1680
1711
  end
1681
1712
 
1682
1713
  Thread.new {
1683
- File.open(fpath, mode) do |io|
1684
- #io.set_encoding(self.encoding)
1685
-
1686
- begin
1687
- io.write(contents)
1688
- rescue Encoding::UndefinedConversionError => ex
1689
- # this might happen when trying to save UTF-8 as US-ASCII
1690
- # so just warn, try to save as UTF-8 instead.
1691
- warn("Saving as UTF-8 because of: #{ex.class}: #{ex}")
1692
- io.rewind
1693
-
1694
- io.set_encoding(Encoding::UTF_8)
1695
- io.write(contents)
1696
- #self.encoding = Encoding::UTF_8
1697
- end
1714
+ begin
1715
+ io = File.open(fpath, mode)
1716
+ io.set_encoding(self.encoding)
1717
+ io.write(contents)
1718
+ io.close
1719
+ rescue Encoding::UndefinedConversionError => ex
1720
+ puts "Encoding::UndefinedConversionError"
1721
+ # this might happen when trying to save UTF-8 as US-ASCII
1722
+ # so just warn, try to save as UTF-8 instead.
1723
+ warn("Saving as UTF-8 because of: #{ex.class}: #{ex}")
1724
+ io.rewind
1725
+
1726
+ io.set_encoding(Encoding::UTF_8)
1727
+ io.write(contents)
1728
+ rescue Errno::EACCES => ex
1729
+ message("File #{fpath} not writeable")
1730
+ #TODO: show message box
1698
1731
  end
1699
1732
  sleep 3
1700
1733
  }
@@ -1713,7 +1746,7 @@ class Buffer < String
1713
1746
  def indent()
1714
1747
  file = Tempfile.new("out")
1715
1748
  infile = Tempfile.new("in")
1716
- file.write($buffer.to_s)
1749
+ file.write(self.to_s)
1717
1750
  file.flush
1718
1751
  bufc = "FOO"
1719
1752
 
@@ -1739,12 +1772,17 @@ class Buffer < String
1739
1772
  else
1740
1773
  return
1741
1774
  end
1742
- $buffer.update_content(bufc)
1775
+ self.update_content(bufc)
1743
1776
  center_on_current_line #TODO: needed?
1744
1777
  file.close; file.unlink
1745
1778
  infile.close; infile.unlink
1746
1779
  end
1747
1780
 
1781
+ def close()
1782
+ idx = vma.buffers.get_buffer_by_id(@id)
1783
+ vma.buffers.close_buffer(idx)
1784
+ end
1785
+
1748
1786
  def backup()
1749
1787
  fname = @fname
1750
1788
  return if !@fname
@@ -1765,7 +1803,7 @@ end
1765
1803
  #TODO
1766
1804
  def write_to_file(savepath, s)
1767
1805
  if is_path_writable(savepath)
1768
- IO.write(savepath, $buffer.to_s)
1806
+ IO.write(savepath, self.to_s)
1769
1807
  else
1770
1808
  message("PATH NOT WRITABLE: #{savepath}")
1771
1809
  end
@@ -1780,7 +1818,7 @@ def is_path_writable(fpath)
1780
1818
  end
1781
1819
 
1782
1820
  def backup_all_buffers()
1783
- for buf in $buffers
1821
+ for buf in selffers
1784
1822
  buf.backup
1785
1823
  end
1786
1824
  message("Backup all buffers")
@@ -1,9 +1,8 @@
1
-
2
1
  def save_buffer_list()
3
2
  message("Save buffer list")
4
3
  buffn = get_dot_path("buffers.txt")
5
4
  f = File.open(buffn, "w")
6
- bufstr = $buffers.collect { |buf| buf.fname }.inspect
5
+ bufstr = vma.buffers.collect { |buf| buf.fname }.inspect
7
6
  f.write(bufstr)
8
7
  f.close()
9
8
  end
@@ -21,17 +20,23 @@ def load_buffer_list()
21
20
  end
22
21
 
23
22
  class BufferList < Array
24
- attr_reader :current_buf
23
+ attr_reader :current_buf, :last_dir
24
+
25
+ def initialize()
26
+ @last_dir = File.expand_path(".")
27
+ super
28
+ end
25
29
 
30
+ # lastdir = File.expand_path(".") if lastdir.nil?
26
31
  def <<(_buf)
27
32
  super
28
- $buffer = _buf
33
+ vma.buf = _buf
29
34
  @current_buf = self.size - 1
30
35
  $buffer_history << @current_buf
31
36
  @recent_ind = 0
32
- $hook.call(:change_buffer, $buffer)
33
- gui_set_current_buffer($buffer.id)
34
- gui_set_cursor_pos($buffer.id, $buffer.pos)
37
+ $hook.call(:change_buffer, vma.buf)
38
+ gui_set_current_buffer(vma.buf.id)
39
+ gui_set_cursor_pos(vma.buf.id, vma.buf.pos)
35
40
  end
36
41
 
37
42
  def switch()
@@ -58,6 +63,11 @@ class BufferList < Array
58
63
  return buf_idx
59
64
  end
60
65
 
66
+ def get_buffer_by_id(id)
67
+ buf_idx = self.index { |b| b.id == id }
68
+ return buf_idx
69
+ end
70
+
61
71
  def add_current_buf_to_history()
62
72
  @recent_ind = 0
63
73
  $buffer_history << @current_buf
@@ -67,11 +77,11 @@ class BufferList < Array
67
77
  def set_current_buffer(buffer_i, update_history = true)
68
78
  buffer_i = self.size -1 if buffer_i > self.size
69
79
  buffer_i = 0 if buffer_i < 0
70
- $buffer = self[buffer_i]
71
- return if !$buffer
80
+ vma.buf = self[buffer_i]
81
+ return if !vma.buf
72
82
  @current_buf = buffer_i
73
83
  debug "SWITCH BUF2. bufsize:#{self.size}, curbuf: #{@current_buf}"
74
- fpath = $buffer.fname
84
+ fpath = vma.buf.fname
75
85
  if fpath and fpath.size > 50
76
86
  fpath = fpath[-50..-1]
77
87
  end
@@ -80,31 +90,25 @@ class BufferList < Array
80
90
  add_current_buf_to_history
81
91
  end
82
92
 
83
- $hook.call(:change_buffer, $buffer)
84
- $buffer.set_active
93
+ $hook.call(:change_buffer, vma.buf)
94
+ vma.buf.set_active
95
+
96
+ gui_set_current_buffer(vma.buf.id)
97
+ gui_set_window_title(vma.buf.title, vma.buf.subtitle)
85
98
 
86
- gui_set_current_buffer($buffer.id)
87
- gui_set_window_title($buffer.title,$buffer.subtitle)
99
+ if vma.buf.fname
100
+ @last_dir = File.dirname(vma.buf.fname)
101
+ end
88
102
 
89
103
  # hpt_scan_images() if $debug # experimental
90
104
  end
91
105
 
106
+ def last_dir=(d)
107
+ @last_dir = d
108
+ end
109
+
92
110
  def get_last_dir
93
- lastdir = nil
94
- if $buffer.fname
95
- lastdir = File.dirname($buffer.fname)
96
- else
97
- for bufid in $buffer_history.reverse[1..-1]
98
- bf = $buffers[bufid]
99
- debug "FNAME:#{bf.fname}"
100
- if bf.fname
101
- lastdir = File.dirname(bf.fname)
102
- break
103
- end
104
- end
105
- end
106
- lastdir = File.expand_path(".") if lastdir.nil?
107
- return lastdir
111
+ return @last_dir
108
112
  end
109
113
 
110
114
  def get_recent_buffers()
@@ -138,9 +142,23 @@ class BufferList < Array
138
142
  $buffer_history = bh.reverse
139
143
  end
140
144
 
145
+ # Close buffer in the background
146
+ # TODO: if open in another widget
147
+ def close_other_buffer(buffer_i)
148
+ return if self.size <= buffer_i
149
+ return if @current_buf == buffer_i
150
+
151
+ bufname = self[buffer_i].basename
152
+ message("Closed buffer #{bufname}")
153
+
154
+ self.slice!(buffer_i)
155
+ $buffer_history = $buffer_history.collect { |x| r = x; r = x - 1 if x > buffer_i; r = nil if x == buffer_i; r }.compact
156
+ end
157
+
141
158
  def close_buffer(buffer_i, from_recent = false)
159
+ return if buffer_i.nil?
142
160
  return if self.size <= buffer_i
143
-
161
+
144
162
  bufname = self[buffer_i].basename
145
163
  message("Closed buffer #{bufname}")
146
164
  recent = get_recent_buffers