summaryrefslogtreecommitdiff
path: root/rubylib
diff options
context:
space:
mode:
authorJon Cairns <jon@joncairns.com>2013-07-10 10:05:21 +0100
committerJon Cairns <jon@joncairns.com>2013-07-10 10:05:21 +0100
commit92b5b8cfc640edd102cbf1fe43dd3c0007d5bc54 (patch)
tree3aa3bf2bcdd39d8616e822334815c2647dd01db1 /rubylib
parent181d192c3aeb44153ab1846ca2d255227c9da695 (diff)
downloadvdebug-92b5b8cfc640edd102cbf1fe43dd3c0007d5bc54.zip
Add vdebug remote ruby interface and spec
Diffstat (limited to 'rubylib')
-rw-r--r--rubylib/vdebug.rb68
1 files changed, 68 insertions, 0 deletions
diff --git a/rubylib/vdebug.rb b/rubylib/vdebug.rb
new file mode 100644
index 0000000..88e8cfd
--- /dev/null
+++ b/rubylib/vdebug.rb
@@ -0,0 +1,68 @@
+class Vdebug
+ class BufferNotFound < StandardError; end;
+
+ attr_reader :vim
+
+ def initialize(vim)
+ @vim = vim
+ end
+
+ def start_listening
+ clear_buffer_cache!
+ vim.server.remote_send ":python debugger.run()<CR>"
+ sleep 0.5
+ end
+
+ # Retrieve a hash with the buffer names (values) and numbers (keys)
+ def buffers
+ @buffers ||= fetch_buffers
+ end
+
+ # Do this when you want to refresh the buffer list
+ def clear_buffer_cache!
+ @buffers = nil
+ end
+
+ # Has the vdebug GUI been opened?
+ def gui_open?
+ names = buffers.values
+ %w[DebuggerStack DebuggerStatus DebuggerWatch].all? { |b|
+ names.include? b
+ }
+ end
+
+ def running?
+ gui_open? && connected?
+ end
+
+ def connected?
+ vim.server.remote_send(
+ ":python debugger.runner.is_alive()"
+ ) == "True"
+ end
+
+ def watch_window_content
+ fetch_buffer_content 'DebuggerWatch'
+ end
+
+ def status_window_content
+ fetch_buffer_content 'DebuggerStatus'
+ end
+
+protected
+ def fetch_buffer_content(name)
+ bufnum = buffers.invert.fetch(name)
+ vim.echo(%Q{join(getline(#{bufnum}, "$"), "\\n")})
+ rescue KeyError
+ raise BufferNotFound, "#{name} buffer not found"
+ end
+
+ def fetch_buffers
+ buffer_string = vim.command('buffers')
+ names = buffer_string.split("\n").collect do |bufline|
+ matches = /\A\s*(\d+).*"([^"]+)"/.match(bufline)
+ [matches[1].to_i, matches[2]] if matches
+ end
+ Hash[names.compact]
+ end
+end