vimamsa 0.1.9 → 0.1.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,7 +3,7 @@ def save_buffer_list()
3
3
  message("Save buffer list")
4
4
  buffn = get_dot_path("buffers.txt")
5
5
  f = File.open(buffn, "w")
6
- bufstr = $buffers.collect { |buf| buf.fname }.inspect
6
+ bufstr = vma.buffers.collect { |buf| buf.fname }.inspect
7
7
  f.write(bufstr)
8
8
  f.close()
9
9
  end
@@ -21,18 +21,31 @@ def load_buffer_list()
21
21
  end
22
22
 
23
23
  class BufferList < Array
24
- attr_reader :current_buf
24
+ attr_reader :current_buf, :last_dir, :buffer_history
25
25
 
26
+ def initialize()
27
+ @last_dir = File.expand_path(".")
28
+ @buffer_history = []
29
+ super
30
+ @current_buf=0
31
+ end
26
32
 
33
+ # lastdir = File.expand_path(".") if lastdir.nil?
27
34
  def <<(_buf)
28
35
  super
29
- $buffer = _buf
36
+ vma.buf = _buf
30
37
  @current_buf = self.size - 1
31
- $buffer_history << @current_buf
38
+ @buffer_history << @current_buf
32
39
  @recent_ind = 0
33
- $hook.call(:change_buffer, $buffer)
34
- gui_set_current_buffer($buffer.id)
35
- gui_set_cursor_pos($buffer.id, $buffer.pos)
40
+ $hook.call(:change_buffer, vma.buf)
41
+ vma.gui.set_current_buffer(vma.buf.id)
42
+ gui_set_cursor_pos(vma.buf.id, vma.buf.pos)
43
+ update_last_dir(_buf)
44
+ end
45
+
46
+ def add(_buf)
47
+ self.append(_buf)
48
+ @buffer_history << self.size - 1
36
49
  end
37
50
 
38
51
  def switch()
@@ -44,10 +57,15 @@ class BufferList < Array
44
57
  set_current_buffer(@current_buf)
45
58
  end
46
59
 
60
+ def get_last_visited_id
61
+ last_buf = @buffer_history[-2]
62
+ return self[last_buf].id
63
+ end
64
+
47
65
  def switch_to_last_buf()
48
66
  debug "SWITCH TO LAST BUF:"
49
- debug $buffer_history
50
- last_buf = $buffer_history[-2]
67
+ debug @buffer_history
68
+ last_buf = @buffer_history[-2]
51
69
  if last_buf
52
70
  set_current_buffer(last_buf)
53
71
  end
@@ -58,27 +76,46 @@ class BufferList < Array
58
76
  buf_idx = self.index { |b| b.fname == fname }
59
77
  return buf_idx
60
78
  end
61
-
62
- def get_buffer_by_id(id)
79
+
80
+ def get_buffer_by_id(id)
63
81
  buf_idx = self.index { |b| b.id == id }
64
82
  return buf_idx
65
83
  end
66
-
84
+
85
+ def add_buf_to_history(buf_idx)
86
+ if self.include?(buf_idx)
87
+ @buffer_history << @buf_idx
88
+ @recent_ind = 0
89
+ compact_buf_history()
90
+ else
91
+ debug "buffer_list, no such id:#{buf_idx}"
92
+ return
93
+ end
94
+ end
67
95
 
68
96
  def add_current_buf_to_history()
69
97
  @recent_ind = 0
70
- $buffer_history << @current_buf
98
+ @buffer_history << @current_buf
71
99
  compact_buf_history()
72
100
  end
73
101
 
102
+ def set_current_buffer_by_id(buf_id, update_history = true)
103
+ idx = get_buffer_by_id(buf_id)
104
+ if idx.nil?
105
+ debug "IDX=nil"
106
+ return
107
+ end
108
+ set_current_buffer(idx, update_history)
109
+ end
110
+
74
111
  def set_current_buffer(buffer_i, update_history = true)
75
112
  buffer_i = self.size -1 if buffer_i > self.size
76
113
  buffer_i = 0 if buffer_i < 0
77
- $buffer = self[buffer_i]
78
- return if !$buffer
114
+ vma.buf = self[buffer_i]
115
+ return if !vma.buf
79
116
  @current_buf = buffer_i
80
117
  debug "SWITCH BUF2. bufsize:#{self.size}, curbuf: #{@current_buf}"
81
- fpath = $buffer.fname
118
+ fpath = vma.buf.fname
82
119
  if fpath and fpath.size > 50
83
120
  fpath = fpath[-50..-1]
84
121
  end
