First of all, thank you for the tutorial and the code! Outshine has become 
a major component of my workflow, I use it in all my source code buffers (sql, R, elisp). 

I have one question/proposal regarding key bindings. Outshine binds TAB
to outshine-cycle-subtree which only does something useful (calls outshine-cycle) 
when the point is on a header line, otherwise it prints a message. TAB is used
 heavily in various source code -related modes (yasnippets, smart-tab, etc. 
http://www.emacswiki.org/emacs/TabCompletion is a great source for those) - the 
behavior which I don't want to lose. There is some support of other TAB behaviors in 
outline-cycle but it is not used (and it ignores the user-defined bindings).

A while back I wrote a macro (based on the advice in 
http://stackoverflow.com/a/2494384/973603) which allows to activate minor mode
bindings when a condition is true and fall back to previous bindings otherwise:

(defmacro define-key-with-fallback (keymap key def condition &optional mode) 
 "Define key with fallback. Binds KEY to definition DEF in keymap KEYMAP, the 
  binding is active when the CONDITION is true. Otherwise turns MODE off and 
  re-enables previous definition for KEY. If MODE is nil, tries to recover it by 
  stripping off \"-map\" from KEYMAP name." 
  `(define-key ,keymap ,key (lambda () (interactive)
     (if ,condition ,def 
       (let* ((,(if mode mode 
                     (let* ((keymap-str (symbol-name keymap)) 
                               (mode-name-end (- (string-width keymap-str) 4))) 
                        (if (string= "-map" (substring keymap-str mode-name-end))
                          (intern (substring keymap-str 0 mode-name-end))
                          (error "Could not deduce mode name from keymap name (\"-map\" missing?)")))) nil) 
                 (original-func (key-binding ,key)))
           (call-interactively original-func))))))

So now I can just do

(define-key-with-fallback outline-minor-mode-map (kbd "TAB") (outline-cycle 1) (outline-on-heading-p)) 

and have my yasnippets and smart indentation/completion active again. My question is am I reinventing 
the wheel? Is there a function/macro in org-mode or elsewhere that would allow me define key bindings
with fallback?

Thanks again,
Alex


On Fri, Mar 15, 2013 at 10:39 AM, Thorsten Jolitz <tjolitz@gmail.com> wrote:

Hi List,

there is a now a tutorial on Worg describing the recently announced new
libraries for using (concepts and functionality of) Org-mode when
outside Org-mode:

,-----------------------------------------------------------
| http://orgmode.org/worg/org-tutorials/org-outside-org.html
`-----------------------------------------------------------

Besides using the 'well-known' orgstruct-minor-mode, you can now:

- use outline-minor-mode with *outshine.el* extensions and structure
  your file with outshine-style headlines, giving your source-code files
  the look&feel of Org-mode files. Should work in any major-mode.

- use *outorg.el* to edit complete subtrees or the whole file as
  Org-mode in a temporary Org-mode edit-buffer. Depends on outshine.

- use *navi-mode.el* to open an occur-like indirect buffer for
  super-fast navigation and structure-editing (as well as other common
  actions on subtrees) in the associated original-buffer - all with
  one-key commands in a read-only buffer. A kind of customizable
  remote-control for the original-buffer with many views combining
  headline and keyword searches and easy switching between the
  associated buffers. Depends somehow on outshine too, but to a much
  lesser degree than outorg.el

And of course you have Francois Pinard's *poporg.el* and can (completely
independent from orgstruct or outshine):

- edit atomic comment-sections (anywhere in a source-code buffer, no
  matter what major-mode) in a temporary Org-mode edit-buffer. Thus,
  while *outorg* gives you a whole subtree with headline and source-code
  blocks in a temporary Org-mode edit-buffer, *poporg* gives you only
  the comment-string near point and nothing else, so that both libraries
  complement each other really well in their usage.

For more details see the tutorial on Worg.

--
cheers,
Thorsten