emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Thorsten Jolitz <tjolitz@gmail.com>
To: emacs-orgmode@gnu.org
Subject: Re: Org-mode outside Org-mode
Date: Wed, 24 Apr 2013 20:39:20 +0200	[thread overview]
Message-ID: <87vc7b22p3.fsf@gmail.com> (raw)
In-Reply-To: CAGOCFPU1YJ-Nvk=Qdq9P93Zf=3gZP0GG1GA+=+1jnChk3_-bFA@mail.gmail.com

Alexander Vorobiev <alexander.vorobiev@gmail.com> writes:

Hi Alexander, 

> 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).

Thanks, I use it in all my elisp and PicoLisp buffers too, and I'm happy
that it works for you too. 

Only with 'old-school' elisp buffers with '^;;;+ ' headlines there is
still one major headache with long lines of only ';' like this:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

that make the regexp matcher enter endless backtracking. I haven't found
a solution yet how to fontify the headlines in a different way (-> first
match the headline regexp, then calculate the headline level).

> 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).


That very same problem made me hate yasnippet ...
I think thats a very good proposal.

> 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:

I copied your macro to outshine.el (hope thats ok with you, I credit
you), but had errors at start-up so I modified it slightly:

,-----------------------------------------------------------------------------------
| ;; copied from Alexander Vorobiev
| ;; http://www.mail-archive.com/emacs-orgmode@gnu.org/msg70648.html
| (defmacro outshine-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))
|                           (message "Could not deduce mode name from keymap name"))
|                                  ;; (\\"-map\\" missing?)")
|                         )) nil)
|                  (original-func (key-binding ,key)))
|            (call-interactively original-func))))))
`-----------------------------------------------------------------------------------


This is what I get now if I press 'C-h k' and then TAB in an outshine buffer:

,---------------------------------------------------------------------------
| TAB (translated from <tab>) runs the command (lambda nil (interactive) (if
| (outline-on-heading-p) (outline-cycle 1) (let* ((outline-minor-mode nil)
| (original-func (key-binding (kbd "TAB")))) (call-interactively
| original-func)))), which is an interactive Lisp function.
| 
| It is bound to TAB.
| 
| (anonymous)
`---------------------------------------------------------------------------

This is still in a private branch and not merged with the master, it
seems to work, but could you check the macro and the message if they
look alright before merging it with master?

> So now I can just do
>
> (define-key-with-fallback outline-minor-mode-map (kbd "TAB") (outline-cycle 1)
> (outline-on-heading-p)) 

I applied that to several bindings in outshine.el that might conflict
with other libraries now. 

> 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?

I would be interested in this too, since I like to have the
M-<arrow-key> navigation keys from 'outline-mode-easy-bindings' in
Org-mode too, but they conflict with some org-table bindings. 

-- 
cheers,
Thorsten

  reply	other threads:[~2013-04-24 18:39 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-15 15:39 Org-mode outside Org-mode Thorsten Jolitz
2013-03-15 16:47 ` Thomas S. Dye
2013-04-03 18:23 ` Samuel Wales
2013-04-04 14:09   ` Thorsten Jolitz
2013-04-04 20:17     ` Samuel Wales
2013-04-05  9:51       ` Thorsten Jolitz
2013-04-07  1:05         ` Eric Schulte
2013-04-07  7:49           ` Bastien
2013-04-12  1:04           ` Samuel Wales
2013-04-13 20:48           ` Samuel Wales
2013-04-12  1:19         ` Samuel Wales
2013-04-12 10:44           ` Thorsten Jolitz
2013-04-13 20:45             ` Samuel Wales
2013-04-27  8:35               ` Thorsten Jolitz
2013-04-24 14:20 ` Alexander Vorobiev
2013-04-24 18:39   ` Thorsten Jolitz [this message]
2013-04-25 17:33   ` Thorsten Jolitz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87vc7b22p3.fsf@gmail.com \
    --to=tjolitz@gmail.com \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).