@@ -87,36 +124,37 @@ class BufferList < Array
87
124
  add_current_buf_to_history
88
125
  end
89
126
 
90
- $hook.call(:change_buffer, $buffer)
91
- $buffer.set_active
127
+ vma.hook.call(:change_buffer, vma.buf)
128
+ vma.buf.set_active
129
+
130
+ vma.gui.set_current_buffer(vma.buf.id)
92
131
 
93
- gui_set_current_buffer($buffer.id)
94
- gui_set_window_title($buffer.title,$buffer.subtitle)
132
+ gui_set_window_title(vma.buf.title, vma.buf.subtitle)
133
+
134
+ if vma.buf.fname
135
+ @last_dir = File.dirname(vma.buf.fname)
136
+ end
95
137
 
96
138
  # hpt_scan_images() if $debug # experimental
97
139
  end
98
140
 
99
- def get_last_dir
100
- lastdir = nil
101
- if $buffer.fname
102
- lastdir = File.dirname($buffer.fname)
103
- else
104
- for bufid in $buffer_history.reverse[1..-1]
105
- bf = $buffers[bufid]
106
- debug "FNAME:#{bf.fname}"
107
- if bf.fname
108
- lastdir = File.dirname(bf.fname)
109
- break
110
- end
111
- end
141
+ def update_last_dir(buf)
142
+ if buf.fname
143
+ @last_dir = File.dirname(buf.fname)
112
144
  end
113
- lastdir = File.expand_path(".") if lastdir.nil?
114
- return lastdir
145
+ end
146
+
147
+ def last_dir=(d)
148
+ @last_dir = d
149
+ end
150
+
151
+ def get_last_dir
152
+ return @last_dir
115
153
  end
116
154
 
117
155
  def get_recent_buffers()
118
156
  bufs = []; b = {}
119
- $buffer_history.reverse.each { |x| bufs << x if !b[x] && x < self.size; b[x] = true }
157
+ @buffer_history.reverse.each { |x| bufs << x if !b[x] && x < self.size; b[x] = true }
120
158
  return bufs
121
159
  end
122
160
 
@@ -141,30 +179,27 @@ class BufferList < Array
141
179
  def compact_buf_history()
142
180
  h = {}
143
181
  # Keep only first occurence in history
144
- bh = $buffer_history.reverse.select { |x| r = h[x] == nil; h[x] = true; r }
145
- $buffer_history = bh.reverse
182
+ bh = @buffer_history.reverse.select { |x| r = h[x] == nil; h[x] = true; r }
183
+ @buffer_history = bh.reverse
146
184
  end
147
185
 
148
-
149
186
  # Close buffer in the background
150
187
  # TODO: if open in another widget
151
188
  def close_other_buffer(buffer_i)
152
189
  return if self.size <= buffer_i
153
190
  return if @current_buf == buffer_i
154
-
191
+
155
192
  bufname = self[buffer_i].basename
156
193
  message("Closed buffer #{bufname}")
157
194
 
158
195
  self.slice!(buffer_i)
159
- $buffer_history = $buffer_history.collect { |x| r = x; r = x - 1 if x > buffer_i; r = nil if x == buffer_i; r }.compact
160
-
196
+ @buffer_history = @buffer_history.collect { |x| r = x; r = x - 1 if x > buffer_i; r = nil if x == buffer_i; r }.compact
161
197
  end
162
198
 
163
-
164
199
  def close_buffer(buffer_i, from_recent = false)
165
200
  return if buffer_i.nil?
166
201
  return if self.size <= buffer_i
167
-
202
+
168
203
  bufname = self[buffer_i].basename
169
204
  message("Closed buffer #{bufname}")
170
205
  recent = get_recent_buffers
@@ -172,17 +207,17 @@ class BufferList < Array
172
207
  jump_to_buf = 0 if jump_to_buf == nil
173
208
 
174
209
  self.slice!(buffer_i)
175
- $buffer_history = $buffer_history.collect { |x| r = x; r = x - 1 if x > buffer_i; r = nil if x == buffer_i; r }.compact
210
+ @buffer_history = @buffer_history.collect { |x| r = x; r = x - 1 if x > buffer_i; r = nil if x == buffer_i; r }.compact
176
211
 
177
212
  if @current_buf == buffer_i
178
213
  if from_recent
179
214
  @current_buf = jump_to_buf
180
215
  else
181
- @current_buf = $buffer_history.last
216
+ # Find last edited buffer that is not already open
217
+ @current_buf = @buffer_history.filter{|x| !vma.gui.is_buffer_open(self[x].id)}.last
182
218
  end
