From 11019faa308a09cedc8828d4f2a1f3045a4b2f41 Mon Sep 17 00:00:00 2001 From: Chris Wanstrath Date: Thu, 10 Nov 2011 00:54:34 -0800 Subject: [PATCH] now that keymaps are based on class, they can be inherited --- src/stdlib/key-binder.coffee | 27 +++++++++++++++++++++++++-- static/key-bindings.coffee | 3 +++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/stdlib/key-binder.coffee b/src/stdlib/key-binder.coffee index 60de147ca..395090513 100644 --- a/src/stdlib/key-binder.coffee +++ b/src/stdlib/key-binder.coffee @@ -64,15 +64,38 @@ class KeyBinder _.flatten [ (_.values atom.extensions), atom.document, window, atom ] triggerBinding: (scope, method) -> - responder = _.detect @responders(), (responder) -> + responder = _.detect @responders(), (responder) => (scope is 'window' and responder is window) or - responder.constructor.name.toLowerCase() is scope + responder.constructor.name.toLowerCase() is scope or + @inheritedKeymap responder, scope if responder if _.isFunction method method responder else responder[method]() + # If you inherit from a class, you inherit its keymap. + # + # Example: + # class GistEditor extends Editor + # + # Will respond to these bindings: + # gisteditor: + # 'cmd+ctrl-g': 'createGist' + # And these: + # editor: + # 'cmd-n': 'new' + # + # Returns a Boolean + inheritedKeymap: (responder, scope) -> + parent = responder.constructor.__super__ + while parent?.constructor?.name + if parent.constructor.name.toLowerCase() is scope + return true + else + parent = parent.constructor.__super__ + false + bindingParser: (binding) -> keys = binding.trim().split '-' diff --git a/static/key-bindings.coffee b/static/key-bindings.coffee index 3b7defc84..75258aab7 100644 --- a/static/key-bindings.coffee +++ b/static/key-bindings.coffee @@ -6,6 +6,9 @@ window: 'cmd-shift-I': (window) -> window.showConsole() 'cmd-r': (window) -> window.reload() +document: + 'cmd-ctrl-d': -> console.log 'derp' + editor: 'cmd-w': 'removeBuffer' 'cmd-s': 'save'