From mboxrd@z Thu Jan 1 00:00:00 1970 From: Carsten Dominik Subject: Re: [PATCH] Improved org-assign-fast-keys. Date: Thu, 28 Jan 2010 19:28:15 +0100 Message-ID: <956605EB-47B7-4F70-A3BF-C462EED8E0AA@gmail.com> References: <877hr244tx.fsf@eee.lan> Mime-Version: 1.0 (Apple Message framework v936) Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit Return-path: Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NadXA-0006LQ-6U for emacs-orgmode@gnu.org; Thu, 28 Jan 2010 18:12:20 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NadX4-0006I4-CR for emacs-orgmode@gnu.org; Thu, 28 Jan 2010 18:12:18 -0500 Received: from [199.232.76.173] (port=41600 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NadX4-0006Hz-3u for emacs-orgmode@gnu.org; Thu, 28 Jan 2010 18:12:14 -0500 Received: from mail-ew0-f224.google.com ([209.85.219.224]:54142) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NadX3-0005yc-CH for emacs-orgmode@gnu.org; Thu, 28 Jan 2010 18:12:13 -0500 Received: by mail-ew0-f224.google.com with SMTP id 24so1354714ewy.26 for ; Thu, 28 Jan 2010 15:12:13 -0800 (PST) In-Reply-To: <877hr244tx.fsf@eee.lan> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Mikael Fornius Cc: emacs-orgmode@gnu.org Hi Mikael, this looks very good, thanks for getting rid of the FIXME... :-) I have applied the patch. - Carsten On Jan 28, 2010, at 4:38 PM, Mikael Fornius wrote: > > I have 30+ TODO-keywords defined in some org-files. > > When using C-c C-t to alter state I got weird keys assigned. > > I suggest changing org-assign-fast-keys as attached patch describes. > > I was bold enough to remove the FIXME comment already there but if one > has more than 70 keywords it can cause ugly keys again. But no one > uses > more than 70 keywords? > > I have tested it and, "it works for me". :-) > > Anyway, Carsten, feel free to use this patch in org-mode if you like > it. > > Thanks for a great piece of software and community, cheers! > > diff --git a/lisp/ChangeLog b/lisp/ChangeLog > index 2dc260d..c662d89 100755 > --- a/lisp/ChangeLog > +++ b/lisp/ChangeLog > @@ -1,3 +1,10 @@ > +2010-01-28 Mikael Fornius > + > + * org.el (org-assign-fast-keys): Prefer keys used in keyword name > + when assigning. Begin using numerical characters when all in name > + is used up. This is to spare alphanumeric characters for better > + match with other keywords. > + > 2010-01-28 Carsten Dominik > > * org-latex.el (org-export-latex-preprocess): More consistent > diff --git a/lisp/org.el b/lisp/org.el > index cd378b4..d92e335 100644 > --- a/lisp/org.el > +++ b/lisp/org.el > @@ -4129,30 +4129,24 @@ This will extract info from a string like > \"WAIT(w@/!)\"." > x)) > list)) > > -;; FIXME: this could be done much better, using second characters > etc. > (defun org-assign-fast-keys (alist) > "Assign fast keys to a keyword-key alist. > Respect keys that are already there." > - (let (new e k c c1 c2 (char ?a)) > + (let (new e (alt ?0)) > (while (setq e (pop alist)) > - (cond > - ((equal e '(:startgroup)) (push e new)) > - ((equal e '(:endgroup)) (push e new)) > - ((equal e '(:newline)) (push e new)) > - (t > - (setq k (car e) c2 nil) > - (if (cdr e) > - (setq c (cdr e)) > - ;; automatically assign a character. > - (setq c1 (string-to-char > - (downcase (substring > - k (if (= (string-to-char k) ?@) 1 0))))) > - (if (or (rassoc c1 new) (rassoc c1 alist)) > - (while (or (rassoc char new) (rassoc char alist)) > - (setq char (1+ char))) > - (setq c2 c1)) > - (setq c (or c2 char))) > - (push (cons k c) new)))) > + (if (or (memq (car e) '(:newline :endgroup :startgroup)) > + (cdr e)) ;; Key already assigned. > + (push e new) > + (let ((clist (string-to-list (downcase (car e)))) > + (used (append new alist))) > + (when (= (car clist) ?@) > + (pop clist)) > + (while (and clist (rassoc (car clist) used)) > + (pop clist)) > + (unless clist > + (while (rassoc alt used) > + (incf alt))) > + (push (cons (car e) (or (car clist) alt)) new)))) > (nreverse new))) > > ;;; Some variables used in various places > > -- > Mikael Fornius > _______________________________________________ > Emacs-orgmode mailing list > Please use `Reply All' to send replies to the list. > Emacs-orgmode@gnu.org > http://lists.gnu.org/mailman/listinfo/emacs-orgmode - Carsten