183
219
  end
184
- # Ripl.start :binding => binding
185
- if self.size == 0
220
+ if self.size == 0 or @current_buf.nil?
186
221
  self << Buffer.new("\n")
187
222
  @current_buf = 0
188
223
  else
@@ -43,8 +43,11 @@ class BufferManager
43
43
  buf_i = buf_of_current_line()
44
44
  return if buf_i.nil?
45
45
 
46
- vma.buffers.close_current_buffer()
46
+ # vma.buffers.close_current_buffer() #TODO:??
47
47
  vma.buffers.set_current_buffer(buf_i)
48
+
49
+ bid = vma.buffers.get_buffer_by_id(@buf.id)
50
+ vma.buffers.close_other_buffer(bid)
48
51
  @@cur = nil
49
52
  end
50
53
 
@@ -64,20 +67,33 @@ class BufferManager
64
67
  s << @header.join("\n")
65
68
  s << "\n"
66
69
  i = 0
70
+ jump_to_line = 0
67
71
  for b in vma.buffers.sort_by { |x| x.list_str }
72
+ if b.id == vma.buf.id # current file
73
+ # s << " "
74
+ jump_to_line = i
75
+ end
68
76
  x = b.list_str
69
77
  s << "#{x}\n"
70
78
  @line_to_id[i] = b.id
71
79
  i += 1
72
80
  end
73
81
 
82
+
83
+
74
84
  if @buf.nil?
75
- @buf = create_new_file(nil, s)
85
+ @buf = create_new_buffer(s,"bufmgr")
76
86
  @buf.module = self
77
87
  @buf.active_kbd_mode = :buf_mgr
78
88
  else
79
89
  @buf.set_content(s)
80
90
  end
81
- @buf.set_line_and_column_pos(@header.size, 0)
91
+ # Position on the line of the active buffer
92
+ # @buf.set_content(s)
93
+ newlpos = @header.size + jump_to_line
94
+
95
+ @buf.set_line_and_column_pos(newlpos, 0)
96
+
97
+ # Thread.new{sleep 0.1; center_on_current_line()} # TODO
82
98
  end
83
99
  end
data/lib/vimamsa/conf.rb CHANGED
@@ -12,10 +12,19 @@ def setcnf(id, val)
12
12
  set_conf(id, val)
13
13
  end
14
14
 
15
+ setcnf :custom_lsp, {}
16
+ conf(:custom_lsp)[:ruby] = {name: "solargraph", command:"solargraph stdio", type: "stdio"}
17
+ conf(:custom_lsp)[:cpp] = {name: "clangd", command:"clangd-12 --offset-encoding=utf-8", type: "stdio"}
18
+ conf(:custom_lsp)[:python] = {name: "pyright", command:"pyright-langserver --stdio --verbose", type: "stdio"}
19
+
15
20
  setcnf :indent_based_on_last_line, true
16
- setcnf :extensions_to_open, [".txt", ".h", ".c", ".cpp", ".hpp", ".rb", ".inc", ".php", ".sh", ".m", ".gd", ".js"]
21
+ setcnf :extensions_to_open, [".txt", ".h", ".c", ".cpp", ".hpp", ".rb", ".inc", ".php", ".sh", ".m", ".gd", ".js", ".py"]
22
+ setcnf :default_search_extensions, ["txt", "rb"]
17
23
 
18
24
 
19
25
  setcnf "log.verbose", 1
20
26
  setcnf :tab_width, 4
27
+ setcnf :enable_lsp, false
28
+
29
+ setcnf :workspace_folders, []
21
30
 
data/lib/vimamsa/debug.rb CHANGED
@@ -1,7 +1,12 @@
1
1
  require "fileutils"
2
2
 
3
- def debug(message)
3
+ def debug(message, severity = 1)
4
4
  if $debug
5
+ if severity > 1
6
+ # Add red colour and bold for attention
7
+ # https://en.wikipedia.org/wiki/ANSI_escape_code
8
+ message = "\033[1;31m!!! \033[0m#{message}"
9
+ end
5
10
  puts "[#{DateTime.now().strftime("%H:%M:%S")}] #{message}"
6
11
  $stdout.flush
7
12
  end
@@ -22,7 +27,7 @@ end
22
27
 
23
28
  $log_messages = []
24
29
 
25
- def log_message(message,vlevel=1)
30
+ def log_message(message, vlevel = 1)
26
31
  puts message if conf("log.verbose") >= vlevel
27
32
  $log_messages << message
28
33
  end
@@ -81,19 +86,19 @@ end
81
86
 
