emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Orgmode] [PATCH] Improved org-assign-fast-keys.


From: Mikael Fornius
Subject: [Orgmode] [PATCH] Improved org-assign-fast-keys.
Date: Thu, 28 Jan 2010 16:38:50 +0100
User-agent: Gnus/5.110011 (No Gnus v0.11) Emacs/23.1.50 (gnu/linux)

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  <address@hidden>
+
+       * 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  <address@hidden>
 
        * 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

reply via email to

[Prev in Thread] Current Thread [Next in Thread]