From 842809f63ee23c0bc0bb474110e460c085905c4a Mon Sep 17 00:00:00 2001 From: Rich Lane Date: Sun, 16 Aug 2009 23:39:11 -0700 Subject: [PATCH] console mode --- bin/sup | 4 ++++ lib/sup.rb | 1 + lib/sup/modes/console-mode.rb | 42 +++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 lib/sup/modes/console-mode.rb diff --git a/bin/sup b/bin/sup index 1febefd..2b4fee7 100755 --- a/bin/sup +++ b/bin/sup @@ -78,6 +78,7 @@ global_keymap = Keymap.new do |k| k.add :compose, "Compose new message", 'm', 'c' k.add :nothing, "Do nothing", :ctrl_g k.add :recall_draft, "Edit most recent draft message", 'R' + k.add :show_console, "Show the Console buffer", '~' end ## the following magic enables wide characters when used with a ruby @@ -296,6 +297,9 @@ begin b, new = BufferManager.spawn_unless_exists("All drafts") { LabelSearchResultsMode.new [:draft] } b.mode.load_threads :num => b.content_height if new end + when :show_console + b, new = bm.spawn_unless_exists("Console", :system => true) { ConsoleMode.new } + b.mode.run when :nothing, InputSequenceAborted when :redraw bm.completely_redraw_screen diff --git a/lib/sup.rb b/lib/sup.rb index 54de73f..bc042b2 100644 --- a/lib/sup.rb +++ b/lib/sup.rb @@ -296,6 +296,7 @@ require "sup/modes/buffer-list-mode" require "sup/modes/poll-mode" require "sup/modes/file-browser-mode" require "sup/modes/completion-mode" +require "sup/modes/console-mode" require "sup/sent" $:.each do |base| diff --git a/lib/sup/modes/console-mode.rb b/lib/sup/modes/console-mode.rb new file mode 100644 index 0000000..d06d37b --- /dev/null +++ b/lib/sup/modes/console-mode.rb @@ -0,0 +1,42 @@ +require 'pp' + +module Redwood + +class Console + def initialize mode + @mode = mode + end +end + +class ConsoleMode < LogMode + def initialize + super + @binding = Console.new(self).instance_eval { binding } + end + + def execute cmd + begin + self << ">> #{cmd}\n" + ret = eval cmd, @binding + self << "=> #{ret.pretty_inspect}\n" + rescue Exception + self << "#{$!.class}: #{$!.message}\n" + clean_backtrace = [] + $!.backtrace.each { |l| break if l =~ /console-mode/; clean_backtrace << l } + clean_backtrace.each { |l| self << "#{l}\n" } + end + end + + def prompt + BufferManager.ask :console, "eval: " + end + + def run + while true + cmd = prompt or return + execute cmd + end + end +end + +end -- 2.43.0