82
87
  def run_test(test_id)
83
88
  target_results = read_file("", "tests/test_#{test_id}_output.txt")
84
- old_buffer = $buffer
85
- $buffer = Buffer.new("", "")
89
+ old_buffer = vma.buf
90
+ vma.buf = Buffer.new("", "")
86
91
  load "tests/test_#{test_id}.rb"
87
- test_ok = $buffer.to_s.strip == target_results.strip
92
+ test_ok = vma.buf.to_s.strip == target_results.strip
88
93
  puts "##################"
89
94
  puts target_results
90
95
  puts "##################"
91
- puts $buffer.to_s
96
+ puts vma.buf.to_s
92
97
  puts "##################"
93
98
  puts "TEST OK" if test_ok
94
99
  puts "TEST FAILED" if !test_ok
95
100
  puts "##################"
96
- $buffer = old_buffer
101
+ vma.buf = old_buffer
97
102
  end
98
103
 
99
104
  #TODO: remove?
@@ -121,7 +126,7 @@ def run_random_jump_test__tmpl(test_time = 60 * 60 * 10)
121
126
  # puts buf.current_line()
122
127
  # puts "======================"
123
128
 
124
- render_buffer($buffer)
129
+ render_buffer(vma.buf)
125
130
 
126
131
  gui_sleep(rand() / 2)
127
132
  if rand() < (1 / 40.0)
@@ -130,14 +135,13 @@ def run_random_jump_test__tmpl(test_time = 60 * 60 * 10)
130
135
 
131
136
  gui_trigger_event
132
137
  buf.insert_txt("X") if rand() > 0.25
133
- render_buffer($buffer)
138
+ render_buffer(vma.buf)
134
139
 
135
- $buffers.set_current_buffer(rand($buffers.size)) if rand > 0.25
140
+ vma.buffers.set_current_buffer(rand(vma.buffers.size)) if rand > 0.25
136
141
  step += 1
137
142
  end
138
143
  end
139
144
 
140
-
141
145
  def start_ripl
142
146
  Ripl.start :binding => binding
143
147
  end
@@ -22,18 +22,20 @@ class EasyJump
22
22
  r = false if lsh[x] or lsh[x - 1] or lsh[x - 2]
23
23
  r
24
24
  }
25
+
26
+ wsmarks = [0] if wsmarks.empty?
25
27
 
26
28
  # Exclude those word start positions that are too close to each other
27
29
  wsmarks.sort!
28
30
  wsm2 = [wsmarks[0]]
29
31
  for i in 1..(wsmarks.size - 1)
30
32
  if (wsmarks[i] - wsm2[-1]) >= 4 or visible_text[wsm2[-1]..wsmarks[i]].include?("\n")
31
-
32
33
  wsm2 << wsmarks[i]
33
34
  end
34
35
  end
35
36
  wsmarks = wsm2
36
37
 
38
+
37
39
  linestart_buf = (line_starts).collect { |x| x + visible_range[0] }
38
40
  wsmarks_buf = (wsmarks).collect { |x| x + visible_range[0] }
39
41
 
@@ -57,9 +59,11 @@ class EasyJump
57
59
  if @jump_sequence.include?(@easy_jump_input)
58
60
  jshash = Hash[@jump_sequence.map.with_index.to_a]
59
61
  nthword = jshash[@easy_jump_input]
60
- debug "nthword:#{nthword} #{[@easy_jump_wsmarks[nthword], @jump_sequence[nthword]]}"
61
- buf.set_pos(@easy_jump_wsmarks[nthword])
62
- # @kbd.set_mode(:command)
62
+ newpos = @easy_jump_wsmarks[nthword]
63
+ if !newpos.nil?
64
+ debug "nthword:#{nthword} #{[@easy_jump_wsmarks[nthword], @jump_sequence[nthword]]}"
65
+ buf.set_pos(@easy_jump_wsmarks[nthword])
66
+ end
63
67
  vma.kbd.remove_keyhandling_override
64
68
  @jump_sequence = []
65
69
  vma.gui.clear_overlay()
@@ -76,7 +80,7 @@ class EasyJump
76
80
  def easy_jump_draw()
77
81
  vma.gui.start_overlay_draw
78
82
  for i in 0..(@easy_jump_wsmarks.size - 1)
79
- vma.gui.overlay_draw_text(@jump_sequence[i], @easy_jump_wsmarks[i])
83
+ vma.gui.overlay_draw_text(@jump_sequence[i], @easy_jump_wsmarks[i])
80
84
  end
81
85
  vma.gui.end_overlay_draw
82
86
  end