sup

A curses threads-with-tags style email client

sup.git

git clone https://supmua.dev/git/sup/
commit 967f2aa2902988daddbc23d01593b1ed85e37553
parent e8256110454394f316cd2a8135a628e458f4ea55
Author: Rich Lane <rlane@club.cc.cmu.edu>
Date:   Sun, 24 Jan 2010 19:09:33 -0800

keybindings hook

Add a hook specifically for custom keybindings. The advantage of this over the
startup hook is that we can assume it's safe to reload this one while Sup is
running. The "modes" variable provides a debatably-useful mapping between
user-visible mode names and the actual classes, for use with class_eval.

Diffstat:
M bin/sup | 9 ++++++++-
M lib/sup/hook.rb | 1 +
M lib/sup/keymap.rb | 17 +++++++++++++++++
M lib/sup/mode.rb | 4 ++++
4 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/bin/sup b/bin/sup
@@ -85,10 +85,13 @@ global_keymap = Keymap.new do |k|
   k.add :show_console, "Show the Console buffer", '~'
 
   ## Submap for less often used keybindings
-  k.add_multi "reload (c)olors", 'O' do |kk|
+  k.add_multi "reload (c)olors, rerun (k)eybindings hook", 'O' do |kk|
     kk.add :reload_colors, "Reload colors", 'c'
+    kk.add :run_keybindings_hook, "Rerun keybindings hook", 'k'
   end
 end
+  
+Redwood::Keymap.run_hook global_keymap
 
 ## the following magic enables wide characters when used with a ruby
 ## ncurses.so that's been compiled against libncursesw. (note the w.) why
@@ -355,6 +358,10 @@ begin
       Colormap.populate_colormap
       bm.completely_redraw_screen
       bm.flash "reloaded colors"
+    when :run_keybindings_hook
+      HookManager.clear_one 'keybindings'
+      Keymap.run_hook global_keymap
+      bm.flash "keybindings hook run"
     when :nothing, InputSequenceAborted
     when :redraw
       bm.completely_redraw_screen
diff --git a/lib/sup/hook.rb b/lib/sup/hook.rb
@@ -113,6 +113,7 @@ EOS
   def enabled? name; !hook_for(name).nil? end
 
   def clear; @hooks.clear; end
+  def clear_one k; @hooks.delete k; end
 
 private
 
diff --git a/lib/sup/keymap.rb b/lib/sup/keymap.rb
@@ -1,6 +1,14 @@
 module Redwood
 
 class Keymap
+
+  HookManager.register "keybindings", <<EOS
+Add custom keybindings.
+Methods:
+  modes: Hash from mode names to mode classes.
+  global_keymap: The top-level keymap.
+EOS
+
   def initialize
     @map = {}
     @order = []
@@ -116,6 +124,15 @@ class Keymap
     llen = lines.max_of { |a, b| a.length }
     lines.map { |a, b| sprintf " %#{llen}s : %s", a, b }.join("\n")
   end
+
+  def self.run_hook global_keymap
+    modes = Hash[Mode.keymaps.map { |klass,keymap| [Mode.make_name(klass.name),klass] }]
+    locals = {
+      :modes => modes,
+      :global_keymap => global_keymap,
+    }
+    HookManager.run 'keybindings', locals
+  end
 end
 
 end
diff --git a/lib/sup/mode.rb b/lib/sup/mode.rb
@@ -14,6 +14,10 @@ class Mode
     @@keymaps[self] || register_keymap
   end
 
+  def self.keymaps
+    @@keymaps
+  end
+
   def initialize
     @buffer = nil
   end