* [PATCH] Alphabetical ordered lists @ 2010-07-29 20:27 Nathaniel Flath 2010-07-29 21:07 ` Nick Dokos ` (2 more replies) 0 siblings, 3 replies; 41+ messages in thread From: Nathaniel Flath @ 2010-07-29 20:27 UTC (permalink / raw) To: emacs-orgmode [-- Attachment #1: Type: text/plain, Size: 276 bytes --] Hello all, One thing that had been bugging me was the inability to have an ordered list of the form: a. Item 1 b. Item 2 c. Item 3 The following patch enables this, with lists going from a-z and A-Z. Let me know if there are any issues with it. Thanks, Nathaniel Flath [-- Attachment #2: alpha-lists.patch --] [-- Type: application/octet-stream, Size: 2610 bytes --] diff --git a/lisp/org-list.el b/lisp/org-list.el old mode 100644 new mode 100755 index cdfd2c5..61e1e88 --- a/lisp/org-list.el +++ b/lisp/org-list.el @@ -227,11 +227,11 @@ If GENERAL is non-nil, return the general regexp independent of the value of `org-plain-list-ordered-item-terminator'." (cond ((or general (eq org-plain-list-ordered-item-terminator t)) - "\\([ \t]*\\([-+]\\|\\([0-9]+[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + "\\([ \t]*\\([-+]\\|\\([0-9A-Za-z]+[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") ((= org-plain-list-ordered-item-terminator ?.) - "\\([ \t]*\\([-+]\\|\\([0-9]+\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + "\\([ \t]*\\([-+]\\|\\([0-9A-Za-z]+\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") ((= org-plain-list-ordered-item-terminator ?\)) - "\\([ \t]*\\([-+]\\|\\([0-9]+)\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + "\\([ \t]*\\([-+]\\|\\([0-9A-Za-z]+)\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))) (defun org-at-item-p () @@ -298,7 +298,7 @@ Return t when things worked, nil when we are not in an item." (cond ((and (org-at-item-p) (<= (point) eow)) ;; before the bullet - (beginning-of-line 1) + (beginning-of-line ) (open-line (if blank 2 1))) ((<= (point) eow) (beginning-of-line 1)) @@ -864,14 +864,13 @@ with something like \"1.\" or \"2)\"." ;; find where this list begins (org-beginning-of-item-list) (setq bobp (bobp)) - (looking-at "[ \t]*[0-9]+\\([.)]\\)") - (setq fmt (concat "%d" (or (match-string 1) "."))) - (save-excursion - (goto-char (match-end 0)) - (if (looking-at "[ \t]*\\[@start:\\([0-9]+\\)") - (setq n (1- (string-to-number (match-string 1)))))) - (beginning-of-line 0) - ;; walk forward and replace these numbers + (looking-at "[ \t]*\\([0-9A-Za-z]+\\)\\([.)]\\)") + (let* ((n (if (string-equal (match-string 1) "1") 0 (1- ?a))) + (fmt (if (= n 0) + (concat "%d" (or (match-string 2) ".")) + (concat "%c" (or (match-string 2) "."))))) + (beginning-of-line 0) + ;; walk forward and replace these numbers (catch 'exit (while t (catch 'next @@ -890,7 +889,8 @@ with something like \"1.\" or \"2)\"." (org-shift-item-indentation delta) (if (= (org-current-line) line) (setq col (+ col delta)))))) (org-goto-line line) - (org-move-to-column col))) + (org-move-to-column col)))) + (defvar org-suppress-item-indentation) ; dynamically scoped parameter (defun org-fix-bullet-type (&optional force-bullet) [-- Attachment #3: Type: text/plain, Size: 201 bytes --] _______________________________________________ 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 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* Re: [PATCH] Alphabetical ordered lists 2010-07-29 20:27 [PATCH] Alphabetical ordered lists Nathaniel Flath @ 2010-07-29 21:07 ` Nick Dokos 2010-08-01 18:33 ` David Maus 2010-08-02 9:31 ` Nicolas Goaziou 2010-08-27 8:11 ` Carsten Dominik 2 siblings, 1 reply; 41+ messages in thread From: Nick Dokos @ 2010-07-29 21:07 UTC (permalink / raw) To: Nathaniel Flath; +Cc: nicholas.dokos, emacs-orgmode Nathaniel Flath <flat0103@gmail.com> wrote: > Hello all, > > One thing that had been bugging me was the inability to have an > ordered list of the form: > > a. Item 1 > b. Item 2 > c. Item 3 > > The following patch enables this, with lists going from a-z and A-Z. > Let me know if there are any issues with it. > I think patches with MIME type application/octet-stream will not make it into the patchwork server. Please resend the patch with MIME type set to one of the following: text/plain text/x-patch text/x-diff as David indicated in http://thread.gmane.org/gmane.emacs.orgmode/25513/focus=25560 I think just including the patch in the mail message also works. Thanks, Nick ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH] Alphabetical ordered lists 2010-07-29 21:07 ` Nick Dokos @ 2010-08-01 18:33 ` David Maus 0 siblings, 0 replies; 41+ messages in thread From: David Maus @ 2010-08-01 18:33 UTC (permalink / raw) To: nicholas.dokos; +Cc: emacs-orgmode [-- Attachment #1.1.1: Type: text/plain, Size: 748 bytes --] Nick Dokos wrote: >Nathaniel Flath <flat0103@gmail.com> wrote: >> Hello all, >> >> One thing that had been bugging me was the inability to have an >> ordered list of the form: >> >> a. Item 1 >> b. Item 2 >> c. Item 3 >> >> The following patch enables this, with lists going from a-z and A-Z. >> Let me know if there are any issues with it. >> >I think patches with MIME type application/octet-stream will not make it >into the patchwork server. Please resend the patch with MIME type set to >one of the following: Right, application/octet-stream isn't catched (for good reasons). So here's the patch properly attachet as text/plain. Best, -- David -- OpenPGP... 0x99ADB83B5A4478E6 Jabber.... dmjena@jabber.org Email..... dmaus@ictsoc.de [-- Attachment #1.1.2: alpha-lists.patch --] [-- Type: text/plain, Size: 2610 bytes --] diff --git a/lisp/org-list.el b/lisp/org-list.el old mode 100644 new mode 100755 index cdfd2c5..61e1e88 --- a/lisp/org-list.el +++ b/lisp/org-list.el @@ -227,11 +227,11 @@ If GENERAL is non-nil, return the general regexp independent of the value of `org-plain-list-ordered-item-terminator'." (cond ((or general (eq org-plain-list-ordered-item-terminator t)) - "\\([ \t]*\\([-+]\\|\\([0-9]+[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + "\\([ \t]*\\([-+]\\|\\([0-9A-Za-z]+[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") ((= org-plain-list-ordered-item-terminator ?.) - "\\([ \t]*\\([-+]\\|\\([0-9]+\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + "\\([ \t]*\\([-+]\\|\\([0-9A-Za-z]+\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") ((= org-plain-list-ordered-item-terminator ?\)) - "\\([ \t]*\\([-+]\\|\\([0-9]+)\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + "\\([ \t]*\\([-+]\\|\\([0-9A-Za-z]+)\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))) (defun org-at-item-p () @@ -298,7 +298,7 @@ Return t when things worked, nil when we are not in an item." (cond ((and (org-at-item-p) (<= (point) eow)) ;; before the bullet - (beginning-of-line 1) + (beginning-of-line ) (open-line (if blank 2 1))) ((<= (point) eow) (beginning-of-line 1)) @@ -864,14 +864,13 @@ with something like \"1.\" or \"2)\"." ;; find where this list begins (org-beginning-of-item-list) (setq bobp (bobp)) - (looking-at "[ \t]*[0-9]+\\([.)]\\)") - (setq fmt (concat "%d" (or (match-string 1) "."))) - (save-excursion - (goto-char (match-end 0)) - (if (looking-at "[ \t]*\\[@start:\\([0-9]+\\)") - (setq n (1- (string-to-number (match-string 1)))))) - (beginning-of-line 0) - ;; walk forward and replace these numbers + (looking-at "[ \t]*\\([0-9A-Za-z]+\\)\\([.)]\\)") + (let* ((n (if (string-equal (match-string 1) "1") 0 (1- ?a))) + (fmt (if (= n 0) + (concat "%d" (or (match-string 2) ".")) + (concat "%c" (or (match-string 2) "."))))) + (beginning-of-line 0) + ;; walk forward and replace these numbers (catch 'exit (while t (catch 'next @@ -890,7 +889,8 @@ with something like \"1.\" or \"2)\"." (org-shift-item-indentation delta) (if (= (org-current-line) line) (setq col (+ col delta)))))) (org-goto-line line) - (org-move-to-column col))) + (org-move-to-column col)))) + (defvar org-suppress-item-indentation) ; dynamically scoped parameter (defun org-fix-bullet-type (&optional force-bullet) [-- Attachment #1.2: Type: application/pgp-signature, Size: 230 bytes --] [-- Attachment #2: Type: text/plain, Size: 201 bytes --] _______________________________________________ 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 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* Re: [PATCH] Alphabetical ordered lists 2010-07-29 20:27 [PATCH] Alphabetical ordered lists Nathaniel Flath 2010-07-29 21:07 ` Nick Dokos @ 2010-08-02 9:31 ` Nicolas Goaziou 2010-08-27 8:11 ` Carsten Dominik 2 siblings, 0 replies; 41+ messages in thread From: Nicolas Goaziou @ 2010-08-02 9:31 UTC (permalink / raw) To: Nathaniel Flath; +Cc: emacs-orgmode Hello, >>>>> Nathaniel Flath writes: > One thing that had been bugging me was the inability to have an > ordered list of the form: > a. Item 1 > b. Item 2 > c. Item 3 > The following patch enables this, with lists going from a-z and A-Z. > Let me know if there are any issues with it. If I understand well your patch, I see a couple of issues with it, that should not be hard to correct. - you removed the code allowing to use [@start:number] in a list; - even if you recognize a. and A. lists, you only reorder from a. to z. (bullet start is 1- ?a, not 1- ?A); - what happens when user wants to insert the 27th item in his alphabetically ordered list ? In other words you should have a function to increment such list from z. to aa. Regards, -- Nicolas ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH] Alphabetical ordered lists 2010-07-29 20:27 [PATCH] Alphabetical ordered lists Nathaniel Flath 2010-07-29 21:07 ` Nick Dokos 2010-08-02 9:31 ` Nicolas Goaziou @ 2010-08-27 8:11 ` Carsten Dominik 2010-08-27 10:53 ` Bernt Hansen 2 siblings, 1 reply; 41+ messages in thread From: Carsten Dominik @ 2010-08-27 8:11 UTC (permalink / raw) To: Nathaniel Flath; +Cc: emacs-orgmode On Jul 29, 2010, at 10:27 PM, Nathaniel Flath wrote: > Hello all, > > One thing that had been bugging me was the inability to have an > ordered list of the form: > > a. Item 1 > b. Item 2 > c. Item 3 > > The following patch enables this, with lists going from a-z and A-Z. > Let me know if there are any issues with it. Hi, I am not really sure we need these. They cause problems when lists get really long - also you patch does not further than "z", after that I get "{". Furthermore the export backends implement their own numbering rules anyway. So it seems to me that we do not need this addition. Any other votes here? - Carsten ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: [PATCH] Alphabetical ordered lists 2010-08-27 8:11 ` Carsten Dominik @ 2010-08-27 10:53 ` Bernt Hansen 2010-08-27 12:44 ` Jacob Mitchell 0 siblings, 1 reply; 41+ messages in thread From: Bernt Hansen @ 2010-08-27 10:53 UTC (permalink / raw) To: Carsten Dominik; +Cc: emacs-orgmode Carsten Dominik <carsten.dominik@gmail.com> writes: > On Jul 29, 2010, at 10:27 PM, Nathaniel Flath wrote: > >> Hello all, >> >> One thing that had been bugging me was the inability to have an >> ordered list of the form: >> >> a. Item 1 >> b. Item 2 >> c. Item 3 >> >> The following patch enables this, with lists going from a-z and A-Z. >> Let me know if there are any issues with it. > > Hi, > > I am not really sure we need these. They cause problems when lists get > really long - also you patch does not further than "z", after that I > get "{". > > Furthermore the export backends implement their own numbering > rules anyway. So it seems to me that we do not need this addition. > > Any other votes here? I'm not currently missing this feature. I think it definitely would have to handle more entries if this was to be included in org-mode. Maybe going something like a. b. ... z. aa. ab. ... az. ba. bb. ... zz. ... and if you really need more entries than that (unlikely) you can do aaa. aab. ... and just keep going indefinitely. -Bernt ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-08-27 10:53 ` Bernt Hansen @ 2010-08-27 12:44 ` Jacob Mitchell 2010-08-27 13:01 ` Nathaniel Flath 0 siblings, 1 reply; 41+ messages in thread From: Jacob Mitchell @ 2010-08-27 12:44 UTC (permalink / raw) To: Bernt Hansen; +Cc: emacs-orgmode, Carsten Dominik [-- Attachment #1.1: Type: text/plain, Size: 2121 bytes --] On Fri, Aug 27, 2010 at 6:53 AM, Bernt Hansen <bernt@norang.ca> wrote: > Carsten Dominik <carsten.dominik@gmail.com> writes: > > > On Jul 29, 2010, at 10:27 PM, Nathaniel Flath wrote: > > > >> Hello all, > >> > >> One thing that had been bugging me was the inability to have an > >> ordered list of the form: > >> > >> a. Item 1 > >> b. Item 2 > >> c. Item 3 > >> > >> The following patch enables this, with lists going from a-z and A-Z. > >> Let me know if there are any issues with it. > > > > Hi, > > > > I am not really sure we need these. They cause problems when lists get > > really long - also you patch does not further than "z", after that I > > get "{". > > > > Furthermore the export backends implement their own numbering > > rules anyway. So it seems to me that we do not need this addition. > > > > Any other votes here? > > I'm not currently missing this feature. I think it definitely would > have to handle more entries if this was to be included in org-mode. > I agree, that would be nice. > > Maybe going something like > > a. > b. > ... > z. > aa. > ab. > ... > az. > ba. > bb. > ... > zz. > ... and if you really need more entries than that (unlikely) you can > do > aaa. > aab. > ... > and just keep going indefinitely. > As a practical matter we should consider whether it's worth making a non-terminating sequence that can be handled by the exporters. LaTeX's enumerate package doesn't like going beyond (z): \documentclass[letterpaper]{article} \usepackage{enumerate} \begin{document} \begin{enumerate}[(z)] \item ... \end{document} The items beyond the 26th are mapped to "()". Of course there are going to be ways around these issues, but the question is whether it's desirable enough to implement and maintain that. Either way is fine with me--I'm new on the mailing list and haven't done any development for org-mode yet. -Jake > > -Bernt > > _______________________________________________ > 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 > [-- Attachment #1.2: Type: text/html, Size: 3425 bytes --] [-- Attachment #2: Type: text/plain, Size: 201 bytes --] _______________________________________________ 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 ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-08-27 12:44 ` Jacob Mitchell @ 2010-08-27 13:01 ` Nathaniel Flath 2010-09-18 7:43 ` Nathaniel Flath 0 siblings, 1 reply; 41+ messages in thread From: Nathaniel Flath @ 2010-08-27 13:01 UTC (permalink / raw) To: Jacob Mitchell; +Cc: Bernt Hansen, emacs-orgmode, Carsten Dominik I was going to fix the issues described in the first reply - not enough items in particular - and resubmit soon. I got a bit distracted by finals. I'll see if I can figure out the export problem, as well. Thanks, Nathaniel Flath On Fri, Aug 27, 2010 at 5:44 AM, Jacob Mitchell <jacob.d.mitchell@gmail.com> wrote: > > > On Fri, Aug 27, 2010 at 6:53 AM, Bernt Hansen <bernt@norang.ca> wrote: >> >> Carsten Dominik <carsten.dominik@gmail.com> writes: >> >> > On Jul 29, 2010, at 10:27 PM, Nathaniel Flath wrote: >> > >> >> Hello all, >> >> >> >> One thing that had been bugging me was the inability to have an >> >> ordered list of the form: >> >> >> >> a. Item 1 >> >> b. Item 2 >> >> c. Item 3 >> >> >> >> The following patch enables this, with lists going from a-z and A-Z. >> >> Let me know if there are any issues with it. >> > >> > Hi, >> > >> > I am not really sure we need these. They cause problems when lists get >> > really long - also you patch does not further than "z", after that I >> > get "{". >> > >> > Furthermore the export backends implement their own numbering >> > rules anyway. So it seems to me that we do not need this addition. >> > >> > Any other votes here? >> >> I'm not currently missing this feature. I think it definitely would >> have to handle more entries if this was to be included in org-mode. > > I agree, that would be nice. > >> >> Maybe going something like >> >> a. >> b. >> ... >> z. >> aa. >> ab. >> ... >> az. >> ba. >> bb. >> ... >> zz. >> ... and if you really need more entries than that (unlikely) you can >> do >> aaa. >> aab. >> ... >> and just keep going indefinitely. > > As a practical matter we should consider whether it's worth making a > non-terminating sequence that can be handled by the exporters. LaTeX's > enumerate package doesn't like going beyond (z): > > \documentclass[letterpaper]{article} > \usepackage{enumerate} > > \begin{document} > \begin{enumerate}[(z)] > \item > ... > \end{document} > > The items beyond the 26th are mapped to "()". > > Of course there are going to be ways around these issues, but the question > is whether it's desirable enough to implement and maintain that. Either way > is fine with me--I'm new on the mailing list and haven't done any > development for org-mode yet. > > -Jake >> >> -Bernt >> >> _______________________________________________ >> 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 > > > _______________________________________________ > 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 > > ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-08-27 13:01 ` Nathaniel Flath @ 2010-09-18 7:43 ` Nathaniel Flath 2010-09-21 12:48 ` Carsten Dominik 0 siblings, 1 reply; 41+ messages in thread From: Nathaniel Flath @ 2010-09-18 7:43 UTC (permalink / raw) To: Jacob Mitchell; +Cc: Bernt Hansen, emacs-orgmode, Carsten Dominik [-- Attachment #1: Type: text/plain, Size: 10125 bytes --] Hey, I gave another shot at this, now that my computer is no longer dead. I believe it fixes the issues described earlier - let me know of any feedback. (Also - I don't know how to get GMail to attach this as anything other than application/octet-stream, so the text is in the message as well. Nathaniel Flath Attachment: diff --git a/lisp/org-list.el b/lisp/org-list.el index d9fc24e..88d5a9b 100644 --- a/lisp/org-list.el +++ b/lisp/org-list.el @@ -287,14 +287,14 @@ It depends on `org-empty-line-terminates-plain-lists'." "Return the correct regular expression for plain lists. If GENERAL is non-nil, return the general regexp independent of the value of `org-plain-list-ordered-item-terminator'." - (cond - ((or general (eq org-plain-list-ordered-item-terminator t)) - "\\([ \t]*\\([-+]\\|\\([0-9]+[.)]\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") - ((= org-plain-list-ordered-item-terminator ?.) - "\\([ \t]*\\([-+]\\|\\([0-9]+\\.\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") +(cond + ((or general (eq org-plain-list-ordered-item-terminator t)) + "\\([ \t]*\\([-+]\\|\\([0-9A-Za-z]+[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + ((= org-plain-list-ordered-item-terminator ?.) + "\\([ \t]*\\([-+]\\|\\([0-9A-Za-z]+\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") ((= org-plain-list-ordered-item-terminator ?\)) - "\\([ \t]*\\([-+]\\|\\([0-9]+)\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") - (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))) + "\\([ \t]*\\([-+]\\|\\([0-9A-Za-z]+)\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))) (defconst org-item-beginning-re (concat "^" (org-item-re)) "Regexp matching the beginning of a plain list item.") @@ -530,7 +530,7 @@ List ending is determined by the indentation of text. See (save-excursion (goto-char (match-end 0)) ;; Ignore counter if any - (when (looking-at "\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?") + (when (looking-at "\\(?:\\[@\\(?:start:\\)?[0-9A-Za-z]+\\][ \t]*\\)?") (goto-char (match-end 0))) (looking-at regexp)))) @@ -1135,11 +1135,11 @@ bullet string and bullet counter, if any." (list (point-at-bol) (org-get-indentation) (progn - (looking-at "^[ \t]*\\([-+*0-9.)]+[ \t]+\\)") + (looking-at "^[ \t]*\\([-+*0-9A-Za-z.)]+[ \t]+\\)") (match-string 1)) (progn (goto-char (match-end 0)) - (and (looking-at "\\[@\\(?:start:\\)?\\([0-9]+\\)\\]") + (and (looking-at "\\[@\\(?:start:\\)?\\([0-9A-Za-z]+\\)\\]") (match-string 1)))))) (defun org-list-struct (begin end top bottom &optional outdent) @@ -1259,8 +1259,10 @@ This function modifies STRUCT." (let ((counter (nth 3 item)) (bullet (org-list-bullet-string (nth 2 item)))) (cond - ((and (string-match "[0-9]+" bullet) counter) + ((and (string-match "[0-9A-Za-z]+" bullet) counter) (replace-match counter nil nil bullet)) + ((string-match "[A-Za-z]+" bullet) + (replace-match "a" nil nil bullet)) ((string-match "[0-9]+" bullet) (replace-match "1" nil nil bullet)) (t bullet))))) @@ -1268,7 +1270,7 @@ This function modifies STRUCT." (setcdr item (list (nth 1 item) bullet (nth 3 item))))) (get-bul (lambda (item bullet) (let* ((counter (nth 3 item))) - (if (and counter (string-match "[0-9]+" bullet)) + (if (and counter (string-match "[0-9A-Za-z]+" bullet)) (replace-match counter nil nil bullet) bullet)))) (fix-bul @@ -1582,13 +1584,50 @@ It determines the number of whitespaces to append by looking at " "))) nil nil bullet 1))) +(defun org-increment-string (str cap) + "Increments str (a->a, b->b, z->aa, aa->ab etc). If cap is non-nil, then + the letters are capitalized." + (let ((res (org-convert-num-to-alpha-str + (1+ (org-convert-alpha-str-to-num str 1 (length str) cap)) cap)) + (z (if cap ?Z ?z)) + (b (if cap ?B ?b)) + (a (if cap ?A ?a))) + (if (and(= (string-to-char str) z) + (= (string-to-char res) b)) + (concat (if cap "A" "a") (substring res 1)) + (concat (make-string (- (length str) (length res)) a) res)))) + +(defun org-convert-alpha-str-to-num (str n pos cap) + "Converts the substring consisting of locations pos to pos-n to a + numeric representation." + (let ((a (if cap ?A ?a))) + (if (= pos 1) (* (- (string-to-char str) a) n) + (+ (* (- (nth (1- pos) (string-to-list str)) a) n) + (org-convert-alpha-str-to-num str (* 26 n) (1- pos) cap))))) + +(defun org-convert-num-to-alpha-str (n cap) + "Converts the number n to a alphabetical, base-26 representation." + (if (= n 0) "" + (concat (org-convert-num-to-alpha-str (/ n 26) cap) + (string (+ (if cap ?A ?a) (% n 26)))))) + (defun org-list-inc-bullet-maybe (bullet) "Increment BULLET if applicable." - (if (string-match "[0-9]+" bullet) + (let ((case-fold-search nil)) + (cond + ((string-match "[0-9]+" bullet) (replace-match (number-to-string (1+ (string-to-number (match-string 0 bullet)))) - nil nil bullet) - bullet)) + nil nil bullet)) + ((string-match "[a-z]+" bullet) + (replace-match + (org-increment-string (match-string 0 bullet) nil) + nil nil bullet)) + ((string-match "[A-Z]+" bullet) + (replace-match + (org-increment-string (match-string 0 bullet) t) + nil nil bullet)) + (t bullet)))) (defun org-list-repair (&optional force-bullet top bottom) "Make sure all items are correctly indented, with the right bullet. @@ -1980,7 +2019,7 @@ compare entries." (goto-char (org-end-of-item-before-blank end)))) (value-to-sort (lambda () - (when (looking-at "[ \t]*[-+*0-9.)]+\\([ \t]+\\[[- X]\\]\\)?[ \t]+") + (when (looking-at "[ \t]*[-+*0-9A-Za-z.)]+\\([ \t]+\\[[- X]\\]\\)?[ \t]+") (cond ((= dcst ?n) (string-to-number (buffer-substring (match-end 0) @@ -2028,7 +2067,7 @@ sublevels as a list of strings." (while (org-search-forward-unenclosed org-item-beginning-re end t) (save-excursion (beginning-of-line) - (setq ltype (cond ((looking-at-p "^[ \t]*[0-9]") 'ordered) + (setq ltype (cond ((looking-at-p "^[ \t]*[0-9A-Za-z]") 'ordered) ((org-at-item-description-p) 'descriptive) (t 'unordered)))) (let* ((indent1 (org-get-indentation)) @@ -2037,7 +2076,7 @@ sublevels as a list of strings." (org-end-of-item-or-at-child end)))) (nextindent (if (= (point) end) 0 (org-get-indentation))) (item (if (string-match - "^\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?\\[\\([xX ]\\)\\]" + "^\\(?:\\[@\\(?:start:\\)?[0-9A-Za-z]+\\][ \t]*\\)?\\[\\([xX ]\\)\\]" item) (replace-match (if (equal (match-string 1 item) " ") "CBOFF" On Fri, Aug 27, 2010 at 6:01 AM, Nathaniel Flath <flat0103@gmail.com> wrote: > I was going to fix the issues described in the first reply - not > enough items in particular - and resubmit soon. I got a bit > distracted by finals. I'll see if I can figure out the export > problem, as well. > > Thanks, > Nathaniel Flath > > On Fri, Aug 27, 2010 at 5:44 AM, Jacob Mitchell > <jacob.d.mitchell@gmail.com> wrote: >> >> >> On Fri, Aug 27, 2010 at 6:53 AM, Bernt Hansen <bernt@norang.ca> wrote: >>> >>> Carsten Dominik <carsten.dominik@gmail.com> writes: >>> >>> > On Jul 29, 2010, at 10:27 PM, Nathaniel Flath wrote: >>> > >>> >> Hello all, >>> >> >>> >> One thing that had been bugging me was the inability to have an >>> >> ordered list of the form: >>> >> >>> >> a. Item 1 >>> >> b. Item 2 >>> >> c. Item 3 >>> >> >>> >> The following patch enables this, with lists going from a-z and A-Z. >>> >> Let me know if there are any issues with it. >>> > >>> > Hi, >>> > >>> > I am not really sure we need these. They cause problems when lists get >>> > really long - also you patch does not further than "z", after that I >>> > get "{". >>> > >>> > Furthermore the export backends implement their own numbering >>> > rules anyway. So it seems to me that we do not need this addition. >>> > >>> > Any other votes here? >>> >>> I'm not currently missing this feature. I think it definitely would >>> have to handle more entries if this was to be included in org-mode. >> >> I agree, that would be nice. >> >>> >>> Maybe going something like >>> >>> a. >>> b. >>> ... >>> z. >>> aa. >>> ab. >>> ... >>> az. >>> ba. >>> bb. >>> ... >>> zz. >>> ... and if you really need more entries than that (unlikely) you can >>> do >>> aaa. >>> aab. >>> ... >>> and just keep going indefinitely. >> >> As a practical matter we should consider whether it's worth making a >> non-terminating sequence that can be handled by the exporters. LaTeX's >> enumerate package doesn't like going beyond (z): >> >> \documentclass[letterpaper]{article} >> \usepackage{enumerate} >> >> \begin{document} >> \begin{enumerate}[(z)] >> \item >> ... >> \end{document} >> >> The items beyond the 26th are mapped to "()". >> >> Of course there are going to be ways around these issues, but the question >> is whether it's desirable enough to implement and maintain that. Either way >> is fine with me--I'm new on the mailing list and haven't done any >> development for org-mode yet. >> >> -Jake >>> >>> -Bernt >>> >>> _______________________________________________ >>> 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 >> >> >> _______________________________________________ >> 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 >> >> > [-- Attachment #2: ordered-list.patch --] [-- Type: application/octet-stream, Size: 6732 bytes --] diff --git a/lisp/org-list.el b/lisp/org-list.el index d9fc24e..88d5a9b 100644 --- a/lisp/org-list.el +++ b/lisp/org-list.el @@ -287,14 +287,14 @@ It depends on `org-empty-line-terminates-plain-lists'." "Return the correct regular expression for plain lists. If GENERAL is non-nil, return the general regexp independent of the value of `org-plain-list-ordered-item-terminator'." - (cond - ((or general (eq org-plain-list-ordered-item-terminator t)) - "\\([ \t]*\\([-+]\\|\\([0-9]+[.)]\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") - ((= org-plain-list-ordered-item-terminator ?.) - "\\([ \t]*\\([-+]\\|\\([0-9]+\\.\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") +(cond + ((or general (eq org-plain-list-ordered-item-terminator t)) + "\\([ \t]*\\([-+]\\|\\([0-9A-Za-z]+[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + ((= org-plain-list-ordered-item-terminator ?.) + "\\([ \t]*\\([-+]\\|\\([0-9A-Za-z]+\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") ((= org-plain-list-ordered-item-terminator ?\)) - "\\([ \t]*\\([-+]\\|\\([0-9]+)\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") - (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))) + "\\([ \t]*\\([-+]\\|\\([0-9A-Za-z]+)\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))) (defconst org-item-beginning-re (concat "^" (org-item-re)) "Regexp matching the beginning of a plain list item.") @@ -530,7 +530,7 @@ List ending is determined by the indentation of text. See (save-excursion (goto-char (match-end 0)) ;; Ignore counter if any - (when (looking-at "\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?") + (when (looking-at "\\(?:\\[@\\(?:start:\\)?[0-9A-Za-z]+\\][ \t]*\\)?") (goto-char (match-end 0))) (looking-at regexp)))) @@ -1135,11 +1135,11 @@ bullet string and bullet counter, if any." (list (point-at-bol) (org-get-indentation) (progn - (looking-at "^[ \t]*\\([-+*0-9.)]+[ \t]+\\)") + (looking-at "^[ \t]*\\([-+*0-9A-Za-z.)]+[ \t]+\\)") (match-string 1)) (progn (goto-char (match-end 0)) - (and (looking-at "\\[@\\(?:start:\\)?\\([0-9]+\\)\\]") + (and (looking-at "\\[@\\(?:start:\\)?\\([0-9A-Za-z]+\\)\\]") (match-string 1)))))) (defun org-list-struct (begin end top bottom &optional outdent) @@ -1259,8 +1259,10 @@ This function modifies STRUCT." (let ((counter (nth 3 item)) (bullet (org-list-bullet-string (nth 2 item)))) (cond - ((and (string-match "[0-9]+" bullet) counter) + ((and (string-match "[0-9A-Za-z]+" bullet) counter) (replace-match counter nil nil bullet)) + ((string-match "[A-Za-z]+" bullet) + (replace-match "a" nil nil bullet)) ((string-match "[0-9]+" bullet) (replace-match "1" nil nil bullet)) (t bullet))))) @@ -1268,7 +1270,7 @@ This function modifies STRUCT." (setcdr item (list (nth 1 item) bullet (nth 3 item))))) (get-bul (lambda (item bullet) (let* ((counter (nth 3 item))) - (if (and counter (string-match "[0-9]+" bullet)) + (if (and counter (string-match "[0-9A-Za-z]+" bullet)) (replace-match counter nil nil bullet) bullet)))) (fix-bul @@ -1582,13 +1584,50 @@ It determines the number of whitespaces to append by looking at " "))) nil nil bullet 1))) +(defun org-increment-string (str cap) + "Increments str (a->a, b->b, z->aa, aa->ab etc). If cap is non-nil, then + the letters are capitalized." + (let ((res (org-convert-num-to-alpha-str + (1+ (org-convert-alpha-str-to-num str 1 (length str) cap)) cap)) + (z (if cap ?Z ?z)) + (b (if cap ?B ?b)) + (a (if cap ?A ?a))) + (if (and(= (string-to-char str) z) + (= (string-to-char res) b)) + (concat (if cap "A" "a") (substring res 1)) + (concat (make-string (- (length str) (length res)) a) res)))) + +(defun org-convert-alpha-str-to-num (str n pos cap) + "Converts the substring consisting of locations pos to pos-n to a + numeric representation." + (let ((a (if cap ?A ?a))) + (if (= pos 1) (* (- (string-to-char str) a) n) + (+ (* (- (nth (1- pos) (string-to-list str)) a) n) + (org-convert-alpha-str-to-num str (* 26 n) (1- pos) cap))))) + +(defun org-convert-num-to-alpha-str (n cap) + "Converts the number n to a alphabetical, base-26 representation." + (if (= n 0) "" + (concat (org-convert-num-to-alpha-str (/ n 26) cap) + (string (+ (if cap ?A ?a) (% n 26)))))) + (defun org-list-inc-bullet-maybe (bullet) "Increment BULLET if applicable." - (if (string-match "[0-9]+" bullet) + (let ((case-fold-search nil)) + (cond + ((string-match "[0-9]+" bullet) (replace-match (number-to-string (1+ (string-to-number (match-string 0 bullet)))) - nil nil bullet) - bullet)) + nil nil bullet)) + ((string-match "[a-z]+" bullet) + (replace-match + (org-increment-string (match-string 0 bullet) nil) + nil nil bullet)) + ((string-match "[A-Z]+" bullet) + (replace-match + (org-increment-string (match-string 0 bullet) t) + nil nil bullet)) + (t bullet)))) (defun org-list-repair (&optional force-bullet top bottom) "Make sure all items are correctly indented, with the right bullet. @@ -1980,7 +2019,7 @@ compare entries." (goto-char (org-end-of-item-before-blank end)))) (value-to-sort (lambda () - (when (looking-at "[ \t]*[-+*0-9.)]+\\([ \t]+\\[[- X]\\]\\)?[ \t]+") + (when (looking-at "[ \t]*[-+*0-9A-Za-z.)]+\\([ \t]+\\[[- X]\\]\\)?[ \t]+") (cond ((= dcst ?n) (string-to-number (buffer-substring (match-end 0) @@ -2028,7 +2067,7 @@ sublevels as a list of strings." (while (org-search-forward-unenclosed org-item-beginning-re end t) (save-excursion (beginning-of-line) - (setq ltype (cond ((looking-at-p "^[ \t]*[0-9]") 'ordered) + (setq ltype (cond ((looking-at-p "^[ \t]*[0-9A-Za-z]") 'ordered) ((org-at-item-description-p) 'descriptive) (t 'unordered)))) (let* ((indent1 (org-get-indentation)) @@ -2037,7 +2076,7 @@ sublevels as a list of strings." (org-end-of-item-or-at-child end)))) (nextindent (if (= (point) end) 0 (org-get-indentation))) (item (if (string-match - "^\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?\\[\\([xX ]\\)\\]" + "^\\(?:\\[@\\(?:start:\\)?[0-9A-Za-z]+\\][ \t]*\\)?\\[\\([xX ]\\)\\]" item) (replace-match (if (equal (match-string 1 item) " ") "CBOFF" [-- Attachment #3: Type: text/plain, Size: 201 bytes --] _______________________________________________ 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 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-09-18 7:43 ` Nathaniel Flath @ 2010-09-21 12:48 ` Carsten Dominik 2010-09-21 16:46 ` Nicolas Goaziou 2010-09-26 17:36 ` Nicolas Goaziou 0 siblings, 2 replies; 41+ messages in thread From: Carsten Dominik @ 2010-09-21 12:48 UTC (permalink / raw) To: Nathaniel Flath; +Cc: Bernt Hansen, Jacob Mitchell, emacs-orgmode Hi everyone, I would like to know if there are more people interested in this, and if there are people who are willing to test this patch, to make sure nothing breaks. Nicolas, can you in particular please take a look at this - I believe you earlier said that you saw problems with it. Thanks! - Carsten On Sep 18, 2010, at 9:43 AM, Nathaniel Flath wrote: > Hey, > I gave another shot at this, now that my computer is no longer dead. > I believe it fixes the issues described earlier - let me know of any > feedback. > (Also - I don't know how to get GMail to attach this as anything other > than application/octet-stream, so the text is in the message as well. > Nathaniel Flath > > > Attachment: > > diff --git a/lisp/org-list.el b/lisp/org-list.el > index d9fc24e..88d5a9b 100644 > --- a/lisp/org-list.el > +++ b/lisp/org-list.el > @@ -287,14 +287,14 @@ It depends on `org-empty-line-terminates-plain- > lists'." > "Return the correct regular expression for plain lists. > If GENERAL is non-nil, return the general regexp independent of the > value > of `org-plain-list-ordered-item-terminator'." > - (cond > - ((or general (eq org-plain-list-ordered-item-terminator t)) > - "\\([ \t]*\\([-+]\\|\\([0-9]+[.)]\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\ > \|$\\)") > - ((= org-plain-list-ordered-item-terminator ?.) > - "\\([ \t]*\\([-+]\\|\\([0-9]+\\.\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\ > \|$\\)") > +(cond > + ((or general (eq org-plain-list-ordered-item-terminator t)) > + "\\([ \t]*\\([-+]\\|\\([0-9A-Za-z]+[.)]\\)\\)\\|[ \t]+\\*\\)\\( \ > \|$\\)") > + ((= org-plain-list-ordered-item-terminator ?.) > + "\\([ \t]*\\([-+]\\|\\([0-9A-Za-z]+\\.\\)\\)\\|[ \t]+\\*\\)\\( \ > \|$\\)") > ((= org-plain-list-ordered-item-terminator ?\)) > - "\\([ \t]*\\([-+]\\|\\([0-9]+)\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$ > \\)") > - (t (error "Invalid value of `org-plain-list-ordered-item- > terminator'")))) > + "\\([ \t]*\\([-+]\\|\\([0-9A-Za-z]+)\\)\\)\\|[ \t]+\\*\\)\\( \\| > $\\)") > + (t (error "Invalid value of `org-plain-list-ordered-item- > terminator'")))) > > (defconst org-item-beginning-re (concat "^" (org-item-re)) > "Regexp matching the beginning of a plain list item.") > @@ -530,7 +530,7 @@ List ending is determined by the indentation of > text. See > (save-excursion > (goto-char (match-end 0)) > ;; Ignore counter if any > - (when (looking-at "\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\ > \)?") > + (when (looking-at "\\(?:\\[@\\(?:start:\\)?[0-9A-Za-z]+\\] > [ \t]*\\)?") > (goto-char (match-end 0))) > (looking-at regexp)))) > > @@ -1135,11 +1135,11 @@ bullet string and bullet counter, if any." > (list (point-at-bol) > (org-get-indentation) > (progn > - (looking-at "^[ \t]*\\([-+*0-9.)]+[ \t]+\\)") > + (looking-at "^[ \t]*\\([-+*0-9A-Za-z.)]+[ \t]+\\)") > (match-string 1)) > (progn > (goto-char (match-end 0)) > - (and (looking-at "\\[@\\(?:start:\\)?\\([0-9]+\\)\\]") > + (and (looking-at "\\[@\\(?:start:\\)?\\([0-9A-Za-z]+\\)\ > \]") > (match-string 1)))))) > > (defun org-list-struct (begin end top bottom &optional outdent) > @@ -1259,8 +1259,10 @@ This function modifies STRUCT." > (let ((counter (nth 3 item)) > (bullet (org-list-bullet-string (nth 2 item)))) > (cond > - ((and (string-match "[0-9]+" bullet) counter) > + ((and (string-match "[0-9A-Za-z]+" bullet) counter) > (replace-match counter nil nil bullet)) > + ((string-match "[A-Za-z]+" bullet) > + (replace-match "a" nil nil bullet)) > ((string-match "[0-9]+" bullet) > (replace-match "1" nil nil bullet)) > (t bullet))))) > @@ -1268,7 +1270,7 @@ This function modifies STRUCT." > (setcdr item (list (nth 1 item) bullet (nth 3 item))))) > (get-bul (lambda (item bullet) > (let* ((counter (nth 3 item))) > - (if (and counter (string-match "[0-9]+" bullet)) > + (if (and counter (string-match "[0-9A-Za-z]+" bullet)) > (replace-match counter nil nil bullet) > bullet)))) > (fix-bul > @@ -1582,13 +1584,50 @@ It determines the number of whitespaces to > append by looking at > " "))) > nil nil bullet 1))) > > +(defun org-increment-string (str cap) > + "Increments str (a->a, b->b, z->aa, aa->ab etc). If cap is non- > nil, then > + the letters are capitalized." > + (let ((res (org-convert-num-to-alpha-str > + (1+ (org-convert-alpha-str-to-num str 1 (length str) cap)) > cap)) > + (z (if cap ?Z ?z)) > + (b (if cap ?B ?b)) > + (a (if cap ?A ?a))) > + (if (and(= (string-to-char str) z) > + (= (string-to-char res) b)) > + (concat (if cap "A" "a") (substring res 1)) > + (concat (make-string (- (length str) (length res)) a) res)))) > + > +(defun org-convert-alpha-str-to-num (str n pos cap) > + "Converts the substring consisting of locations pos to pos-n to a > + numeric representation." > + (let ((a (if cap ?A ?a))) > + (if (= pos 1) (* (- (string-to-char str) a) n) > + (+ (* (- (nth (1- pos) (string-to-list str)) a) n) > + (org-convert-alpha-str-to-num str (* 26 n) (1- pos) cap))))) > + > +(defun org-convert-num-to-alpha-str (n cap) > + "Converts the number n to a alphabetical, base-26 representation." > + (if (= n 0) "" > + (concat (org-convert-num-to-alpha-str (/ n 26) cap) > + (string (+ (if cap ?A ?a) (% n 26)))))) > + > (defun org-list-inc-bullet-maybe (bullet) > "Increment BULLET if applicable." > - (if (string-match "[0-9]+" bullet) > + (let ((case-fold-search nil)) > + (cond > + ((string-match "[0-9]+" bullet) > (replace-match > (number-to-string (1+ (string-to-number (match-string 0 > bullet)))) > - nil nil bullet) > - bullet)) > + nil nil bullet)) > + ((string-match "[a-z]+" bullet) > + (replace-match > + (org-increment-string (match-string 0 bullet) nil) > + nil nil bullet)) > + ((string-match "[A-Z]+" bullet) > + (replace-match > + (org-increment-string (match-string 0 bullet) t) > + nil nil bullet)) > + (t bullet)))) > > (defun org-list-repair (&optional force-bullet top bottom) > "Make sure all items are correctly indented, with the right bullet. > @@ -1980,7 +2019,7 @@ compare entries." > (goto-char (org-end-of-item-before-blank end)))) > (value-to-sort > (lambda () > - (when (looking-at "[ \t]*[-+*0-9.)]+\\([ \t]+\\[[- X]\\]\\)?[ \t] > +") > + (when (looking-at "[ \t]*[-+*0-9A-Za-z.)]+\\([ \t]+\\[[- X]\\]\\)? > [ \t]+") > (cond > ((= dcst ?n) > (string-to-number (buffer-substring (match-end 0) > @@ -2028,7 +2067,7 @@ sublevels as a list of strings." > (while (org-search-forward-unenclosed org-item-beginning-re end t) > (save-excursion > (beginning-of-line) > - (setq ltype (cond ((looking-at-p "^[ \t]*[0-9]") 'ordered) > + (setq ltype (cond ((looking-at-p "^[ \t]*[0-9A-Za-z]") 'ordered) > ((org-at-item-description-p) 'descriptive) > (t 'unordered)))) > (let* ((indent1 (org-get-indentation)) > @@ -2037,7 +2076,7 @@ sublevels as a list of strings." > (org-end-of-item-or-at-child end)))) > (nextindent (if (= (point) end) 0 (org-get-indentation))) > (item (if (string-match > - "^\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?\\[\\([xX ]\\)\\]" > + "^\\(?:\\[@\\(?:start:\\)?[0-9A-Za-z]+\\][ \t]*\\)?\\[\\([xX ]\\) > \\]" > item) > (replace-match (if (equal (match-string 1 item) " ") > "CBOFF" > > > On Fri, Aug 27, 2010 at 6:01 AM, Nathaniel Flath > <flat0103@gmail.com> wrote: >> I was going to fix the issues described in the first reply - not >> enough items in particular - and resubmit soon. I got a bit >> distracted by finals. I'll see if I can figure out the export >> problem, as well. >> >> Thanks, >> Nathaniel Flath >> >> On Fri, Aug 27, 2010 at 5:44 AM, Jacob Mitchell >> <jacob.d.mitchell@gmail.com> wrote: >>> >>> >>> On Fri, Aug 27, 2010 at 6:53 AM, Bernt Hansen <bernt@norang.ca> >>> wrote: >>>> >>>> Carsten Dominik <carsten.dominik@gmail.com> writes: >>>> >>>>> On Jul 29, 2010, at 10:27 PM, Nathaniel Flath wrote: >>>>> >>>>>> Hello all, >>>>>> >>>>>> One thing that had been bugging me was the inability to have an >>>>>> ordered list of the form: >>>>>> >>>>>> a. Item 1 >>>>>> b. Item 2 >>>>>> c. Item 3 >>>>>> >>>>>> The following patch enables this, with lists going from a-z and >>>>>> A-Z. >>>>>> Let me know if there are any issues with it. >>>>> >>>>> Hi, >>>>> >>>>> I am not really sure we need these. They cause problems when >>>>> lists get >>>>> really long - also you patch does not further than "z", after >>>>> that I >>>>> get "{". >>>>> >>>>> Furthermore the export backends implement their own numbering >>>>> rules anyway. So it seems to me that we do not need this >>>>> addition. >>>>> >>>>> Any other votes here? >>>> >>>> I'm not currently missing this feature. I think it definitely >>>> would >>>> have to handle more entries if this was to be included in org-mode. >>> >>> I agree, that would be nice. >>> >>>> >>>> Maybe going something like >>>> >>>> a. >>>> b. >>>> ... >>>> z. >>>> aa. >>>> ab. >>>> ... >>>> az. >>>> ba. >>>> bb. >>>> ... >>>> zz. >>>> ... and if you really need more entries than that (unlikely) you >>>> can >>>> do >>>> aaa. >>>> aab. >>>> ... >>>> and just keep going indefinitely. >>> >>> As a practical matter we should consider whether it's worth making a >>> non-terminating sequence that can be handled by the exporters. >>> LaTeX's >>> enumerate package doesn't like going beyond (z): >>> >>> \documentclass[letterpaper]{article} >>> \usepackage{enumerate} >>> >>> \begin{document} >>> \begin{enumerate}[(z)] >>> \item >>> ... >>> \end{document} >>> >>> The items beyond the 26th are mapped to "()". >>> >>> Of course there are going to be ways around these issues, but the >>> question >>> is whether it's desirable enough to implement and maintain that. >>> Either way >>> is fine with me--I'm new on the mailing list and haven't done any >>> development for org-mode yet. >>> >>> -Jake >>>> >>>> -Bernt >>>> >>>> _______________________________________________ >>>> 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 >>> >>> >>> _______________________________________________ >>> 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 >>> >>> >> > <ordered-list.patch> - Carsten ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-09-21 12:48 ` Carsten Dominik @ 2010-09-21 16:46 ` Nicolas Goaziou 2010-09-26 17:36 ` Nicolas Goaziou 1 sibling, 0 replies; 41+ messages in thread From: Nicolas Goaziou @ 2010-09-21 16:46 UTC (permalink / raw) To: Carsten Dominik; +Cc: Bernt Hansen, emacs-orgmode, Jacob Mitchell Hello, >>>>> Carsten Dominik writes: > Nicolas, can you in particular please take a look at this - I > believe you earlier said that you saw problems with it. Sure, I will have a look at it on Sunday. But before testing it, there is, by design, one thing that seems dangerous to me. Let's consider the following text: This is a sentence in a not so short paragraph, ending where it should not. What is this line supposed to mean for Org? If this is a recognized as a list, wouldn't this line get wrongly indented? Regards, -- Nicolas ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-09-21 12:48 ` Carsten Dominik 2010-09-21 16:46 ` Nicolas Goaziou @ 2010-09-26 17:36 ` Nicolas Goaziou 2010-09-26 22:16 ` Nathaniel Flath 1 sibling, 1 reply; 41+ messages in thread From: Nicolas Goaziou @ 2010-09-26 17:36 UTC (permalink / raw) To: Carsten Dominik; +Cc: Bernt Hansen, emacs-orgmode, Jacob Mitchell Hello, I've tried the patch today. There are still some easily-fixed glitches (like letters not included in org-cycle-list-bullet, or bullets allowing mixed text and numbers). But, there is apparently one major drawback, as I said in a previous post. If the line starts with a word followed by a dot or a parenthesis, Org will see a bullet there. This is bad news because the following line will be indented, or a M-RET will delete the word, replacing it with a) or a. Regards, -- Nicolas ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-09-26 17:36 ` Nicolas Goaziou @ 2010-09-26 22:16 ` Nathaniel Flath 2010-09-27 6:55 ` Nicolas Goaziou 0 siblings, 1 reply; 41+ messages in thread From: Nathaniel Flath @ 2010-09-26 22:16 UTC (permalink / raw) To: Nicolas Goaziou Cc: Bernt Hansen, Jacob Mitchell, emacs-orgmode, Carsten Dominik > But, there is apparently one major drawback, as I said in a previous > post. If the line starts with a word followed by a dot or a > parenthesis, Org will see a bullet there. This is bad news because the > following line will be indented, or a M-RET will delete the word, > replacing it with a) or a. > > Regards, > > -- Nicolas > Yes, this happens - it's not something that comes up during my normal usage, so I didn't notice. Can you think of a way to determine if this is the case vs. a list is actually wanted? Thanks, Nathaniel Flath ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-09-26 22:16 ` Nathaniel Flath @ 2010-09-27 6:55 ` Nicolas Goaziou 2010-09-28 16:12 ` Carsten Dominik 0 siblings, 1 reply; 41+ messages in thread From: Nicolas Goaziou @ 2010-09-27 6:55 UTC (permalink / raw) To: Nathaniel Flath Cc: Bernt Hansen, Jacob Mitchell, emacs-orgmode, Carsten Dominik >>>>> Nathaniel Flath writes: >> But, there is apparently one major drawback, as I said in a >> previous post. If the line starts with a word followed by a dot or >> a parenthesis, Org will see a bullet there. This is bad news >> because the following line will be indented, or a M-RET will delete >> the word, replacing it with a) or a. > Yes, this happens - it's not something that comes up during my > normal usage, so I didn't notice. Can you think of a way to > determine if this is the case vs. a list is actually wanted? Unfortunately, I can't see anything clean. This is tricky because lists are the closest construct to raw text. -- Nicolas ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-09-27 6:55 ` Nicolas Goaziou @ 2010-09-28 16:12 ` Carsten Dominik 2010-09-29 15:49 ` Carsten Dominik 0 siblings, 1 reply; 41+ messages in thread From: Carsten Dominik @ 2010-09-28 16:12 UTC (permalink / raw) To: Nicolas Goaziou; +Cc: Bernt Hansen, emacs-orgmode, Jacob Mitchell On Sep 27, 2010, at 8:55 AM, Nicolas Goaziou wrote: >>>>>> Nathaniel Flath writes: > >>> But, there is apparently one major drawback, as I said in a >>> previous post. If the line starts with a word followed by a dot or >>> a parenthesis, Org will see a bullet there. This is bad news >>> because the following line will be indented, or a M-RET will delete >>> the word, replacing it with a) or a. > >> Yes, this happens - it's not something that comes up during my >> normal usage, so I didn't notice. Can you think of a way to >> determine if this is the case vs. a list is actually wanted? > > Unfortunately, I can't see anything clean. This is tricky because > lists are the closest construct to raw text. My feeling is that we should not apply this patch. I see how it might be nice to have such lists - but confusion is rather likely in this case. - Carsten ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-09-28 16:12 ` Carsten Dominik @ 2010-09-29 15:49 ` Carsten Dominik 2010-09-29 16:50 ` Nathaniel Flath 2010-09-29 17:46 ` Nicolas Goaziou 0 siblings, 2 replies; 41+ messages in thread From: Carsten Dominik @ 2010-09-29 15:49 UTC (permalink / raw) To: Carsten Dominik Cc: Bernt Hansen, emacs-orgmode, Nicolas Goaziou, Jacob Mitchell On Sep 28, 2010, at 6:12 PM, Carsten Dominik wrote: > > On Sep 27, 2010, at 8:55 AM, Nicolas Goaziou wrote: > >>>>>>> Nathaniel Flath writes: >> >>>> But, there is apparently one major drawback, as I said in a >>>> previous post. If the line starts with a word followed by a dot or >>>> a parenthesis, Org will see a bullet there. This is bad news >>>> because the following line will be indented, or a M-RET will delete >>>> the word, replacing it with a) or a. >> >>> Yes, this happens - it's not something that comes up during my >>> normal usage, so I didn't notice. Can you think of a way to >>> determine if this is the case vs. a list is actually wanted? >> >> Unfortunately, I can't see anything clean. This is tricky because >> lists are the closest construct to raw text. > > My feeling is that we should not apply this patch. I see how it > might be > nice to have such lists - but confusion is rather likely in > this case. Or, alternatively, put it in with an option to turn it on (default off, I think). And maybe we should after all limit it to a single character to avoid confusion. Yes, I do realise that I asked for several characters - but I am learning... - Carsten > > - Carsten > ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-09-29 15:49 ` Carsten Dominik @ 2010-09-29 16:50 ` Nathaniel Flath 2010-09-29 17:46 ` Nicolas Goaziou 1 sibling, 0 replies; 41+ messages in thread From: Nathaniel Flath @ 2010-09-29 16:50 UTC (permalink / raw) To: Carsten Dominik Cc: Bernt Hansen, Jacob Mitchell, emacs-orgmode, Nicolas Goaziou I'd be fine with either (or both) of these, and can code it up once we decide. I find it unlikely that I'd use an alphabetical list of size more than 26, which is why I only had one character to begin with. Thanks, Nathaniel Flath On Wed, Sep 29, 2010 at 8:49 AM, Carsten Dominik <carsten.dominik@gmail.com> wrote: > > Or, alternatively, put it in with an option to turn it on (default off, I > think). > And maybe we should after all limit it to a single character to avoid > confusion. > Yes, I do realise that I asked for several characters - but I am learning... > > - Carsten > > >> >> - Carsten >> > > ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-09-29 15:49 ` Carsten Dominik 2010-09-29 16:50 ` Nathaniel Flath @ 2010-09-29 17:46 ` Nicolas Goaziou 2010-10-01 1:13 ` Nathaniel Flath 1 sibling, 1 reply; 41+ messages in thread From: Nicolas Goaziou @ 2010-09-29 17:46 UTC (permalink / raw) To: Carsten Dominik; +Cc: Bernt Hansen, emacs-orgmode, Jacob Mitchell Hello, >>>>> Carsten Dominik writes: > Or, alternatively, put it in with an option to turn it on (default > off, I think). And maybe we should after all limit it to a single > character to avoid confusion. Yes, I do realise that I asked for > several characters - but I am learning... What will then happen if the user is cycling bullets in a 100+ items list and hits alphabetic bullets? Besides undoing that move, there's nothing much that could be done then. Further cycling would become impossible. One idea would be to count items before cycling, and skipping alphabetic bullets for lists above 26 items. It has to be carefully implemented, as it could get very heavy on computations with large lists. Also, inserting new items in an alphabetical list should check if the 27th item has been reached and change bullets back to numbers if needed. I'm sure there are others subtleties that I can't think of right now. Regards, -- Nicolas ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-09-29 17:46 ` Nicolas Goaziou @ 2010-10-01 1:13 ` Nathaniel Flath 2010-10-04 8:33 ` Carsten Dominik 0 siblings, 1 reply; 41+ messages in thread From: Nathaniel Flath @ 2010-10-01 1:13 UTC (permalink / raw) To: Nicolas Goaziou Cc: Bernt Hansen, Jacob Mitchell, emacs-orgmode, Carsten Dominik Carsten, If you think this is acceptable I'll start working on it. Thanks, Nathaniel Flath On Wed, Sep 29, 2010 at 10:46 AM, Nicolas Goaziou <n.goaziou@gmail.com> wrote: > Hello, > >>>>>> Carsten Dominik writes: > >> Or, alternatively, put it in with an option to turn it on (default >> off, I think). And maybe we should after all limit it to a single >> character to avoid confusion. Yes, I do realise that I asked for >> several characters - but I am learning... > > What will then happen if the user is cycling bullets in a 100+ items > list and hits alphabetic bullets? Besides undoing that move, there's > nothing much that could be done then. Further cycling would become > impossible. > > One idea would be to count items before cycling, and skipping > alphabetic bullets for lists above 26 items. It has to be carefully > implemented, as it could get very heavy on computations with large > lists. > > Also, inserting new items in an alphabetical list should check if the > 27th item has been reached and change bullets back to numbers if > needed. > > I'm sure there are others subtleties that I can't think of right now. > > Regards, > > -- Nicolas > ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-10-01 1:13 ` Nathaniel Flath @ 2010-10-04 8:33 ` Carsten Dominik 2010-10-04 17:18 ` Nicolas Goaziou 0 siblings, 1 reply; 41+ messages in thread From: Carsten Dominik @ 2010-10-04 8:33 UTC (permalink / raw) To: Nathaniel Flath Cc: Bernt Hansen, Jacob Mitchell, emacs-orgmode, Nicolas Goaziou On Oct 1, 2010, at 3:13 AM, Nathaniel Flath wrote: > Carsten, > If you think this is acceptable I'll start working on it. > > Thanks, > Nathaniel Flath > > On Wed, Sep 29, 2010 at 10:46 AM, Nicolas Goaziou > <n.goaziou@gmail.com> wrote: >> Hello, >> >>>>>>> Carsten Dominik writes: >> >>> Or, alternatively, put it in with an option to turn it on (default >>> off, I think). And maybe we should after all limit it to a single >>> character to avoid confusion. Yes, I do realise that I asked for >>> several characters - but I am learning... >> >> What will then happen if the user is cycling bullets in a 100+ items >> list and hits alphabetic bullets? Besides undoing that move, there's >> nothing much that could be done then. Further cycling would become >> impossible. I think it would be appropriate in this case to simply throw an error and let the user clean up with undo. >> >> One idea would be to count items before cycling, and skipping >> alphabetic bullets for lists above 26 items. It has to be carefully >> implemented, as it could get very heavy on computations with large >> lists. We do not want that I agree. >> >> Also, inserting new items in an alphabetical list should check if the >> 27th item has been reached and change bullets back to numbers if >> needed. Again we could simply throw an error here and let the user handle the cleanup. >> >> I'm sure there are others subtleties that I can't think of right now. Nicolas, would you *object* against a patch by Nathaniel that implements this? You are Mr lists now, so your green light will be needed. Kind regards - Carsten ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-10-04 8:33 ` Carsten Dominik @ 2010-10-04 17:18 ` Nicolas Goaziou 2010-10-05 0:07 ` Sebastian Rose 2010-10-05 7:40 ` Carsten Dominik 0 siblings, 2 replies; 41+ messages in thread From: Nicolas Goaziou @ 2010-10-04 17:18 UTC (permalink / raw) To: Carsten Dominik; +Cc: Bernt Hansen, emacs-orgmode, Jacob Mitchell >>>>> Carsten Dominik writes: > I think it would be appropriate in this case to simply throw an > error and let the user clean up with undo. Certainly, but this still means that any 27+ items list will never be able to complete a full bullet cycle as the user will have to undo each time alphabetical bullets are reached. It could perhaps start again at letter 'a'... > Nicolas, would you *object* against a patch by Nathaniel that > implements this? You are Mr lists now, so your green light will be > needed. I wouldn't object against it as some people are finding it useful and as it won't be turned on by default (if I remember correctly). But I can't help thinking this could lead to unexpected results in some cases (admittedly less than when alpha bullets could be any size long). Regards, -- Ni^W Mr lists ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-10-04 17:18 ` Nicolas Goaziou @ 2010-10-05 0:07 ` Sebastian Rose 2010-10-05 0:21 ` Nathaniel Flath 2010-10-05 7:40 ` Carsten Dominik 1 sibling, 1 reply; 41+ messages in thread From: Sebastian Rose @ 2010-10-05 0:07 UTC (permalink / raw) To: Nicolas Goaziou Cc: Bernt Hansen, Jacob Mitchell, emacs-orgmode, Carsten Dominik Sorry for not following this thread closely. But from what I read, I thought it might be better to have a _command_ to sort existing lists alphabetically? That way, there is nothing that has to be "turned on" globally, that could intefere with Org mode's syntax. Excuse me, if that's of topic or already discussed. Sebastian ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-10-05 0:07 ` Sebastian Rose @ 2010-10-05 0:21 ` Nathaniel Flath 0 siblings, 0 replies; 41+ messages in thread From: Nathaniel Flath @ 2010-10-05 0:21 UTC (permalink / raw) To: Sebastian Rose Cc: Bernt Hansen, Jacob Mitchell, emacs-orgmode, Nicolas Goaziou, Carsten Dominik I don't think this is what I had in mind. What you suggest seems to apply for bulleted lists, and sorting the titles of those alphabetically. I'm trying to implement lists of the form: a. Item 1 b. Item 2 c. Item 3 That work the same as lists like: 1. Item 1 2. Item 2 3. Item 3 Correct me if I'm misinterpreting you. Thanks, Nathaniel Flath On Mon, Oct 4, 2010 at 5:07 PM, Sebastian Rose <sebastian_rose@gmx.de> wrote: > > Sorry for not following this thread closely. > > But from what I read, I thought it might be better to have a _command_ > to sort existing lists alphabetically? > > That way, there is nothing that has to be "turned on" globally, that > could intefere with Org mode's syntax. > > > Excuse me, if that's of topic or already discussed. > > > Sebastian > > _______________________________________________ > 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 > ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-10-04 17:18 ` Nicolas Goaziou 2010-10-05 0:07 ` Sebastian Rose @ 2010-10-05 7:40 ` Carsten Dominik 2010-10-21 4:44 ` Nathaniel Flath 1 sibling, 1 reply; 41+ messages in thread From: Carsten Dominik @ 2010-10-05 7:40 UTC (permalink / raw) To: Nicolas Goaziou, Nathaniel Flath Cc: Bernt Hansen, Jacob Mitchell, org-mode List On Oct 4, 2010, at 7:18 PM, Nicolas Goaziou wrote: >>>>>> Carsten Dominik writes: > >> I think it would be appropriate in this case to simply throw an >> error and let the user clean up with undo. > > Certainly, but this still means that any 27+ items list will never be > able to complete a full bullet cycle as the user will have to undo > each time alphabetical bullets are reached. It could perhaps start > again at letter 'a'... Ok, we could force the list to become numbered when someone tries to cycle it into a,b,... THis does not mean that you'd have to count in advance, you could simply try the renumbering and when stepping over z throw an exception that will force the list to move to the next state which would be numbers. > >> Nicolas, would you *object* against a patch by Nathaniel that >> implements this? You are Mr lists now, so your green light will be >> needed. > > I wouldn't object against it as some people are finding it useful and > as it won't be turned on by default (if I remember correctly). Yes, we sould not turn it on by default because it might bahave strange under some circumstances. > > But I can't help thinking this could lead to unexpected results in > some cases (admittedly less than when alpha bullets could be any size > long). It definitely will. Here is an alternative idea. Nathaniel, what do you think about this: We could keep the numbering as we have it in the Org file, but introduce something like [@a] in the first item that will convert the numbering into a,b,... upon export to ASCII, HTML, maybe even LaTeX (even though I think LaTeX demands some consistency here and prefers to have the global setup decide how lists work). Hell, we could even use [@A] for capitals and [@i] and [@I] for roman numbering :) - Carsten ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-10-05 7:40 ` Carsten Dominik @ 2010-10-21 4:44 ` Nathaniel Flath 2010-10-22 5:30 ` Nathaniel Flath 0 siblings, 1 reply; 41+ messages in thread From: Nathaniel Flath @ 2010-10-21 4:44 UTC (permalink / raw) To: Carsten Dominik Cc: Bernt Hansen, Jacob Mitchell, org-mode List, Nicolas Goaziou > >> >> But I can't help thinking this could lead to unexpected results in >> some cases (admittedly less than when alpha bullets could be any size >> long). > > It definitely will. > > Here is an alternative idea. Nathaniel, what do you > think about this: We could keep the numbering as we > have it in the Org file, but introduce something like [@a] > in the first item that will convert the numbering > into a,b,... upon export to ASCII, HTML, maybe even LaTeX > (even though I think LaTeX demands some consistency here > and prefers to have the global setup decide how lists work). > Hell, we could even use [@A] for capitals and [@i] and [@I] > for roman numbering :) > > - Carsten > Sorry for the late response - got swamped with work for a bit. I'd much prefer the approach I've been going with, mostly since I don't usually export my notes and mostly view them in org-mode. I'll work on the patch tonight - should send a patch either later tonight or tomorow. Thanks, Nathaniel Flath ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-10-21 4:44 ` Nathaniel Flath @ 2010-10-22 5:30 ` Nathaniel Flath 2010-10-22 8:13 ` Carsten Dominik 2010-10-26 8:21 ` Nicolas Goaziou 0 siblings, 2 replies; 41+ messages in thread From: Nathaniel Flath @ 2010-10-22 5:30 UTC (permalink / raw) To: Carsten Dominik Cc: Bernt Hansen, Jacob Mitchell, org-mode List, Nicolas Goaziou [-- Attachment #1: Type: text/plain, Size: 1248 bytes --] I think I've fixed the issues brought up with this new patch. Please let me know what you think. On Wed, Oct 20, 2010 at 9:44 PM, Nathaniel Flath <flat0103@gmail.com> wrote: >> >>> >>> But I can't help thinking this could lead to unexpected results in >>> some cases (admittedly less than when alpha bullets could be any size >>> long). >> >> It definitely will. >> >> Here is an alternative idea. Nathaniel, what do you >> think about this: We could keep the numbering as we >> have it in the Org file, but introduce something like [@a] >> in the first item that will convert the numbering >> into a,b,... upon export to ASCII, HTML, maybe even LaTeX >> (even though I think LaTeX demands some consistency here >> and prefers to have the global setup decide how lists work). >> Hell, we could even use [@A] for capitals and [@i] and [@I] >> for roman numbering :) >> >> - Carsten >> > > Sorry for the late response - got swamped with work for a bit. > > I'd much prefer the approach I've been going with, mostly since I > don't usually export my notes and mostly view them in org-mode. I'll > work on the patch tonight - should send a patch either later tonight > or tomorow. > > Thanks, > Nathaniel Flath > [-- Attachment #2: ordered-list.patch --] [-- Type: application/octet-stream, Size: 9246 bytes --] diff --git a/lisp/org-list.el b/lisp/org-list.el index d9fc24e..6942eed 100644 --- a/lisp/org-list.el +++ b/lisp/org-list.el @@ -240,6 +240,11 @@ with the word \"recursive\" in the value." :group 'org-plain-lists :type 'boolean) +(defcustom org-alphabetical-lists nil + "Non-nil means alphabetical lists are activated." + :group 'org-plain-lists + :type 'boolean) + (defcustom org-description-max-indent 20 "Maximum indentation for the second line of a description list. When the indentation would be larger than this, it will become @@ -288,13 +293,13 @@ It depends on `org-empty-line-terminates-plain-lists'." If GENERAL is non-nil, return the general regexp independent of the value of `org-plain-list-ordered-item-terminator'." (cond - ((or general (eq org-plain-list-ordered-item-terminator t)) - "\\([ \t]*\\([-+]\\|\\([0-9]+[.)]\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") - ((= org-plain-list-ordered-item-terminator ?.) - "\\([ \t]*\\([-+]\\|\\([0-9]+\\.\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") - ((= org-plain-list-ordered-item-terminator ?\)) - "\\([ \t]*\\([-+]\\|\\([0-9]+)\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") - (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))) + ((or general (eq org-plain-list-ordered-item-terminator t)) + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\)[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + ((= org-plain-list-ordered-item-terminator ?.) + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\)\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + ((= org-plain-list-ordered-item-terminator ?\)) + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\))\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") + (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))) (defconst org-item-beginning-re (concat "^" (org-item-re)) "Regexp matching the beginning of a plain list item.") @@ -530,8 +535,8 @@ List ending is determined by the indentation of text. See (save-excursion (goto-char (match-end 0)) ;; Ignore counter if any - (when (looking-at "\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?") - (goto-char (match-end 0))) + (when (looking-at "\\(?:\\[@\\(?:start:\\)?\\(?:[0-9]+\\|[A-Za-z]\\)\\][ \t]*\\)?") + (goto-char (match-end 0))) (looking-at regexp)))) (defun org-list-get-item-same-level (search-fun pos limit pre-move) @@ -1135,11 +1140,11 @@ bullet string and bullet counter, if any." (list (point-at-bol) (org-get-indentation) (progn - (looking-at "^[ \t]*\\([-+*0-9.)]+[ \t]+\\)") + (looking-at "^[ \t]*\\([-+*0-9A-Za-z.)]+[ \t]+\\)") (match-string 1)) (progn (goto-char (match-end 0)) - (and (looking-at "\\[@\\(?:start:\\)?\\([0-9]+\\)\\]") + (and (looking-at "\\[@\\(?:start:\\)?\\([0-9A-Za-z]+\\)\\]") (match-string 1)))))) (defun org-list-struct (begin end top bottom &optional outdent) @@ -1259,16 +1264,20 @@ This function modifies STRUCT." (let ((counter (nth 3 item)) (bullet (org-list-bullet-string (nth 2 item)))) (cond - ((and (string-match "[0-9]+" bullet) counter) + ((and (string-match "[0-9A-Za-z]+" bullet) counter) (replace-match counter nil nil bullet)) ((string-match "[0-9]+" bullet) (replace-match "1" nil nil bullet)) + ((and (string-match "[A-Za-z]" bullet) (> 28 (length struct))) + (replace-match "a" nil nil bullet)) + ((string-match "[A-Za-z]" bullet) + (replace-match "1" nil nil bullet)) (t bullet))))) (set-bul (lambda (item bullet) (setcdr item (list (nth 1 item) bullet (nth 3 item))))) (get-bul (lambda (item bullet) (let* ((counter (nth 3 item))) - (if (and counter (string-match "[0-9]+" bullet)) + (if (and counter (string-match "[0-9A-Za-z]+" bullet)) (replace-match counter nil nil bullet) bullet)))) (fix-bul @@ -1582,13 +1591,50 @@ It determines the number of whitespaces to append by looking at " "))) nil nil bullet 1))) +(defun org-increment-string (str cap) + "Increments str (a->a, b->b, z->aa, aa->ab etc). If cap is non-nil, then + the letters are capitalized." + (let ((res (org-convert-num-to-alpha-str + (1+ (org-convert-alpha-str-to-num str 1 (length str) cap)) cap)) + (z (if cap ?Z ?z)) + (b (if cap ?B ?b)) + (a (if cap ?A ?a))) + (if (and(= (string-to-char str) z) + (= (string-to-char res) b)) + (concat (if cap "A" "a") (substring res 1)) + (concat (make-string (- (length str) (length res)) a) res)))) + +(defun org-convert-alpha-str-to-num (str n pos cap) + "Converts the substring consisting of locations pos to pos-n to a + numeric representation." + (let ((a (if cap ?A ?a))) + (if (= pos 1) (* (- (string-to-char str) a) n) + (+ (* (- (nth (1- pos) (string-to-list str)) a) n) + (org-convert-alpha-str-to-num str (* 26 n) (1- pos) cap))))) + +(defun org-convert-num-to-alpha-str (n cap) + "Converts the number n to a alphabetical, base-26 representation." + (if (= n 0) "" + (concat (org-convert-num-to-alpha-str (/ n 26) cap) + (string (+ (if cap ?A ?a) (% n 26)))))) + (defun org-list-inc-bullet-maybe (bullet) "Increment BULLET if applicable." - (if (string-match "[0-9]+" bullet) + (let ((case-fold-search nil)) + (cond + ((string-match "[0-9]+" bullet) (replace-match (number-to-string (1+ (string-to-number (match-string 0 bullet)))) - nil nil bullet) - bullet)) + nil nil bullet)) + ((string-match "[a-z]" bullet) + (replace-match + (org-increment-string (match-string 0 bullet) nil) + nil nil bullet)) + ((string-match "[A-Z]" bullet) + (replace-match + (org-increment-string (match-string 0 bullet) t) + nil nil bullet)) + (t bullet)))) (defun org-list-repair (&optional force-bullet top bottom) "Make sure all items are correctly indented, with the right bullet. @@ -1629,14 +1675,29 @@ If WHICH is a valid string, use that as the new bullet. If WHICH is an integer, 0 means `-', 1 means `+' etc. If WHICH is 'previous, cycle backwards." (interactive "P") - (let* ((top (org-list-top-point)) + (let* ((top (org-list-top-point)) + (alpha-possible (save-excursion + (goto-char (org-list-top-point)) + (and org-alphabetical-lists + (let ((retn 1)) + (condition-case nil + (progn (while (< retn 27) + (org-next-item) + (setq retn (1+ retn)) + nil)) + (error t)))))) (bullet (save-excursion (goto-char (org-get-beginning-of-list top)) (org-get-bullet))) - (current (cond - ((string-match "\\." bullet) "1.") - ((string-match ")" bullet) "1)") - (t bullet))) + (current (let ((case-fold-search nil)) + (cond + ((string-match "[0-9]+\\." bullet) "1.") + ((string-match "[0-9]+)" bullet) "1)") + ((string-match "[a-z]\\." bullet) "a.") + ((string-match "[a-z])" bullet) "a)") + ((string-match "[A-Z]\\." bullet) "A.") + ((string-match "[A-Z])" bullet) "A)") + (t bullet)))) (bullet-rule-p (cdr (assq 'bullet org-list-automatic-rules))) (bullet-list (append '("-" "+" ) ;; *-bullets are not allowed at column 0 @@ -1645,10 +1706,22 @@ is an integer, 0 means `-', 1 means `+' etc. If WHICH is ;; Description items cannot be numbered (unless (and bullet-rule-p (or (eq org-plain-list-ordered-item-terminator ?.) - (org-at-item-description-p))) '("1)")) + (org-at-item-description-p))) + '("1)")) (unless (and bullet-rule-p (or (eq org-plain-list-ordered-item-terminator ?\)) - (org-at-item-description-p))) '("1.")))) + (org-at-item-description-p))) + '("1.")) + (when (and org-alphabetical-lists alpha-possible) + (append + (unless (and bullet-rule-p + (or (eq org-plain-list-ordered-item-terminator ?.) + (org-at-item-description-p))) + '("A)" "a)")) + (unless (and bullet-rule-p + (or (eq org-plain-list-ordered-item-terminator ?\)) + (org-at-item-description-p))) + '("A." "a.")))))) (len (length bullet-list)) (item-index (- len (length (member current bullet-list)))) (get-value (lambda (index) (nth (mod index len) bullet-list))) @@ -2028,7 +2101,7 @@ sublevels as a list of strings." (while (org-search-forward-unenclosed org-item-beginning-re end t) (save-excursion (beginning-of-line) - (setq ltype (cond ((looking-at-p "^[ \t]*[0-9]") 'ordered) + (setq ltype (cond ((looking-at-p "^[ \t]*[0-9A-Za-z]+") 'ordered) ((org-at-item-description-p) 'descriptive) (t 'unordered)))) (let* ((indent1 (org-get-indentation)) @@ -2037,7 +2110,7 @@ sublevels as a list of strings." (org-end-of-item-or-at-child end)))) (nextindent (if (= (point) end) 0 (org-get-indentation))) (item (if (string-match - "^\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?\\[\\([xX ]\\)\\]" + "^\\(?:\\[@\\(?:start:\\)?[0-9A-Za-z]+\\][ \t]*\\)?\\[\\([xX ]\\)\\]" item) (replace-match (if (equal (match-string 1 item) " ") "CBOFF" [-- Attachment #3: Type: text/plain, Size: 201 bytes --] _______________________________________________ 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 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-10-22 5:30 ` Nathaniel Flath @ 2010-10-22 8:13 ` Carsten Dominik 2010-10-23 1:04 ` Nathaniel Flath 2010-10-26 8:21 ` Nicolas Goaziou 1 sibling, 1 reply; 41+ messages in thread From: Carsten Dominik @ 2010-10-22 8:13 UTC (permalink / raw) To: Nathaniel Flath Cc: Bernt Hansen, Jacob Mitchell, org-mode List, Nicolas Goaziou Hi Nathaniel, I get "patch does not apply". Can you please update the patch to the current git master? Thanks - Carsten On Oct 22, 2010, at 7:30 AM, Nathaniel Flath wrote: > I think I've fixed the issues brought up with this new patch. Please > let me know what you think. > > On Wed, Oct 20, 2010 at 9:44 PM, Nathaniel Flath > <flat0103@gmail.com> wrote: >>> >>>> >>>> But I can't help thinking this could lead to unexpected results in >>>> some cases (admittedly less than when alpha bullets could be any >>>> size >>>> long). >>> >>> It definitely will. >>> >>> Here is an alternative idea. Nathaniel, what do you >>> think about this: We could keep the numbering as we >>> have it in the Org file, but introduce something like [@a] >>> in the first item that will convert the numbering >>> into a,b,... upon export to ASCII, HTML, maybe even LaTeX >>> (even though I think LaTeX demands some consistency here >>> and prefers to have the global setup decide how lists work). >>> Hell, we could even use [@A] for capitals and [@i] and [@I] >>> for roman numbering :) >>> >>> - Carsten >>> >> >> Sorry for the late response - got swamped with work for a bit. >> >> I'd much prefer the approach I've been going with, mostly since I >> don't usually export my notes and mostly view them in org-mode. I'll >> work on the patch tonight - should send a patch either later tonight >> or tomorow. >> >> Thanks, >> Nathaniel Flath >> > <ordered-list.patch> - Carsten ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-10-22 8:13 ` Carsten Dominik @ 2010-10-23 1:04 ` Nathaniel Flath 0 siblings, 0 replies; 41+ messages in thread From: Nathaniel Flath @ 2010-10-23 1:04 UTC (permalink / raw) To: Carsten Dominik Cc: Bernt Hansen, Jacob Mitchell, org-mode List, Nicolas Goaziou [-- Attachment #1: Type: text/plain, Size: 1739 bytes --] Sorry about that - patch attached. Thanks, Nathaniel Flath On Fri, Oct 22, 2010 at 1:13 AM, Carsten Dominik <carsten.dominik@gmail.com> wrote: > Hi Nathaniel, > > I get "patch does not apply". Can you please update the patch to the > current git master? > > Thanks > > - Carsten > > > On Oct 22, 2010, at 7:30 AM, Nathaniel Flath wrote: > >> I think I've fixed the issues brought up with this new patch. Please >> let me know what you think. >> >> On Wed, Oct 20, 2010 at 9:44 PM, Nathaniel Flath <flat0103@gmail.com> >> wrote: >>>> >>>>> >>>>> But I can't help thinking this could lead to unexpected results in >>>>> some cases (admittedly less than when alpha bullets could be any size >>>>> long). >>>> >>>> It definitely will. >>>> >>>> Here is an alternative idea. Nathaniel, what do you >>>> think about this: We could keep the numbering as we >>>> have it in the Org file, but introduce something like [@a] >>>> in the first item that will convert the numbering >>>> into a,b,... upon export to ASCII, HTML, maybe even LaTeX >>>> (even though I think LaTeX demands some consistency here >>>> and prefers to have the global setup decide how lists work). >>>> Hell, we could even use [@A] for capitals and [@i] and [@I] >>>> for roman numbering :) >>>> >>>> - Carsten >>>> >>> >>> Sorry for the late response - got swamped with work for a bit. >>> >>> I'd much prefer the approach I've been going with, mostly since I >>> don't usually export my notes and mostly view them in org-mode. I'll >>> work on the patch tonight - should send a patch either later tonight >>> or tomorow. >>> >>> Thanks, >>> Nathaniel Flath >>> >> <ordered-list.patch> > > - Carsten > > > > [-- Attachment #2: org-list.patch --] [-- Type: application/octet-stream, Size: 12463 bytes --] *** org-mode/lisp/org-list.el Fri Oct 22 18:02:46 2010 --- src/org-mode/lisp/org-list.el Thu Oct 21 22:28:04 2010 *************** *** 240,245 **** --- 240,250 ---- :group 'org-plain-lists :type 'boolean) + (defcustom org-alphabetical-lists nil + "Non-nil means alphabetical lists are activated." + :group 'org-plain-lists + :type 'boolean) + (defcustom org-description-max-indent 20 "Maximum indentation for the second line of a description list. When the indentation would be larger than this, it will become *************** *** 288,300 **** If GENERAL is non-nil, return the general regexp independent of the value of `org-plain-list-ordered-item-terminator'." (cond ! ((or general (eq org-plain-list-ordered-item-terminator t)) ! "\\([ \t]*\\([-+]\\|\\([0-9]+[.)]\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") ! ((= org-plain-list-ordered-item-terminator ?.) ! "\\([ \t]*\\([-+]\\|\\([0-9]+\\.\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") ! ((= org-plain-list-ordered-item-terminator ?\)) ! "\\([ \t]*\\([-+]\\|\\([0-9]+)\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") ! (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))) (defconst org-item-beginning-re (concat "^" (org-item-re)) "Regexp matching the beginning of a plain list item.") --- 293,305 ---- If GENERAL is non-nil, return the general regexp independent of the value of `org-plain-list-ordered-item-terminator'." (cond ! ((or general (eq org-plain-list-ordered-item-terminator t)) ! "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\)[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") ! ((= org-plain-list-ordered-item-terminator ?.) ! "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\)\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") ! ((= org-plain-list-ordered-item-terminator ?\)) ! "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\))\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") ! (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))) (defconst org-item-beginning-re (concat "^" (org-item-re)) "Regexp matching the beginning of a plain list item.") *************** *** 530,537 **** (save-excursion (goto-char (match-end 0)) ;; Ignore counter if any ! (when (looking-at "\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?") ! (goto-char (match-end 0))) (looking-at regexp)))) (defun org-list-get-item-same-level (search-fun pos limit pre-move) --- 535,542 ---- (save-excursion (goto-char (match-end 0)) ;; Ignore counter if any ! (when (looking-at "\\(?:\\[@\\(?:start:\\)?\\(?:[0-9]+\\|[A-Za-z]\\)\\][ \t]*\\)?") ! (goto-char (match-end 0))) (looking-at regexp)))) (defun org-list-get-item-same-level (search-fun pos limit pre-move) *************** *** 1135,1145 **** (list (point-at-bol) (org-get-indentation) (progn ! (looking-at "^[ \t]*\\([-+*0-9.)]+[ \t]+\\)") (match-string 1)) (progn (goto-char (match-end 0)) ! (and (looking-at "\\[@\\(?:start:\\)?\\([0-9]+\\)\\]") (match-string 1)))))) (defun org-list-struct (begin end top bottom &optional outdent) --- 1140,1150 ---- (list (point-at-bol) (org-get-indentation) (progn ! (looking-at "^[ \t]*\\([-+*0-9A-Za-z.)]+[ \t]+\\)") (match-string 1)) (progn (goto-char (match-end 0)) ! (and (looking-at "\\[@\\(?:start:\\)?\\([0-9A-Za-z]+\\)\\]") (match-string 1)))))) (defun org-list-struct (begin end top bottom &optional outdent) *************** *** 1259,1274 **** (let ((counter (nth 3 item)) (bullet (org-list-bullet-string (nth 2 item)))) (cond ! ((and (string-match "[0-9]+" bullet) counter) (replace-match counter nil nil bullet)) ((string-match "[0-9]+" bullet) (replace-match "1" nil nil bullet)) (t bullet))))) (set-bul (lambda (item bullet) (setcdr item (list (nth 1 item) bullet (nth 3 item))))) (get-bul (lambda (item bullet) (let* ((counter (nth 3 item))) ! (if (and counter (string-match "[0-9]+" bullet)) (replace-match counter nil nil bullet) bullet)))) (fix-bul --- 1264,1283 ---- (let ((counter (nth 3 item)) (bullet (org-list-bullet-string (nth 2 item)))) (cond ! ((and (string-match "[0-9A-Za-z]+" bullet) counter) (replace-match counter nil nil bullet)) ((string-match "[0-9]+" bullet) (replace-match "1" nil nil bullet)) + ((and (string-match "[A-Za-z]" bullet) (> 28 (length struct))) + (replace-match "a" nil nil bullet)) + ((string-match "[A-Za-z]" bullet) + (replace-match "1" nil nil bullet)) (t bullet))))) (set-bul (lambda (item bullet) (setcdr item (list (nth 1 item) bullet (nth 3 item))))) (get-bul (lambda (item bullet) (let* ((counter (nth 3 item))) ! (if (and counter (string-match "[0-9A-Za-z]+" bullet)) (replace-match counter nil nil bullet) bullet)))) (fix-bul *************** *** 1582,1594 **** " "))) nil nil bullet 1))) (defun org-list-inc-bullet-maybe (bullet) "Increment BULLET if applicable." ! (if (string-match "[0-9]+" bullet) (replace-match (number-to-string (1+ (string-to-number (match-string 0 bullet)))) ! nil nil bullet) ! bullet)) (defun org-list-repair (&optional force-bullet top bottom) "Make sure all items are correctly indented, with the right bullet. --- 1591,1640 ---- " "))) nil nil bullet 1))) + (defun org-increment-string (str cap) + "Increments str (a->a, b->b, z->aa, aa->ab etc). If cap is non-nil, then + the letters are capitalized." + (let ((res (org-convert-num-to-alpha-str + (1+ (org-convert-alpha-str-to-num str 1 (length str) cap)) cap)) + (z (if cap ?Z ?z)) + (b (if cap ?B ?b)) + (a (if cap ?A ?a))) + (if (and(= (string-to-char str) z) + (= (string-to-char res) b)) + (concat (if cap "A" "a") (substring res 1)) + (concat (make-string (- (length str) (length res)) a) res)))) + + (defun org-convert-alpha-str-to-num (str n pos cap) + "Converts the substring consisting of locations pos to pos-n to a + numeric representation." + (let ((a (if cap ?A ?a))) + (if (= pos 1) (* (- (string-to-char str) a) n) + (+ (* (- (nth (1- pos) (string-to-list str)) a) n) + (org-convert-alpha-str-to-num str (* 26 n) (1- pos) cap))))) + + (defun org-convert-num-to-alpha-str (n cap) + "Converts the number n to a alphabetical, base-26 representation." + (if (= n 0) "" + (concat (org-convert-num-to-alpha-str (/ n 26) cap) + (string (+ (if cap ?A ?a) (% n 26)))))) + (defun org-list-inc-bullet-maybe (bullet) "Increment BULLET if applicable." ! (let ((case-fold-search nil)) ! (cond ! ((string-match "[0-9]+" bullet) (replace-match (number-to-string (1+ (string-to-number (match-string 0 bullet)))) ! nil nil bullet)) ! ((string-match "[a-z]" bullet) ! (replace-match ! (org-increment-string (match-string 0 bullet) nil) ! nil nil bullet)) ! ((string-match "[A-Z]" bullet) ! (replace-match ! (org-increment-string (match-string 0 bullet) t) ! nil nil bullet)) ! (t bullet)))) (defun org-list-repair (&optional force-bullet top bottom) "Make sure all items are correctly indented, with the right bullet. *************** *** 1629,1642 **** is an integer, 0 means `-', 1 means `+' etc. If WHICH is 'previous, cycle backwards." (interactive "P") ! (let* ((top (org-list-top-point)) (bullet (save-excursion (goto-char (org-get-beginning-of-list top)) (org-get-bullet))) ! (current (cond ! ((string-match "\\." bullet) "1.") ! ((string-match ")" bullet) "1)") ! (t bullet))) (bullet-rule-p (cdr (assq 'bullet org-list-automatic-rules))) (bullet-list (append '("-" "+" ) ;; *-bullets are not allowed at column 0 --- 1675,1703 ---- is an integer, 0 means `-', 1 means `+' etc. If WHICH is 'previous, cycle backwards." (interactive "P") ! (let* ((top (org-list-top-point)) ! (alpha-possible (save-excursion ! (goto-char (org-list-top-point)) ! (and org-alphabetical-lists ! (let ((retn 1)) ! (condition-case nil ! (progn (while (< retn 27) ! (org-next-item) ! (setq retn (1+ retn)) ! nil)) ! (error t)))))) (bullet (save-excursion (goto-char (org-get-beginning-of-list top)) (org-get-bullet))) ! (current (let ((case-fold-search nil)) ! (cond ! ((string-match "[0-9]+\\." bullet) "1.") ! ((string-match "[0-9]+)" bullet) "1)") ! ((string-match "[a-z]\\." bullet) "a.") ! ((string-match "[a-z])" bullet) "a)") ! ((string-match "[A-Z]\\." bullet) "A.") ! ((string-match "[A-Z])" bullet) "A)") ! (t bullet)))) (bullet-rule-p (cdr (assq 'bullet org-list-automatic-rules))) (bullet-list (append '("-" "+" ) ;; *-bullets are not allowed at column 0 *************** *** 1644,1654 **** (looking-at "\\S-")) '("*")) ;; Description items cannot be numbered (unless (and bullet-rule-p (or (eq org-plain-list-ordered-item-terminator ?\)) (org-at-item-description-p))) '("1.")) ! (unless (and bullet-rule-p ! (or (eq org-plain-list-ordered-item-terminator ?.) ! (org-at-item-description-p))) '("1)")))) (len (length bullet-list)) (item-index (- len (length (member current bullet-list)))) (get-value (lambda (index) (nth (mod index len) bullet-list))) --- 1705,1725 ---- (looking-at "\\S-")) '("*")) ;; Description items cannot be numbered (unless (and bullet-rule-p + (or (eq org-plain-list-ordered-item-terminator ?.) + (org-at-item-description-p))) '("1)")) + (unless (and bullet-rule-p (or (eq org-plain-list-ordered-item-terminator ?\)) (org-at-item-description-p))) '("1.")) ! (when (and org-alphabetical-lists alpha-possible) ! (append ! (unless (and bullet-rule-p ! (or (eq org-plain-list-ordered-item-terminator ?.) ! (org-at-item-description-p))) ! '("A)" "a)")) ! (unless (and bullet-rule-p ! (or (eq org-plain-list-ordered-item-terminator ?\)) ! (org-at-item-description-p))) ! '("A." "a.")))))) (len (length bullet-list)) (item-index (- len (length (member current bullet-list)))) (get-value (lambda (index) (nth (mod index len) bullet-list))) *************** *** 2028,2034 **** (while (org-search-forward-unenclosed org-item-beginning-re end t) (save-excursion (beginning-of-line) ! (setq ltype (cond ((looking-at-p "^[ \t]*[0-9]") 'ordered) ((org-at-item-description-p) 'descriptive) (t 'unordered)))) (let* ((indent1 (org-get-indentation)) --- 2099,2105 ---- (while (org-search-forward-unenclosed org-item-beginning-re end t) (save-excursion (beginning-of-line) ! (setq ltype (cond ((looking-at-p "^[ \t]*[0-9A-Za-z]+") 'ordered) ((org-at-item-description-p) 'descriptive) (t 'unordered)))) (let* ((indent1 (org-get-indentation)) *************** *** 2037,2043 **** (org-end-of-item-or-at-child end)))) (nextindent (if (= (point) end) 0 (org-get-indentation))) (item (if (string-match ! "^\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?\\[\\([xX ]\\)\\]" item) (replace-match (if (equal (match-string 1 item) " ") "CBOFF" --- 2108,2114 ---- (org-end-of-item-or-at-child end)))) (nextindent (if (= (point) end) 0 (org-get-indentation))) (item (if (string-match ! "^\\(?:\\[@\\(?:start:\\)?[0-9A-Za-z]+\\][ \t]*\\)?\\[\\([xX ]\\)\\]" item) (replace-match (if (equal (match-string 1 item) " ") "CBOFF" [-- Attachment #3: Type: text/plain, Size: 201 bytes --] _______________________________________________ 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 ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-10-22 5:30 ` Nathaniel Flath 2010-10-22 8:13 ` Carsten Dominik @ 2010-10-26 8:21 ` Nicolas Goaziou 2010-10-26 8:23 ` Carsten Dominik 1 sibling, 1 reply; 41+ messages in thread From: Nicolas Goaziou @ 2010-10-26 8:21 UTC (permalink / raw) To: Nathaniel Flath Cc: Bernt Hansen, Jacob Mitchell, org-mode List, Carsten Dominik Hello, >>>>> Nathaniel Flath writes: > I think I've fixed the issues brought up with this new patch. Please > let me know what you think. I've noticed a couple of glitches. First, you are using (> 28 (length struct)) to know when to replace letters by numbers. But (length struct) doesn't always match list length, so it will lead to errors when outdenting items. For example, try outdenting, with its subtree, the item marked with "<<<" in the list below: a) etsiun b) etsiun c) etsiun d) etisun e) etsiun f) etsiun g) etsiun h) etsiun i) etisun j) etsiun k) etsiun l) etsiun m) etsiun n) etsiun a) Outdent me and my children ! <<< a) tersiu b) etsiru c) estiur d) etsnriu e) etsiun f) etiune g) etuirsnet b) etsiun o) etsiun p) etsiun q) etsiun r) etsiun s) etsiun All the lists will be numbered although they could keep alphabetical bullets. Another (lesser) problem is coming from the regexp chosen for bullets, that is "[0-9A-Za-z]+". I would suggest something alike "\\(\\(?:[0-9]\\)+\\|[A-Za-z]\\)". At the moment, you can set counter to [@a4] and break you list when applying it. Regards, -- Nicolas ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-10-26 8:21 ` Nicolas Goaziou @ 2010-10-26 8:23 ` Carsten Dominik 2010-10-28 7:17 ` Nathaniel Flath 0 siblings, 1 reply; 41+ messages in thread From: Carsten Dominik @ 2010-10-26 8:23 UTC (permalink / raw) To: Nicolas Goaziou; +Cc: Bernt Hansen, org-mode List, Jacob Mitchell On Oct 26, 2010, at 10:21 AM, Nicolas Goaziou wrote: > Hello, > >>>>>> Nathaniel Flath writes: > >> I think I've fixed the issues brought up with this new patch. Please >> let me know what you think. > > I've noticed a couple of glitches. > > First, you are using > > (> 28 (length struct)) > > to know when to replace letters by numbers. But (length struct) > doesn't always match list length, so it will lead to errors when > outdenting items. > > For example, try outdenting, with its subtree, the item marked with > "<<<" in the list below: > > a) etsiun > b) etsiun > c) etsiun > d) etisun > e) etsiun > f) etsiun > g) etsiun > h) etsiun > i) etisun > j) etsiun > k) etsiun > l) etsiun > m) etsiun > n) etsiun > a) Outdent me and my children ! <<< > a) tersiu > b) etsiru > c) estiur > d) etsnriu > e) etsiun > f) etiune > g) etuirsnet > b) etsiun > o) etsiun > p) etsiun > q) etsiun > r) etsiun > s) etsiun > > All the lists will be numbered although they could keep alphabetical > bullets. > > Another (lesser) problem is coming from the regexp chosen for bullets, > that is "[0-9A-Za-z]+". I would suggest something alike > "\\(\\(?:[0-9]\\)+\\|[A-Za-z]\\)". At the moment, you can set counter > to [@a4] and break you list when applying it. Also, even when the alpha lists are turned off, typing a) and pressing M-RET will show that a) is seen as a list bullet. Thanks for your work, we are getting closer to an acceptable patch. - Carsten > > Regards, > > -- Nicolas - Carsten ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-10-26 8:23 ` Carsten Dominik @ 2010-10-28 7:17 ` Nathaniel Flath 2010-11-11 7:16 ` Nathaniel Flath 0 siblings, 1 reply; 41+ messages in thread From: Nathaniel Flath @ 2010-10-28 7:17 UTC (permalink / raw) To: Carsten Dominik Cc: Bernt Hansen, Jacob Mitchell, org-mode List, Nicolas Goaziou [-- Attachment #1: Type: text/plain, Size: 1910 bytes --] New patch fixing these issues is attached. Let me know of any other problems. On Tue, Oct 26, 2010 at 1:23 AM, Carsten Dominik <carsten.dominik@gmail.com> wrote: > > On Oct 26, 2010, at 10:21 AM, Nicolas Goaziou wrote: > >> Hello, >> >>>>>>> Nathaniel Flath writes: >> >>> I think I've fixed the issues brought up with this new patch. Please >>> let me know what you think. >> >> I've noticed a couple of glitches. >> >> First, you are using >> >> (> 28 (length struct)) >> >> to know when to replace letters by numbers. But (length struct) >> doesn't always match list length, so it will lead to errors when >> outdenting items. >> >> For example, try outdenting, with its subtree, the item marked with >> "<<<" in the list below: >> >> a) etsiun >> b) etsiun >> c) etsiun >> d) etisun >> e) etsiun >> f) etsiun >> g) etsiun >> h) etsiun >> i) etisun >> j) etsiun >> k) etsiun >> l) etsiun >> m) etsiun >> n) etsiun >> a) Outdent me and my children ! <<< >> a) tersiu >> b) etsiru >> c) estiur >> d) etsnriu >> e) etsiun >> f) etiune >> g) etuirsnet >> b) etsiun >> o) etsiun >> p) etsiun >> q) etsiun >> r) etsiun >> s) etsiun >> >> All the lists will be numbered although they could keep alphabetical >> bullets. >> >> Another (lesser) problem is coming from the regexp chosen for bullets, >> that is "[0-9A-Za-z]+". I would suggest something alike >> "\\(\\(?:[0-9]\\)+\\|[A-Za-z]\\)". At the moment, you can set counter >> to [@a4] and break you list when applying it. > > > Also, even when the alpha lists are turned off, typing > > a) > > and pressing M-RET will show that a) is seen as a list bullet. > > Thanks for your work, we are getting closer to an acceptable patch. > > - Carsten > >> >> Regards, >> >> -- Nicolas > > - Carsten > > > > [-- Attachment #2: ordered-list.patch --] [-- Type: application/octet-stream, Size: 16742 bytes --] --- ../org-mode/lisp/org-list.el Thu Oct 28 00:12:17 2010 +++ org-mode/lisp/org-list.el Thu Oct 28 00:12:05 2010 @@ -240,6 +240,11 @@ :group 'org-plain-lists :type 'boolean) +(defcustom org-alphabetical-lists nil + "Non-nil means alphabetical lists are activated." + :group 'org-plain-lists + :type 'boolean) + (defcustom org-description-max-indent 20 "Maximum indentation for the second line of a description list. When the indentation would be larger than this, it will become @@ -288,16 +293,23 @@ If GENERAL is non-nil, return the general regexp independent of the value of `org-plain-list-ordered-item-terminator'." (cond + ((and org-alphabetical-lists (or general (eq org-plain-list-ordered-item-terminator t))) + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\)[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + ((and org-alphabetical-lists (= org-plain-list-ordered-item-terminator ?.)) + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\)\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + ((and org-alphabetical-lists (= org-plain-list-ordered-item-terminator ?\))) + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\))\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") ((or general (eq org-plain-list-ordered-item-terminator t)) - "\\([ \t]*\\([-+]\\|\\([0-9]+[.)]\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\)[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") ((= org-plain-list-ordered-item-terminator ?.) - "\\([ \t]*\\([-+]\\|\\([0-9]+\\.\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+)\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") ((= org-plain-list-ordered-item-terminator ?\)) - "\\([ \t]*\\([-+]\\|\\([0-9]+)\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\))\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))) -(defconst org-item-beginning-re (concat "^" (org-item-re)) - "Regexp matching the beginning of a plain list item.") +(defun org-item-beginning-re () + "Regexp matching the beginning of a plain list item." + (concat "^" (org-item-re))) (defun org-list-ending-between (min max &optional firstp) "Find the position of a list ending between MIN and MAX, or nil. @@ -385,7 +397,7 @@ ;; Ensure there is at least an item above (up-item-p (save-excursion (org-search-backward-unenclosed - org-item-beginning-re limit t)))) + (org-item-beginning-re) limit t)))) (and up-item-p (catch 'exit (while t @@ -413,7 +425,7 @@ ;; `org-item-re'. (last-item-start (save-excursion (org-search-backward-unenclosed - org-item-beginning-re limit t))) + (org-item-beginning-re) limit t))) (list-ender (org-list-ending-between last-item-start actual-pos))) ;; We are in a list when we are on an item line or when we can @@ -433,7 +445,7 @@ ;; Otherwise, go back to the heading above or bob. (goto-char (or (org-list-ending-between limit pos) limit)) ;; From there, search down our list. - (org-search-forward-unenclosed org-item-beginning-re pos t) + (org-search-forward-unenclosed (org-item-beginning-re) pos t) (point-at-bol)))) (defun org-list-bottom-point-with-regexp (limit) @@ -530,7 +542,7 @@ (save-excursion (goto-char (match-end 0)) ;; Ignore counter if any - (when (looking-at "\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?") + (when (looking-at "\\(?:\\[@\\(?:start:\\)?\\(?:[0-9]+\\|[A-Za-z]\\)\\][ \t]*\\)?") (goto-char (match-end 0))) (looking-at regexp)))) @@ -545,7 +557,7 @@ ;; We don't want to match the current line. (funcall pre-move) ;; Skip any sublist on the way - (while (and (funcall search-fun org-item-beginning-re limit t) + (while (and (funcall search-fun (org-item-beginning-re) limit t) (> (org-get-indentation) ind))) (when (and (/= (point-at-bol) start) ; Have we moved ? (= (org-get-indentation) ind)) @@ -606,7 +618,7 @@ (goto-char pos) ;; Is point in a special block? (when (org-in-regexps-block-p - "^[ \t]*#\\+\\(begin\\|BEGIN\\)_\\([a-zA-Z0-9_]+\\)" + "^[ \t]*#\\+\\(begin\\|BEGIN\\)_\\(\\(?:[a-zA-Z]\\|[0-9_]+\\)\\)" '(concat "^[ \t]*#\\+\\(end\\|END\\)_" (match-string 2))) (if (not (cdr (assq 'insert org-list-automatic-rules))) ;; Rule in `org-list-automatic-rules' forbids insertion. @@ -704,7 +716,7 @@ (cond ((and regionp (goto-char rbeg) - (not (org-search-forward-unenclosed org-item-beginning-re rend t))) + (not (org-search-forward-unenclosed (org-item-beginning-re) rend t))) (error "No item in region")) ((not (org-at-item-p)) (error "Not on an item")) @@ -802,13 +814,13 @@ (save-excursion (beginning-of-line) (let ((ind (org-get-indentation))) - (or (not (org-search-backward-unenclosed org-item-beginning-re top t)) + (or (not (org-search-backward-unenclosed (org-item-beginning-re) top t)) (< (org-get-indentation) ind))))) (defun org-at-item-p () "Is point in a line starting a hand-formatted item?" (save-excursion - (beginning-of-line) (looking-at org-item-beginning-re))) + (beginning-of-line) (looking-at (org-item-beginning-re)))) (defun org-at-item-bullet-p () "Is point at the bullet of a plain list item?" @@ -907,7 +919,7 @@ (save-excursion ;; possibly match current line (end-of-line) - (org-search-backward-unenclosed org-item-beginning-re nil t) + (org-search-backward-unenclosed (org-item-beginning-re) nil t) (point-at-bol))) (defun org-beginning-of-item () @@ -943,7 +955,7 @@ (let ((ind (org-get-indentation))) (while (and (/= (point) bottom) (>= (org-get-indentation) ind)) - (org-search-forward-unenclosed org-item-beginning-re bottom 'move)) + (org-search-forward-unenclosed (org-item-beginning-re) bottom 'move)) (if (= (point) bottom) bottom (point-at-bol))))) (defun org-end-of-item-list () @@ -973,7 +985,7 @@ BOTTOM is the position at list ending." (end-of-line) (goto-char - (if (org-search-forward-unenclosed org-item-beginning-re bottom t) + (if (org-search-forward-unenclosed (org-item-beginning-re) bottom t) (point-at-bol) (org-get-end-of-item bottom)))) @@ -1135,11 +1147,11 @@ (list (point-at-bol) (org-get-indentation) (progn - (looking-at "^[ \t]*\\([-+*0-9.)]+[ \t]+\\)") + (looking-at "^[ \t]*\\([-+*0-9A-Za-z.)]+[ \t]+\\)") (match-string 1)) (progn (goto-char (match-end 0)) - (and (looking-at "\\[@\\(?:start:\\)?\\([0-9]+\\)\\]") + (and (looking-at "\\[@\\(?:start:\\)?\\(\\(?:[0-9]+\\|[A-Za-z]\\)\\)\\]") (match-string 1)))))) (defun org-list-struct (begin end top bottom &optional outdent) @@ -1168,7 +1180,7 @@ (goto-char begin) ;; Find beginning of most outdented list (min list) (while (and (org-search-backward-unenclosed - org-item-beginning-re top t) + (org-item-beginning-re) top t) (>= (org-get-indentation) ind-min)) (setq pre-list (cons (org-list-struct-assoc-at-point) pre-list))) @@ -1182,7 +1194,7 @@ (goto-char end) (end-of-line) (while (and (org-search-forward-unenclosed - org-item-beginning-re bottom 'move) + (org-item-beginning-re) bottom 'move) (>= (org-get-indentation) ind-min)) (setq post-list (cons (org-list-struct-assoc-at-point) post-list))) @@ -1191,13 +1203,13 @@ (when (and (= (caar pre-list) 0) (< (point) bottom)) (beginning-of-line) (while (org-search-forward-unenclosed - org-item-beginning-re bottom t) + (org-item-beginning-re) bottom t) (setq post-list (cons (org-list-struct-assoc-at-point) post-list)))) (append pre-list struct (reverse post-list)))))) ;; Here we start: first get the core zone... (goto-char end) - (while (org-search-backward-unenclosed org-item-beginning-re begin t) + (while (org-search-backward-unenclosed (org-item-beginning-re) begin t) (setq struct (cons (org-list-struct-assoc-at-point) struct))) ;; ... then, extend it to make it a structure... (let ((extended (funcall extend struct))) @@ -1259,16 +1271,21 @@ (let ((counter (nth 3 item)) (bullet (org-list-bullet-string (nth 2 item)))) (cond - ((and (string-match "[0-9]+" bullet) counter) + ((and (string-match "[0-9]+\\|[A-Za-z]" bullet) counter) (replace-match counter nil nil bullet)) ((string-match "[0-9]+" bullet) (replace-match "1" nil nil bullet)) + ((and (save-excursion (goto-char (nth 0 item)) (org-list-can-be-alphabetical)) + (string-match "[A-Za-z]" bullet)) + (replace-match "a" nil nil bullet)) + ((string-match "[A-Za-z]" bullet) + (replace-match "1" nil nil bullet)) (t bullet))))) (set-bul (lambda (item bullet) (setcdr item (list (nth 1 item) bullet (nth 3 item))))) (get-bul (lambda (item bullet) (let* ((counter (nth 3 item))) - (if (and counter (string-match "[0-9]+" bullet)) + (if (and counter (string-match "[0-9]+\\|[A-Za-z]" bullet)) (replace-match counter nil nil bullet) bullet)))) (fix-bul @@ -1582,13 +1599,63 @@ " "))) nil nil bullet 1))) +(defun org-increment-string (str cap) + "Increments str (a->a, b->b, z->aa, aa->ab etc). If cap is non-nil, then + the letters are capitalized." + (let ((res (org-convert-num-to-alpha-str + (1+ (org-convert-alpha-str-to-num str 1 (length str) cap)) cap)) + (z (if cap ?Z ?z)) + (b (if cap ?B ?b)) + (a (if cap ?A ?a))) + (if (and(= (string-to-char str) z) + (= (string-to-char res) b)) + (concat (if cap "A" "a") (substring res 1)) + (concat (make-string (- (length str) (length res)) a) res)))) + +(defun org-convert-alpha-str-to-num (str n pos cap) + "Converts the substring consisting of locations pos to pos-n to a + numeric representation." + (let ((a (if cap ?A ?a))) + (if (= pos 1) (* (- (string-to-char str) a) n) + (+ (* (- (nth (1- pos) (string-to-list str)) a) n) + (org-convert-alpha-str-to-num str (* 26 n) (1- pos) cap))))) + +(defun org-convert-num-to-alpha-str (n cap) + "Converts the number n to a alphabetical, base-26 representation." + (if (= n 0) "" + (concat (org-convert-num-to-alpha-str (/ n 26) cap) + (string (+ (if cap ?A ?a) (% n 26)))))) + +(defun org-list-can-be-alphabetical () + "Returns t if the list has only 26 elements." + (save-excursion + (goto-char (org-beginning-of-item-list)) + (and org-alphabetical-lists + (let ((retn 1)) + (condition-case nil + (progn (while (< retn 27) + (org-next-item) + (setq retn (1+ retn)) + nil)) + (error t)))))) + (defun org-list-inc-bullet-maybe (bullet) "Increment BULLET if applicable." - (if (string-match "[0-9]+" bullet) + (let ((case-fold-search nil)) + (cond + ((string-match "[0-9]+" bullet) (replace-match (number-to-string (1+ (string-to-number (match-string 0 bullet)))) - nil nil bullet) - bullet)) + nil nil bullet)) + ((string-match "[a-z]" bullet) + (replace-match + (org-increment-string (match-string 0 bullet) nil) + nil nil bullet)) + ((string-match "[A-Z]" bullet) + (replace-match + (org-increment-string (match-string 0 bullet) t) + nil nil bullet)) + (t bullet)))) (defun org-list-repair (&optional force-bullet top bottom) "Make sure all items are correctly indented, with the right bullet. @@ -1633,10 +1700,15 @@ (bullet (save-excursion (goto-char (org-get-beginning-of-list top)) (org-get-bullet))) - (current (cond - ((string-match "\\." bullet) "1.") - ((string-match ")" bullet) "1)") - (t bullet))) + (current (let ((case-fold-search nil)) + (cond + ((string-match "[0-9]+\\." bullet) "1.") + ((string-match "[0-9]+)" bullet) "1)") + ((string-match "[a-z]\\." bullet) "a.") + ((string-match "[a-z])" bullet) "a)") + ((string-match "[A-Z]\\." bullet) "A.") + ((string-match "[A-Z])" bullet) "A)") + (t bullet)))) (bullet-rule-p (cdr (assq 'bullet org-list-automatic-rules))) (bullet-list (append '("-" "+" ) ;; *-bullets are not allowed at column 0 @@ -1644,11 +1716,21 @@ (looking-at "\\S-")) '("*")) ;; Description items cannot be numbered (unless (and bullet-rule-p + (or (eq org-plain-list-ordered-item-terminator ?.) + (org-at-item-description-p))) '("1)")) + (unless (and bullet-rule-p (or (eq org-plain-list-ordered-item-terminator ?\)) (org-at-item-description-p))) '("1.")) + (when (and org-alphabetical-lists (org-list-can-be-alphabetical)) + (append (unless (and bullet-rule-p (or (eq org-plain-list-ordered-item-terminator ?.) - (org-at-item-description-p))) '("1)")))) + (org-at-item-description-p))) + '("A)" "a)")) + (unless (and bullet-rule-p + (or (eq org-plain-list-ordered-item-terminator ?\)) + (org-at-item-description-p))) + '("A." "a.")))))) (len (length bullet-list)) (item-index (- len (length (member current bullet-list)))) (get-value (lambda (index) (nth (mod index len) bullet-list))) @@ -1684,7 +1766,7 @@ (rend (region-end))) (save-excursion (goto-char rbeg) - (if (org-search-forward-unenclosed org-item-beginning-re rend 'move) + (if (org-search-forward-unenclosed (org-item-beginning-re) rend 'move) (list (point-at-bol) rend nil) (error "No item in region"))))) ((org-on-heading-p) @@ -1696,7 +1778,7 @@ (goto-char limit) (org-search-backward-unenclosed ":END:" pos 'move) (org-search-forward-unenclosed - org-item-beginning-re limit 'move) + (org-item-beginning-re) limit 'move) (list (point) limit nil)))) ((org-at-item-p) (list (point-at-bol) (1+ (point-at-eol)) t)) @@ -1744,7 +1826,7 @@ (goto-char beg) (while (< (point) end) (funcall act-on-item ref-presence ref-status) - (org-search-forward-unenclosed org-item-beginning-re end 'move))) + (org-search-forward-unenclosed (org-item-beginning-re) end 'move))) (org-update-checkbox-count-maybe))) (defun org-reset-checkbox-state-subtree () @@ -1853,7 +1935,7 @@ (goto-char (or (org-get-next-item (point) lim) lim)) (end-of-line) (when (org-search-forward-unenclosed - org-item-beginning-re lim t) + (org-item-beginning-re) lim t) (beginning-of-line))) (setq next-ind (org-get-indentation))))) (goto-char continue-from) @@ -2025,10 +2107,10 @@ (let* ((start (goto-char (org-list-top-point))) (end (org-list-bottom-point)) output itemsep ltype) - (while (org-search-forward-unenclosed org-item-beginning-re end t) + (while (org-search-forward-unenclosed (org-item-beginning-re) end t) (save-excursion (beginning-of-line) - (setq ltype (cond ((looking-at-p "^[ \t]*[0-9]") 'ordered) + (setq ltype (cond ((looking-at-p "^[ \t]*\\([0-9]+\\|[A-Za-z]\\)") 'ordered) ((org-at-item-description-p) 'descriptive) (t 'unordered)))) (let* ((indent1 (org-get-indentation)) @@ -2037,7 +2119,7 @@ (org-end-of-item-or-at-child end)))) (nextindent (if (= (point) end) 0 (org-get-indentation))) (item (if (string-match - "^\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?\\[\\([xX ]\\)\\]" + "^\\(?:\\[@\\(?:start:\\)?\\(?:[0-9]+\\|[A-Za-z]\\)\\][ \t]*\\)?\\[\\([xX ]\\)\\]" item) (replace-match (if (equal (match-string 1 item) " ") "CBOFF" @@ -2122,7 +2204,7 @@ (top-point (progn (re-search-backward "#\\+ORGLST" nil t) - (re-search-forward org-item-beginning-re bottom-point t) + (re-search-forward (org-item-beginning-re) bottom-point t) (match-beginning 0))) (list (save-restriction (narrow-to-region top-point bottom-point) [-- Attachment #3: Type: text/plain, Size: 201 bytes --] _______________________________________________ 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 ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-10-28 7:17 ` Nathaniel Flath @ 2010-11-11 7:16 ` Nathaniel Flath 2010-11-11 8:57 ` Nicolas Goaziou 2010-11-13 15:16 ` Nicolas Goaziou 0 siblings, 2 replies; 41+ messages in thread From: Nathaniel Flath @ 2010-11-11 7:16 UTC (permalink / raw) To: Carsten Dominik Cc: Bernt Hansen, Jacob Mitchell, org-mode List, Nicolas Goaziou Are there any further issues? Thanks, Nathaniel Flath On Thu, Oct 28, 2010 at 12:17 AM, Nathaniel Flath <flat0103@gmail.com> wrote: > New patch fixing these issues is attached. > > Let me know of any other problems. > > On Tue, Oct 26, 2010 at 1:23 AM, Carsten Dominik > <carsten.dominik@gmail.com> wrote: >> >> On Oct 26, 2010, at 10:21 AM, Nicolas Goaziou wrote: >> >>> Hello, >>> >>>>>>>> Nathaniel Flath writes: >>> >>>> I think I've fixed the issues brought up with this new patch. Please >>>> let me know what you think. >>> >>> I've noticed a couple of glitches. >>> >>> First, you are using >>> >>> (> 28 (length struct)) >>> >>> to know when to replace letters by numbers. But (length struct) >>> doesn't always match list length, so it will lead to errors when >>> outdenting items. >>> >>> For example, try outdenting, with its subtree, the item marked with >>> "<<<" in the list below: >>> >>> a) etsiun >>> b) etsiun >>> c) etsiun >>> d) etisun >>> e) etsiun >>> f) etsiun >>> g) etsiun >>> h) etsiun >>> i) etisun >>> j) etsiun >>> k) etsiun >>> l) etsiun >>> m) etsiun >>> n) etsiun >>> a) Outdent me and my children ! <<< >>> a) tersiu >>> b) etsiru >>> c) estiur >>> d) etsnriu >>> e) etsiun >>> f) etiune >>> g) etuirsnet >>> b) etsiun >>> o) etsiun >>> p) etsiun >>> q) etsiun >>> r) etsiun >>> s) etsiun >>> >>> All the lists will be numbered although they could keep alphabetical >>> bullets. >>> >>> Another (lesser) problem is coming from the regexp chosen for bullets, >>> that is "[0-9A-Za-z]+". I would suggest something alike >>> "\\(\\(?:[0-9]\\)+\\|[A-Za-z]\\)". At the moment, you can set counter >>> to [@a4] and break you list when applying it. >> >> >> Also, even when the alpha lists are turned off, typing >> >> a) >> >> and pressing M-RET will show that a) is seen as a list bullet. >> >> Thanks for your work, we are getting closer to an acceptable patch. >> >> - Carsten >> >>> >>> Regards, >>> >>> -- Nicolas >> >> - Carsten >> >> >> >> > ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-11-11 7:16 ` Nathaniel Flath @ 2010-11-11 8:57 ` Nicolas Goaziou 2010-11-13 15:16 ` Nicolas Goaziou 1 sibling, 0 replies; 41+ messages in thread From: Nicolas Goaziou @ 2010-11-11 8:57 UTC (permalink / raw) To: Nathaniel Flath Cc: Bernt Hansen, Jacob Mitchell, org-mode List, Carsten Dominik Hello, >>>>> Nathaniel Flath writes: > Are there any further issues? Thanks, Nathaniel Flath I've quick checked your patch and it looks like it is doing its job. Two things to note, though: 1. I strongly recommend that `org-list-can-be-alphabetical' should make use of non-interactive forms instead of interactive ones. In other words, you should use `org-get-beginning-of-list' and `org-get-next-item' instead of `org-beginning-of-item-list' and `org-next-item'. You can see my note about it in org-list.el at line 856. If you have the structure of the list, `caadr' on it (or an equivalent if you don't like cl.el) will give you a valid top item needed by non-interactive forms. 2. Your patch doesn't apply to current git head, you should correct the conflict. Regards, -- Nicolas ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-11-11 7:16 ` Nathaniel Flath 2010-11-11 8:57 ` Nicolas Goaziou @ 2010-11-13 15:16 ` Nicolas Goaziou 2010-11-22 4:45 ` Nathaniel Flath 1 sibling, 1 reply; 41+ messages in thread From: Nicolas Goaziou @ 2010-11-13 15:16 UTC (permalink / raw) To: Nathaniel Flath Cc: Bernt Hansen, Jacob Mitchell, org-mode List, Carsten Dominik Hello, >>>>> Nathaniel Flath writes: > Are there any further issues? Also, as you changed `org-item-beginning-re' into a function, there are a few places outside org-list.el that need to be modified accordingly. And exporters (mainly HTML and DocBook) should be aware of alphabetical bullets. Regards, -- Nicolas ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-11-13 15:16 ` Nicolas Goaziou @ 2010-11-22 4:45 ` Nathaniel Flath 2010-11-22 13:37 ` Bernt Hansen 2010-11-22 18:37 ` Nicolas Goaziou 0 siblings, 2 replies; 41+ messages in thread From: Nathaniel Flath @ 2010-11-22 4:45 UTC (permalink / raw) To: Nicolas Goaziou Cc: Bernt Hansen, Jacob Mitchell, org-mode List, Carsten Dominik [-- Attachment #1: Type: text/plain, Size: 668 bytes --] I think I've fixed these, although I'm not an expert in the exporting. Let me know if there's anything else, or if I screwed up anything when trying to figure out how to make a git patch(looks like it worked, though.) Thanks, Nathaniel Flath On Sat, Nov 13, 2010 at 7:16 AM, Nicolas Goaziou <n.goaziou@gmail.com> wrote: > Hello, > >>>>>> Nathaniel Flath writes: > >> Are there any further issues? > > Also, as you changed `org-item-beginning-re' into a function, there > are a few places outside org-list.el that need to be modified > accordingly. > > And exporters (mainly HTML and DocBook) should be aware of > alphabetical bullets. > > Regards, > > -- Nicolas > [-- Attachment #2: 0001-Squashed-commit-of-the-following.patch --] [-- Type: application/octet-stream, Size: 30427 bytes --] From 3b46feec08ec4c93f098dbdc6a4590f95afc0e68 Mon Sep 17 00:00:00 2001 From: unknown <nflath@.(none)> Date: Sun, 21 Nov 2010 20:40:02 -0800 Subject: [PATCH] Squashed commit of the following: commit 7e9c81b27591c010cc0b6b016ee0e669ef5a304c Author: unknown <nflath@.(none)> Date: Sun Nov 21 20:01:42 2010 -0800 New version of alpha lists commit b3fd5cc57b7f1bd62ee1f5e0d8a1cf57ca14cfc2 Author: unknown <nflath@.(none)> Date: Thu Oct 21 22:28:44 2010 -0700 foo2 commit 00279a9b53b75baf1e3e13fc0bf0926421dddd25 Author: unknown <nflath@.(none)> Date: Thu Oct 21 22:27:01 2010 -0700 foo Fixup alphabetical lists patch --- lisp/org-capture.el | 4 +- lisp/org-docbook.el | 31 ++++--- lisp/org-exp.el | 2 +- lisp/org-html.el | 24 ++++-- lisp/org-latex.el | 2 +- lisp/org-list.el | 266 ++++++++++++++++++++++++++++++++++----------------- 6 files changed, 217 insertions(+), 112 deletions(-) diff --git a/lisp/org-capture.el b/lisp/org-capture.el index 2abe5c7..f2e8235 100644 --- a/lisp/org-capture.el +++ b/lisp/org-capture.el @@ -773,14 +773,14 @@ already gone." (if (org-capture-get :prepend) (progn (goto-char beg) - (if (org-search-forward-unenclosed org-item-beginning-re end t) + (if (org-search-forward-unenclosed (org-item-beginning-re) end t) (progn (goto-char (match-beginning 0)) (setq ind (org-get-indentation))) (goto-char end) (setq ind 0))) (goto-char end) - (if (org-search-backward-unenclosed org-item-beginning-re beg t) + (if (org-search-backward-unenclosed (org-item-beginning-re) beg t) (progn (setq ind (org-get-indentation)) (org-end-of-item)) diff --git a/lisp/org-docbook.el b/lisp/org-docbook.el index 7d90ec3..2b21022 100644 --- a/lisp/org-docbook.el +++ b/lisp/org-docbook.el @@ -1,5 +1,5 @@ ;;; org-docbook.el --- DocBook exporter for org-mode -;; +; ;; Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc. ;; ;; Emacs Lisp Archive Entry @@ -1012,14 +1012,15 @@ publishing directory." ;; Normal lines (when (string-match (cond - ((eq llt t) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+[.)]\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") - ((= llt ?.) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+\\.\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") - ((= llt ?\)) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+)\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((eq llt t) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\)[.)]\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((= llt ?.) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\)\\.\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((= llt ?\)) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\))\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") (t (error "Invalid value of `org-plain-list-ordered-item-terminator'"))) line) (setq ind (or (get-text-property 0 'original-indentation line) (org-get-string-indentation line)) item-type (if (match-beginning 4) "o" "u") + ordered-type (match-string 2 line) starter (if (match-beginning 2) (substring (match-string 2 line) 0 -1)) line (substring line (match-beginning 5)) @@ -1040,16 +1041,18 @@ publishing directory." (org-export-docbook-close-para-maybe) (insert (cond ((equal item-type "u") "<itemizedlist>\n<listitem>\n") - ((and (equal item-type "o") item-number) - ;; Check for a specific start number. If it - ;; is specified, we use the ``override'' - ;; attribute of element <listitem> to pass the - ;; info to DocBook. We could also use the - ;; ``startingnumber'' attribute of element - ;; <orderedlist>, but the former works on both - ;; DocBook 5.0 and prior versions. - (format "<orderedlist>\n<listitem override=\"%s\">\n" item-number)) - ((equal item-type "o") "<orderedlist>\n<listitem>\n") + ((equal item-type "o") + (progn + (message ordered-type) + (concat "<orderedlist numeration=\"" + (cond + ((not starter) "arabic") + ((string-match "[0-9]+[.)]" ordered-type) "arabic") + ((string-match "[A-Z][.)]" ordered-type) "upperalpha") + ((string-match "[a-z][.)]" ordered-type) "loweralpha")) + "\">\n<listitem" + (if item-number (concat " override=\"" item-number "\">\n") + ">\n")))) ((equal item-type "d") (format "<variablelist>\n<varlistentry><term>%s</term><listitem>\n" item-tag)))) ;; For DocBook, we need to open a para right after tag diff --git a/lisp/org-exp.el b/lisp/org-exp.el index 08c0ac6..e510806 100644 --- a/lisp/org-exp.el +++ b/lisp/org-exp.el @@ -1664,7 +1664,7 @@ These special cookies will later be interpreted by the backend. (let ((process-buffer (lambda (end-list-marker) (goto-char (point-min)) - (while (org-search-forward-unenclosed org-item-beginning-re nil t) + (while (org-search-forward-unenclosed (org-item-beginning-re) nil t) (goto-char (org-list-bottom-point)) (when (and (not (eq org-list-ending-method 'indent)) (looking-at (org-list-end-re))) diff --git a/lisp/org-html.el b/lisp/org-html.el index d1fe06d..e4129eb 100644 --- a/lisp/org-html.el +++ b/lisp/org-html.el @@ -1551,20 +1551,21 @@ lang=\"%s\" xml:lang=\"%s\"> ;; Normal lines (when (string-match (cond - ((eq llt t) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+[.)]\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") - ((= llt ?.) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+\\.\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") - ((= llt ?\)) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+)\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((eq llt t) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\)[.)]\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((= llt ?.) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\)\\.\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((= llt ?\)) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\))\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") (t (error "Invalid value of `org-plain-list-ordered-item-terminator'"))) line) (setq ind (or (get-text-property 0 'original-indentation line) (org-get-string-indentation line)) item-type (if (match-beginning 4) "o" "u") + ordered-type (match-string 2 line) starter (if (match-beginning 2) (substring (match-string 2 line) 0 -1)) line (substring line (match-beginning 5)) item-number nil item-tag nil) - (if (string-match "\\[@\\(?:start:\\)?\\([0-9]+\\)\\][ \t]?" line) + (if (string-match "\\[@\\(?:start:\\)?\\([0-9]+\\|[a-zA-Z]\\)\\][ \t]?" line) (setq item-number (match-string 1 line) line (replace-match "" t t line))) (if (and starter (string-match "\\(.*?\\) ::[ \t]*" line)) @@ -1579,9 +1580,18 @@ lang=\"%s\" xml:lang=\"%s\"> (org-close-par-maybe) (insert (cond ((equal item-type "u") "<ul>\n<li>\n") - ((and (equal item-type "o") item-number) - (format "<ol>\n<li value=\"%s\">\n" item-number)) - ((equal item-type "o") "<ol>\n<li>\n") + ((equal item-type "o") + (progn + (message ordered-type) + (concat "<ol type=\"" + (cond + ((not starter) "1") + ((string-match "[0-9]+[.)]" ordered-type) "1") + ((string-match "[A-Z][.)]" ordered-type) "A") + ((string-match "[a-z][.)]" ordered-type) "a")) + "\"><li" + (if item-number (concat" value=\"" item-number "\">\n") + ">\n")))) ((equal item-type "d") (format "<dl>\n<dt>%s</dt><dd>\n" item-tag)))) (push item-type local-list-type) diff --git a/lisp/org-latex.el b/lisp/org-latex.el index 91bf380..61523ca 100644 --- a/lisp/org-latex.el +++ b/lisp/org-latex.el @@ -2370,7 +2370,7 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER." "Convert plain text lists in current buffer into LaTeX lists." (let (res) (goto-char (point-min)) - (while (org-search-forward-unenclosed org-item-beginning-re nil t) + (while (org-search-forward-unenclosed (org-item-beginning-re) nil t) (beginning-of-line) (setq res (org-list-to-latex (org-list-parse-list t) org-export-latex-list-parameters)) diff --git a/lisp/org-list.el b/lisp/org-list.el index 2290b4a..dbe2576 100644 --- a/lisp/org-list.el +++ b/lisp/org-list.el @@ -221,16 +221,16 @@ indent when non-nil, indenting or outdenting list top-item insert when non-nil, trying to insert an item inside a block will insert it right before the block instead of throwing an error." - :group 'org-plain-lists - :type '(alist :tag "Sets of rules" - :key-type - (choice - (const :tag "Bullet" bullet) - (const :tag "Checkbox" checkbox) - (const :tag "Indent" indent) - (const :tag "Insert" insert)) - :value-type - (boolean :tag "Activate" :value t))) + :group 'org-plain-lists + :type '(alist :tag "Sets of rules" + :key-type + (choice + (const :tag "Bullet" bullet) + (const :tag "Checkbox" checkbox) + (const :tag "Indent" indent) + (const :tag "Insert" insert)) + :value-type + (boolean :tag "Activate" :value t))) (defcustom org-hierarchical-checkbox-statistics t "Non-nil means checkbox statistics counts only the state of direct children. @@ -240,6 +240,11 @@ with the word \"recursive\" in the value." :group 'org-plain-lists :type 'boolean) +(defcustom org-alphabetical-lists nil + "Non-nil means alphabetical lists are activated." + :group 'org-plain-lists + :type 'boolean) + (defcustom org-description-max-indent 20 "Maximum indentation for the second line of a description list. When the indentation would be larger than this, it will become @@ -288,16 +293,23 @@ It depends on `org-empty-line-terminates-plain-lists'." If GENERAL is non-nil, return the general regexp independent of the value of `org-plain-list-ordered-item-terminator'." (cond + ((and org-alphabetical-lists (or general (eq org-plain-list-ordered-item-terminator t))) + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\)[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + ((and org-alphabetical-lists (= org-plain-list-ordered-item-terminator ?.)) + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\)\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + ((and org-alphabetical-lists (= org-plain-list-ordered-item-terminator ?\))) + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\))\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") ((or general (eq org-plain-list-ordered-item-terminator t)) - "\\([ \t]*\\([-+]\\|\\([0-9]+[.)]\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\)[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") ((= org-plain-list-ordered-item-terminator ?.) - "\\([ \t]*\\([-+]\\|\\([0-9]+\\.\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+)\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") ((= org-plain-list-ordered-item-terminator ?\)) - "\\([ \t]*\\([-+]\\|\\([0-9]+)\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\))\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))) -(defconst org-item-beginning-re (concat "^" (org-item-re)) - "Regexp matching the beginning of a plain list item.") +(defun org-item-beginning-re () + "Regexp matching the beginning of a plain list item." + (concat "^" (org-item-re))) (defun org-list-ending-between (min max &optional firstp) "Find the position of a list ending between MIN and MAX, or nil. @@ -327,11 +339,11 @@ stopping at LIMIT." (save-match-data (let ((case-fold-search t) (boundary (if (eq search 're-search-forward) 3 5))) - (when (save-excursion - (and (funcall search "^[ \t]*#\\+\\(begin\\|end\\)_" limit t) - (= (length (match-string 1)) boundary))) - ;; We're in a block: get out of it - (goto-char (match-beginning 0)))))) + (when (save-excursion + (and (funcall search "^[ \t]*#\\+\\(begin\\|end\\)_" limit t) + (= (length (match-string 1)) boundary))) + ;; We're in a block: get out of it + (goto-char (match-beginning 0)))))) (defun org-list-search-unenclosed-generic (search re bound noerr) "Search a string outside blocks and protected places. @@ -385,7 +397,7 @@ indented than the previous item within LIMIT." ;; Ensure there is at least an item above (up-item-p (save-excursion (org-search-backward-unenclosed - org-item-beginning-re limit t)))) + (org-item-beginning-re) limit t)))) (and up-item-p (catch 'exit (while t @@ -413,7 +425,7 @@ Argument LIMIT specifies the upper-bound of the search." ;; `org-item-re'. (last-item-start (save-excursion (org-search-backward-unenclosed - org-item-beginning-re limit t))) + (org-item-beginning-re) limit t))) (list-ender (org-list-ending-between last-item-start actual-pos))) ;; We are in a list when we are on an item line or when we can @@ -433,7 +445,7 @@ List ending is determined by regexp. See ;; Otherwise, go back to the heading above or bob. (goto-char (or (org-list-ending-between limit pos) limit)) ;; From there, search down our list. - (org-search-forward-unenclosed org-item-beginning-re pos t) + (org-search-forward-unenclosed (org-item-beginning-re) pos t) (point-at-bol)))) (defun org-list-bottom-point-with-regexp (limit) @@ -530,8 +542,8 @@ List ending is determined by the indentation of text. See (save-excursion (goto-char (match-end 0)) ;; Ignore counter if any - (when (looking-at "\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?") - (goto-char (match-end 0))) + (when (looking-at "\\(?:\\[@\\(?:start:\\)?\\(?:[0-9]+\\|[A-Za-z]\\)\\][ \t]*\\)?") + (goto-char (match-end 0))) (looking-at regexp)))) (defun org-list-get-item-same-level (search-fun pos limit pre-move) @@ -545,7 +557,7 @@ uses PRE-MOVE before search. Return nil if no item was found." ;; We don't want to match the current line. (funcall pre-move) ;; Skip any sublist on the way - (while (and (funcall search-fun org-item-beginning-re limit t) + (while (and (funcall search-fun (org-item-beginning-re) limit t) (> (org-get-indentation) ind))) (when (and (/= (point-at-bol) start) ; Have we moved ? (= (org-get-indentation) ind)) @@ -606,7 +618,7 @@ function ends." (goto-char pos) ;; Is point in a special block? (when (org-in-regexps-block-p - "^[ \t]*#\\+\\(begin\\|BEGIN\\)_\\([a-zA-Z0-9_]+\\)" + "^[ \t]*#\\+\\(begin\\|BEGIN\\)_\\(\\(?:[a-zA-Z]\\|[0-9_]+\\)\\)" '(concat "^[ \t]*#\\+\\(end\\|END\\)_" (match-string 2))) (if (not (cdr (assq 'insert org-list-automatic-rules))) ;; Rule in `org-list-automatic-rules' forbids insertion. @@ -649,9 +661,9 @@ function ends." (org-list-exchange-items (org-get-item-beginning) (org-get-next-item (point) bottom) bottom) - ;; recompute next-item: last sexp modified list - (goto-char (org-get-next-item (point) bottom)) - (org-move-to-column col))) + ;; recompute next-item: last sexp modified list + (goto-char (org-get-next-item (point) bottom)) + (org-move-to-column col))) ;; checkbox update might modify bottom point, so use a ;; marker here (setq bottom (copy-marker bottom)) @@ -704,7 +716,7 @@ Return t if successful." (cond ((and regionp (goto-char rbeg) - (not (org-search-forward-unenclosed org-item-beginning-re rend t))) + (not (org-search-forward-unenclosed (org-item-beginning-re) rend t))) (error "No item in region")) ((not (org-at-item-p)) (error "Not on an item")) @@ -802,13 +814,13 @@ TOP is the position of list's top-item." (save-excursion (beginning-of-line) (let ((ind (org-get-indentation))) - (or (not (org-search-backward-unenclosed org-item-beginning-re top t)) + (or (not (org-search-backward-unenclosed (org-item-beginning-re) top t)) (< (org-get-indentation) ind))))) (defun org-at-item-p () "Is point in a line starting a hand-formatted item?" (save-excursion - (beginning-of-line) (looking-at org-item-beginning-re))) + (beginning-of-line) (looking-at (org-item-beginning-re)))) (defun org-at-item-bullet-p () "Is point at the bullet of a plain list item?" @@ -907,7 +919,7 @@ Assume point is in a list." (save-excursion ;; possibly match current line (end-of-line) - (org-search-backward-unenclosed org-item-beginning-re nil t) + (org-search-backward-unenclosed (org-item-beginning-re) nil t) (point-at-bol))) (defun org-beginning-of-item () @@ -943,7 +955,7 @@ BOTTOM is the position at list ending." (let ((ind (org-get-indentation))) (while (and (/= (point) bottom) (>= (org-get-indentation) ind)) - (org-search-forward-unenclosed org-item-beginning-re bottom 'move)) + (org-search-forward-unenclosed (org-item-beginning-re) bottom 'move)) (if (= (point) bottom) bottom (point-at-bol))))) (defun org-end-of-item-list () @@ -973,7 +985,7 @@ If the cursor is not in an item, throw an error." BOTTOM is the position at list ending." (end-of-line) (goto-char - (if (org-search-forward-unenclosed org-item-beginning-re bottom t) + (if (org-search-forward-unenclosed (org-item-beginning-re) bottom t) (point-at-bol) (org-get-end-of-item bottom)))) @@ -1135,11 +1147,11 @@ bullet string and bullet counter, if any." (list (point-at-bol) (org-get-indentation) (progn - (looking-at "^[ \t]*\\([-+*0-9.)]+[ \t]+\\)") + (looking-at "^[ \t]*\\([-+*0-9A-Za-z.)]+[ \t]+\\)") (match-string 1)) (progn (goto-char (match-end 0)) - (and (looking-at "\\[@\\(?:start:\\)?\\([0-9]+\\)\\]") + (and (looking-at "\\[@\\(?:start:\\)?\\(\\(?:[0-9]+\\|[A-Za-z]\\)\\)\\]") (match-string 1)))))) (defun org-list-struct (begin end top bottom &optional outdent) @@ -1168,7 +1180,7 @@ change is an outdent." (goto-char begin) ;; Find beginning of most outdented list (min list) (while (and (org-search-backward-unenclosed - org-item-beginning-re top t) + (org-item-beginning-re) top t) (>= (org-get-indentation) ind-min)) (setq pre-list (cons (org-list-struct-assoc-at-point) pre-list))) @@ -1182,7 +1194,7 @@ change is an outdent." (goto-char end) (end-of-line) (while (and (org-search-forward-unenclosed - org-item-beginning-re bottom 'move) + (org-item-beginning-re) bottom 'move) (>= (org-get-indentation) ind-min)) (setq post-list (cons (org-list-struct-assoc-at-point) post-list))) @@ -1191,13 +1203,13 @@ change is an outdent." (when (and (= (caar pre-list) 0) (< (point) bottom)) (beginning-of-line) (while (org-search-forward-unenclosed - org-item-beginning-re bottom t) + (org-item-beginning-re) bottom t) (setq post-list (cons (org-list-struct-assoc-at-point) post-list)))) (append pre-list struct (reverse post-list)))))) ;; Here we start: first get the core zone... (goto-char end) - (while (org-search-backward-unenclosed org-item-beginning-re begin t) + (while (org-search-backward-unenclosed (org-item-beginning-re) begin t) (setq struct (cons (org-list-struct-assoc-at-point) struct))) ;; ... then, extend it to make it a structure... (let ((extended (funcall extend struct))) @@ -1259,16 +1271,22 @@ This function modifies STRUCT." (let ((counter (nth 3 item)) (bullet (org-list-bullet-string (nth 2 item)))) (cond - ((and (string-match "[0-9]+" bullet) counter) + ((and (string-match "[0-9]+\\|[A-Za-z]" bullet) counter) (replace-match counter nil nil bullet)) ((string-match "[0-9]+" bullet) (replace-match "1" nil nil bullet)) + ((and (save-excursion (goto-char (nth 0 item)) + (org-list-can-be-alphabetical (caadr struct))) + (string-match "[A-Za-z]" bullet)) + (replace-match "a" nil nil bullet)) + ((string-match "[A-Za-z]" bullet) + (replace-match "1" nil nil bullet)) (t bullet))))) (set-bul (lambda (item bullet) (setcdr item (list (nth 1 item) bullet (nth 3 item))))) (get-bul (lambda (item bullet) (let* ((counter (nth 3 item))) - (if (and counter (string-match "[0-9]+" bullet)) + (if (and counter (string-match "[0-9]+\\|[A-Za-z]" bullet)) (replace-match counter nil nil bullet) bullet)))) (fix-bul @@ -1582,13 +1600,63 @@ It determines the number of whitespaces to append by looking at " "))) nil nil bullet 1))) +(defun org-increment-string (str cap) + "Increments str (a->a, b->b, z->aa, aa->ab etc). If cap is non-nil, then + the letters are capitalized." + (let ((res (org-convert-num-to-alpha-str + (1+ (org-convert-alpha-str-to-num str 1 (length str) cap)) cap)) + (z (if cap ?Z ?z)) + (b (if cap ?B ?b)) + (a (if cap ?A ?a))) + (if (and(= (string-to-char str) z) + (= (string-to-char res) b)) + (concat (if cap "A" "a") (substring res 1)) + (concat (make-string (- (length str) (length res)) a) res)))) + +(defun org-convert-alpha-str-to-num (str n pos cap) + "Converts the substring consisting of locations pos to pos-n to a + numeric representation." + (let ((a (if cap ?A ?a))) + (if (= pos 1) (* (- (string-to-char str) a) n) + (+ (* (- (nth (1- pos) (string-to-list str)) a) n) + (org-convert-alpha-str-to-num str (* 26 n) (1- pos) cap))))) + +(defun org-convert-num-to-alpha-str (n cap) + "Converts the number n to a alphabetical, base-26 representation." + (if (= n 0) "" + (concat (org-convert-num-to-alpha-str (/ n 26) cap) + (string (+ (if cap ?A ?a) (% n 26)))))) + +(defun org-list-can-be-alphabetical (item) + "Returns t if the list has only 26 elements." + (save-excursion + (goto-char (org-get-beginning-of-list item)) + (and org-alphabetical-lists + (let ((retn 1)) + (while (and + (< retn 27) + (org-get-next-item (point) (point-max))) + (setq retn (1+ retn)) + (goto-char (org-get-next-item (point) (point-max)))) + (<= retn 26))))) + (defun org-list-inc-bullet-maybe (bullet) "Increment BULLET if applicable." - (if (string-match "[0-9]+" bullet) + (let ((case-fold-search nil)) + (cond + ((string-match "[0-9]+" bullet) (replace-match (number-to-string (1+ (string-to-number (match-string 0 bullet)))) - nil nil bullet) - bullet)) + nil nil bullet)) + ((string-match "[a-z]" bullet) + (replace-match + (org-increment-string (match-string 0 bullet) nil) + nil nil bullet)) + ((string-match "[A-Z]" bullet) + (replace-match + (org-increment-string (match-string 0 bullet) t) + nil nil bullet)) + (t bullet)))) (defun org-list-repair (&optional force-bullet top bottom) "Make sure all items are correctly indented, with the right bullet. @@ -1629,36 +1697,60 @@ If WHICH is a valid string, use that as the new bullet. If WHICH is an integer, 0 means `-', 1 means `+' etc. If WHICH is 'previous, cycle backwards." (interactive "P") - (save-excursion - (let* ((top (org-list-top-point)) - (bullet (progn - (goto-char (org-get-beginning-of-list top)) - (org-get-bullet))) - (current (cond - ((string-match "\\." bullet) "1.") - ((string-match ")" bullet) "1)") - (t bullet))) - (bullet-rule-p (cdr (assq 'bullet org-list-automatic-rules))) - (bullet-list (append '("-" "+" ) - ;; *-bullets are not allowed at column 0 - (unless (and bullet-rule-p - (looking-at "\\S-")) '("*")) - ;; Description items cannot be numbered - (unless (and bullet-rule-p - (or (eq org-plain-list-ordered-item-terminator ?\)) - (org-at-item-description-p))) '("1.")) - (unless (and bullet-rule-p - (or (eq org-plain-list-ordered-item-terminator ?.) - (org-at-item-description-p))) '("1)")))) - (len (length bullet-list)) - (item-index (- len (length (member current bullet-list)))) - (get-value (lambda (index) (nth (mod index len) bullet-list))) - (new (cond - ((member which bullet-list) which) - ((numberp which) (funcall get-value which)) - ((eq 'previous which) (funcall get-value (1- item-index))) - (t (funcall get-value (1+ item-index)))))) - (org-list-repair new top)))) + (let* ((top (org-list-top-point)) + (alpha-possible (save-excursion + (goto-char (org-list-top-point)) + (and org-alphabetical-lists + (let ((retn 1)) + (condition-case nil + (progn (while (< retn 27) + (org-next-item) + (setq retn (1+ retn)) + nil)) + (error t)))))) + (bullet (save-excursion + (goto-char (org-get-beginning-of-list top)) + (org-get-bullet))) + (current (let ((case-fold-search nil)) + (cond + ((string-match "[0-9]+\\." bullet) "1.") + ((string-match "[0-9]+)" bullet) "1)") + ((string-match "[a-z]\\." bullet) "a.") + ((string-match "[a-z])" bullet) "a)") + ((string-match "[A-Z]\\." bullet) "A.") + ((string-match "[A-Z])" bullet) "A)") + (t bullet)))) + (bullet-rule-p (cdr (assq 'bullet org-list-automatic-rules))) + (bullet-list (append '("-" "+" ) + ;; *-bullets are not allowed at column 0 + (unless (and bullet-rule-p + (looking-at "\\S-")) '("*")) + ;; Description items cannot be numbered + (unless (and bullet-rule-p + (or (eq org-plain-list-ordered-item-terminator ?.) + (org-at-item-description-p))) '("1)")) + (unless (and bullet-rule-p + (or (eq org-plain-list-ordered-item-terminator ?\)) + (org-at-item-description-p))) '("1.")) + (when (and org-alphabetical-lists (org-list-can-be-alphabetical)) + (append + (unless (and bullet-rule-p + (or (eq org-plain-list-ordered-item-terminator ?.) + (org-at-item-description-p))) + '("A)" "a)")) + (unless (and bullet-rule-p + (or (eq org-plain-list-ordered-item-terminator ?\)) + (org-at-item-description-p))) + '("A." "a.")))))) + (len (length bullet-list)) + (item-index (- len (length (member current bullet-list)))) + (get-value (lambda (index) (nth (mod index len) bullet-list))) + (new (cond + ((member which bullet-list) which) + ((numberp which) (funcall get-value which)) + ((eq 'previous which) (funcall get-value (1- item-index))) + (t (funcall get-value (1+ item-index)))))) + (org-list-repair new top))) ;;; Checkboxes @@ -1685,7 +1777,7 @@ in subtree, ignoring drawers." (rend (region-end))) (save-excursion (goto-char rbeg) - (if (org-search-forward-unenclosed org-item-beginning-re rend 'move) + (if (org-search-forward-unenclosed (org-item-beginning-re) rend 'move) (list (point-at-bol) rend nil) (error "No item in region"))))) ((org-on-heading-p) @@ -1697,7 +1789,7 @@ in subtree, ignoring drawers." (goto-char limit) (org-search-backward-unenclosed ":END:" pos 'move) (org-search-forward-unenclosed - org-item-beginning-re limit 'move) + (org-item-beginning-re) limit 'move) (list (point) limit nil)))) ((org-at-item-p) (list (point-at-bol) (1+ (point-at-eol)) t)) @@ -1745,7 +1837,7 @@ in subtree, ignoring drawers." (goto-char beg) (while (< (point) end) (funcall act-on-item ref-presence ref-status) - (org-search-forward-unenclosed org-item-beginning-re end 'move))) + (org-search-forward-unenclosed (org-item-beginning-re) end 'move))) (org-update-checkbox-count-maybe))) (defun org-reset-checkbox-state-subtree () @@ -1854,7 +1946,7 @@ the whole buffer." (goto-char (or (org-get-next-item (point) lim) lim)) (end-of-line) (when (org-search-forward-unenclosed - org-item-beginning-re lim t) + (org-item-beginning-re) lim t) (beginning-of-line))) (setq next-ind (org-get-indentation))))) (goto-char continue-from) @@ -1880,8 +1972,8 @@ the whole buffer." (goto-char continue-from))) (unless (and all (outline-next-heading)) (throw 'exit nil)))) (when (interactive-p) - (message "Checkbox statistics updated %s (%d places)" - (if all "in entire file" "in current outline entry") cstat))))) + (message "Checkbox statistics updated %s (%d places)" + (if all "in entire file" "in current outline entry") cstat))))) (defun org-get-checkbox-statistics-face () "Select the face for checkbox statistics. @@ -2027,10 +2119,10 @@ sublevels as a list of strings." (let* ((start (goto-char (org-list-top-point))) (end (org-list-bottom-point)) output itemsep ltype) - (while (org-search-forward-unenclosed org-item-beginning-re end t) + (while (org-search-forward-unenclosed (org-item-beginning-re) end t) (save-excursion (beginning-of-line) - (setq ltype (cond ((org-looking-at-p "^[ \t]*[0-9]") 'ordered) + (setq ltype (cond ((ogr-looking-at-p "^[ \t]*\\([0-9]+\\|[A-Za-z]\\)") 'ordered) ((org-at-item-description-p) 'descriptive) (t 'unordered)))) (let* ((indent1 (org-get-indentation)) @@ -2039,7 +2131,7 @@ sublevels as a list of strings." (org-end-of-item-or-at-child end)))) (nextindent (if (= (point) end) 0 (org-get-indentation))) (item (if (string-match - "^\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?\\[\\([xX ]\\)\\]" + "^\\(?:\\[@\\(?:start:\\)?\\(?:[0-9]+\\|[A-Za-z]\\)\\][ \t]*\\)?\\[\\([xX ]\\)\\]" item) (replace-match (if (equal (match-string 1 item) " ") "CBOFF" @@ -2124,7 +2216,7 @@ this list." (top-point (progn (re-search-backward "#\\+ORGLST" nil t) - (re-search-forward org-item-beginning-re bottom-point t) + (re-search-forward (org-item-beginning-re) bottom-point t) (match-beginning 0))) (list (save-restriction (narrow-to-region top-point bottom-point) -- 1.7.2.3.msysgit.0 [-- Attachment #3: Type: text/plain, Size: 201 bytes --] _______________________________________________ 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 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-11-22 4:45 ` Nathaniel Flath @ 2010-11-22 13:37 ` Bernt Hansen 2010-11-22 18:37 ` Nicolas Goaziou 1 sibling, 0 replies; 41+ messages in thread From: Bernt Hansen @ 2010-11-22 13:37 UTC (permalink / raw) To: Nathaniel Flath Cc: org-mode List, Jacob Mitchell, Nicolas Goaziou, Carsten Dominik Nathaniel Flath <flat0103@gmail.com> writes: > Let me know if there's anything else, or if I screwed up anything > when trying to figure out how to make a git patch(looks like it > worked, though.) > > From 3b46feec08ec4c93f098dbdc6a4590f95afc0e68 Mon Sep 17 00:00:00 2001 > From: unknown <nflath@.(none)> > Date: Sun, 21 Nov 2010 20:40:02 -0800 > Subject: [PATCH] Squashed commit of the following: > > commit 7e9c81b27591c010cc0b6b016ee0e669ef5a304c > Author: unknown <nflath@.(none)> > Date: Sun Nov 21 20:01:42 2010 -0800 > > New version of alpha lists > > commit b3fd5cc57b7f1bd62ee1f5e0d8a1cf57ca14cfc2 > Author: unknown <nflath@.(none)> > Date: Thu Oct 21 22:28:44 2010 -0700 > > foo2 > > commit 00279a9b53b75baf1e3e13fc0bf0926421dddd25 > Author: unknown <nflath@.(none)> > Date: Thu Oct 21 22:27:01 2010 -0700 > > foo > > Fixup alphabetical lists patch > --- > lisp/org-capture.el | 4 +- Hi Nathaniel. There are a few issues with the commit message in this patch. 1. Invalid email address 2. A list of commits with useless information in it (foo, foo2) 3. Summary line (Squashed commot of the following:) really isn't useful on it's own The subject line (line 1 of the commit message) should be standalone and concisely state what the commit is for -- so you don't have to read the rest unless that interests you. The body of the commit message is for detailed descriptions of the change. You should delete the other squashed commit info since it is not useful. Describing what exactly you fixed up in the description would be preferable to 'fixed alphabetical lists patch'. 6 months from now nobody (including you) will know what you fixed without actually reading the patch details. Regards, Bernt ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-11-22 4:45 ` Nathaniel Flath 2010-11-22 13:37 ` Bernt Hansen @ 2010-11-22 18:37 ` Nicolas Goaziou 2010-11-27 4:39 ` Nathaniel Flath 1 sibling, 1 reply; 41+ messages in thread From: Nicolas Goaziou @ 2010-11-22 18:37 UTC (permalink / raw) To: Nathaniel Flath Cc: Bernt Hansen, Jacob Mitchell, org-mode List, Carsten Dominik Hello, >>>>> Nathaniel Flath writes: > although I'm not an expert in the exporting. Let me know if there's > anything else, or if I screwed up anything when trying to figure out > how to make a git patch(looks like it worked, though.) I looked at your patch and here is what I've noticed so far: - There's a bug in `org-cycle-list-bullet' where org-list-can-be-alphabetical is called with argument missing. - In `org-cycle-list-bullet', variable `top' stores list top point, make use of it instead of recomputing it. - There's a typo in `org-list-parse-list' (ogr-looking-at-p instead of org-looking-at-p) - Some parts of the patch are only white-space changes (for example a change in `org-list-automatic-rules' but there are others). You shouldn't include them, as it is not the purpose of the patch. It doesn't help understanding your patch either. - Why did you remove all code comments about lists in org-docbook.el? - This is not a bug but are you sure you want to make org-item-beginning-re a function? I understand that it permits an user changing the value of `org-alphabetical-lists' to avoid reloading Org, but it looks like syntax overweight to me. I mean, anyone wanting to look for a list item will have to remember that it must do a re-search on a function and not a string. Hoping that helps, Regards, -- Nicolas ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-11-22 18:37 ` Nicolas Goaziou @ 2010-11-27 4:39 ` Nathaniel Flath 2010-12-11 2:41 ` Nathaniel Flath 0 siblings, 1 reply; 41+ messages in thread From: Nathaniel Flath @ 2010-11-27 4:39 UTC (permalink / raw) To: Nicolas Goaziou Cc: Bernt Hansen, Jacob Mitchell, org-mode List, Carsten Dominik I'm working on your comments, should have another patch in the next day or so. The only thing I had issue with was the comment about org-item-beginning-re: I prefer it as a function for the reasons you mention, but I'm not particularly attached to this. Does anyone else have an opinion? Thanks, Nathaniel Flath On Mon, Nov 22, 2010 at 10:37 AM, Nicolas Goaziou <n.goaziou@gmail.com> wrote: > Hello, > >>>>>> Nathaniel Flath writes: > >> although I'm not an expert in the exporting. Let me know if there's >> anything else, or if I screwed up anything when trying to figure out >> how to make a git patch(looks like it worked, though.) > > I looked at your patch and here is what I've noticed so far: > > > - There's a bug in `org-cycle-list-bullet' where > org-list-can-be-alphabetical is called with argument missing. > > - In `org-cycle-list-bullet', variable `top' stores list top point, > make use of it instead of recomputing it. > > - There's a typo in `org-list-parse-list' (ogr-looking-at-p instead of > org-looking-at-p) > > - Some parts of the patch are only white-space changes (for example a > change in `org-list-automatic-rules' but there are others). You > shouldn't include them, as it is not the purpose of the patch. > > It doesn't help understanding your patch either. > > - Why did you remove all code comments about lists in org-docbook.el? > > - This is not a bug but are you sure you want to make > org-item-beginning-re a function? I understand that it permits an > user changing the value of `org-alphabetical-lists' to avoid > reloading Org, but it looks like syntax overweight to me. > > I mean, anyone wanting to look for a list item will have to remember > that it must do a re-search on a function and not a string. > > > Hoping that helps, > > Regards, > > -- Nicolas > ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-11-27 4:39 ` Nathaniel Flath @ 2010-12-11 2:41 ` Nathaniel Flath 2010-12-20 18:25 ` Nicolas Goaziou 0 siblings, 1 reply; 41+ messages in thread From: Nathaniel Flath @ 2010-12-11 2:41 UTC (permalink / raw) To: Nicolas Goaziou Cc: Bernt Hansen, Jacob Mitchell, org-mode List, Carsten Dominik [-- Attachment #1: Type: text/plain, Size: 2192 bytes --] Sory for the long delay - I got caught up in other work. A patchaddressing the sisues brought up is attached. Let me know of anything else. Thanks, Nathaniel Flath On Fri, Nov 26, 2010 at 8:39 PM, Nathaniel Flath <flat0103@gmail.com> wrote: > I'm working on your comments, should have another patch in the next day or so. > > The only thing I had issue with was the comment about > org-item-beginning-re: I prefer it as a function for the reasons you > mention, but I'm not particularly attached to this. Does anyone else > have an opinion? > > Thanks, > Nathaniel Flath > > On Mon, Nov 22, 2010 at 10:37 AM, Nicolas Goaziou <n.goaziou@gmail.com> wrote: >> Hello, >> >>>>>>> Nathaniel Flath writes: >> >>> although I'm not an expert in the exporting. Let me know if there's >>> anything else, or if I screwed up anything when trying to figure out >>> how to make a git patch(looks like it worked, though.) >> >> I looked at your patch and here is what I've noticed so far: >> >> >> - There's a bug in `org-cycle-list-bullet' where >> org-list-can-be-alphabetical is called with argument missing. >> >> - In `org-cycle-list-bullet', variable `top' stores list top point, >> make use of it instead of recomputing it. >> >> - There's a typo in `org-list-parse-list' (ogr-looking-at-p instead of >> org-looking-at-p) >> >> - Some parts of the patch are only white-space changes (for example a >> change in `org-list-automatic-rules' but there are others). You >> shouldn't include them, as it is not the purpose of the patch. >> >> It doesn't help understanding your patch either. >> >> - Why did you remove all code comments about lists in org-docbook.el? >> >> - This is not a bug but are you sure you want to make >> org-item-beginning-re a function? I understand that it permits an >> user changing the value of `org-alphabetical-lists' to avoid >> reloading Org, but it looks like syntax overweight to me. >> >> I mean, anyone wanting to look for a list item will have to remember >> that it must do a re-search on a function and not a string. >> >> >> Hoping that helps, >> >> Regards, >> >> -- Nicolas >> > [-- Attachment #2: 0001-Added-support-for-alphabetical-patches-to-org-list.patch --] [-- Type: application/octet-stream, Size: 26430 bytes --] From c588035305f6e516f2b395b26eca3429cae36e65 Mon Sep 17 00:00:00 2001 From: Nathaniel Falth <flat0103@gmail.com> Date: Wed, 8 Dec 2010 00:24:12 -0800 Subject: [PATCH] Added support for alphabetical patches to org-list. Support can be enabled with the 'org-alphabetical-lists' variable, and the numeration goes from 'a' to 'z'. The latex, html, and docbook exporters have been updated to use these. --- lisp/org-capture.el | 4 +- lisp/org-docbook.el | 24 +++++-- lisp/org-exp.el | 2 +- lisp/org-html.el | 24 +++++-- lisp/org-latex.el | 2 +- lisp/org-list.el | 180 ++++++++++++++++++++++++++++++++++++++------------- 6 files changed, 174 insertions(+), 62 deletions(-) diff --git a/lisp/org-capture.el b/lisp/org-capture.el index 6819c18..d463562 100644 --- a/lisp/org-capture.el +++ b/lisp/org-capture.el @@ -804,14 +804,14 @@ already gone. Any prefix argument will be passed to the refile comand." (if (org-capture-get :prepend) (progn (goto-char beg) - (if (org-search-forward-unenclosed org-item-beginning-re end t) + (if (org-search-forward-unenclosed (org-item-beginning-re) end t) (progn (goto-char (match-beginning 0)) (setq ind (org-get-indentation))) (goto-char end) (setq ind 0))) (goto-char end) - (if (org-search-backward-unenclosed org-item-beginning-re beg t) + (if (org-search-backward-unenclosed (org-item-beginning-re) beg t) (progn (setq ind (org-get-indentation)) (org-end-of-item)) diff --git a/lisp/org-docbook.el b/lisp/org-docbook.el index 7d90ec3..40ace14 100644 --- a/lisp/org-docbook.el +++ b/lisp/org-docbook.el @@ -1,5 +1,5 @@ ;;; org-docbook.el --- DocBook exporter for org-mode -;; +;yes ;; Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc. ;; ;; Emacs Lisp Archive Entry @@ -1012,14 +1012,15 @@ publishing directory." ;; Normal lines (when (string-match (cond - ((eq llt t) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+[.)]\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") - ((= llt ?.) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+\\.\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") - ((= llt ?\)) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+)\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((eq llt t) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\)[.)]\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((= llt ?.) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\)\\.\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((= llt ?\)) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\))\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") (t (error "Invalid value of `org-plain-list-ordered-item-terminator'"))) line) (setq ind (or (get-text-property 0 'original-indentation line) (org-get-string-indentation line)) item-type (if (match-beginning 4) "o" "u") + ordered-type (match-string 2 line) starter (if (match-beginning 2) (substring (match-string 2 line) 0 -1)) line (substring line (match-beginning 5)) @@ -1040,7 +1041,7 @@ publishing directory." (org-export-docbook-close-para-maybe) (insert (cond ((equal item-type "u") "<itemizedlist>\n<listitem>\n") - ((and (equal item-type "o") item-number) + ((equal item-type "o") ;; Check for a specific start number. If it ;; is specified, we use the ``override'' ;; attribute of element <listitem> to pass the @@ -1048,8 +1049,17 @@ publishing directory." ;; ``startingnumber'' attribute of element ;; <orderedlist>, but the former works on both ;; DocBook 5.0 and prior versions. - (format "<orderedlist>\n<listitem override=\"%s\">\n" item-number)) - ((equal item-type "o") "<orderedlist>\n<listitem>\n") + (progn + (message ordered-type) + (concat "<orderedlist numeration=\"" + (cond + ((not starter) "arabic") + ((string-match "[0-9]+[.)]" ordered-type) "arabic") + ((string-match "[A-Z][.)]" ordered-type) "upperalpha") + ((string-match "[a-z][.)]" ordered-type) "loweralpha")) + "\">\n<listitem" + (if item-number (concat " override=\"" item-number "\">\n") + ">\n")))) ((equal item-type "d") (format "<variablelist>\n<varlistentry><term>%s</term><listitem>\n" item-tag)))) ;; For DocBook, we need to open a para right after tag diff --git a/lisp/org-exp.el b/lisp/org-exp.el index 2aadacc..18b5071 100644 --- a/lisp/org-exp.el +++ b/lisp/org-exp.el @@ -1664,7 +1664,7 @@ These special cookies will later be interpreted by the backend. (let ((process-buffer (lambda (end-list-marker) (goto-char (point-min)) - (while (org-search-forward-unenclosed org-item-beginning-re nil t) + (while (org-search-forward-unenclosed (org-item-beginning-re) nil t) (goto-char (org-list-bottom-point)) (when (and (not (eq org-list-ending-method 'indent)) (looking-at (org-list-end-re))) diff --git a/lisp/org-html.el b/lisp/org-html.el index d1fe06d..e4129eb 100644 --- a/lisp/org-html.el +++ b/lisp/org-html.el @@ -1551,20 +1551,21 @@ lang=\"%s\" xml:lang=\"%s\"> ;; Normal lines (when (string-match (cond - ((eq llt t) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+[.)]\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") - ((= llt ?.) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+\\.\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") - ((= llt ?\)) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+)\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((eq llt t) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\)[.)]\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((= llt ?.) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\)\\.\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((= llt ?\)) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\))\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") (t (error "Invalid value of `org-plain-list-ordered-item-terminator'"))) line) (setq ind (or (get-text-property 0 'original-indentation line) (org-get-string-indentation line)) item-type (if (match-beginning 4) "o" "u") + ordered-type (match-string 2 line) starter (if (match-beginning 2) (substring (match-string 2 line) 0 -1)) line (substring line (match-beginning 5)) item-number nil item-tag nil) - (if (string-match "\\[@\\(?:start:\\)?\\([0-9]+\\)\\][ \t]?" line) + (if (string-match "\\[@\\(?:start:\\)?\\([0-9]+\\|[a-zA-Z]\\)\\][ \t]?" line) (setq item-number (match-string 1 line) line (replace-match "" t t line))) (if (and starter (string-match "\\(.*?\\) ::[ \t]*" line)) @@ -1579,9 +1580,18 @@ lang=\"%s\" xml:lang=\"%s\"> (org-close-par-maybe) (insert (cond ((equal item-type "u") "<ul>\n<li>\n") - ((and (equal item-type "o") item-number) - (format "<ol>\n<li value=\"%s\">\n" item-number)) - ((equal item-type "o") "<ol>\n<li>\n") + ((equal item-type "o") + (progn + (message ordered-type) + (concat "<ol type=\"" + (cond + ((not starter) "1") + ((string-match "[0-9]+[.)]" ordered-type) "1") + ((string-match "[A-Z][.)]" ordered-type) "A") + ((string-match "[a-z][.)]" ordered-type) "a")) + "\"><li" + (if item-number (concat" value=\"" item-number "\">\n") + ">\n")))) ((equal item-type "d") (format "<dl>\n<dt>%s</dt><dd>\n" item-tag)))) (push item-type local-list-type) diff --git a/lisp/org-latex.el b/lisp/org-latex.el index 966c3b7..6370727 100644 --- a/lisp/org-latex.el +++ b/lisp/org-latex.el @@ -2370,7 +2370,7 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER." "Convert plain text lists in current buffer into LaTeX lists." (let (res) (goto-char (point-min)) - (while (org-search-forward-unenclosed org-item-beginning-re nil t) + (while (org-search-forward-unenclosed (org-item-beginning-re) nil t) (beginning-of-line) (setq res (org-list-to-latex (org-list-parse-list t) org-export-latex-list-parameters)) diff --git a/lisp/org-list.el b/lisp/org-list.el index abbaa5f..77f9146 100644 --- a/lisp/org-list.el +++ b/lisp/org-list.el @@ -240,6 +240,11 @@ with the word \"recursive\" in the value." :group 'org-plain-lists :type 'boolean) +(defcustom org-alphabetical-lists nil + "Non-nil means alphabetical lists are activated." + :group 'org-plain-lists + :type 'boolean) + (defcustom org-description-max-indent 20 "Maximum indentation for the second line of a description list. When the indentation would be larger than this, it will become @@ -288,16 +293,23 @@ It depends on `org-empty-line-terminates-plain-lists'." If GENERAL is non-nil, return the general regexp independent of the value of `org-plain-list-ordered-item-terminator'." (cond + ((and org-alphabetical-lists (or general (eq org-plain-list-ordered-item-terminator t))) + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\)[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + ((and org-alphabetical-lists (= org-plain-list-ordered-item-terminator ?.)) + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\)\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + ((and org-alphabetical-lists (= org-plain-list-ordered-item-terminator ?\))) + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\))\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") ((or general (eq org-plain-list-ordered-item-terminator t)) - "\\([ \t]*\\([-+]\\|\\([0-9]+[.)]\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\)[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") ((= org-plain-list-ordered-item-terminator ?.) - "\\([ \t]*\\([-+]\\|\\([0-9]+\\.\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+)\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") ((= org-plain-list-ordered-item-terminator ?\)) - "\\([ \t]*\\([-+]\\|\\([0-9]+)\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\))\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))) -(defconst org-item-beginning-re (concat "^" (org-item-re)) - "Regexp matching the beginning of a plain list item.") +(defun org-item-beginning-re () + "Regexp matching the beginning of a plain list item." + (concat "^" (org-item-re))) (defun org-list-ending-between (min max &optional firstp) "Find the position of a list ending between MIN and MAX, or nil. @@ -385,7 +397,7 @@ indented than the previous item within LIMIT." ;; Ensure there is at least an item above (up-item-p (save-excursion (org-search-backward-unenclosed - org-item-beginning-re limit t)))) + (org-item-beginning-re) limit t)))) (and up-item-p (catch 'exit (while t @@ -413,7 +425,7 @@ Argument LIMIT specifies the upper-bound of the search." ;; `org-item-re'. (last-item-start (save-excursion (org-search-backward-unenclosed - org-item-beginning-re limit t))) + (org-item-beginning-re) limit t))) (list-ender (org-list-ending-between last-item-start actual-pos))) ;; We are in a list when we are on an item line or when we can @@ -433,7 +445,7 @@ List ending is determined by regexp. See ;; Otherwise, go back to the heading above or bob. (goto-char (or (org-list-ending-between limit pos) limit)) ;; From there, search down our list. - (org-search-forward-unenclosed org-item-beginning-re pos t) + (org-search-forward-unenclosed (org-item-beginning-re) pos t) (point-at-bol)))) (defun org-list-bottom-point-with-regexp (limit) @@ -534,7 +546,7 @@ List ending is determined by the indentation of text. See (save-excursion (goto-char (match-end 0)) ;; Ignore counter if any - (when (looking-at "\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?") + (when (looking-at "\\(?:\\[@\\(?:start:\\)?\\(?:[0-9]+\\|[A-Za-z]\\)\\][ \t]*\\)?") (goto-char (match-end 0))) (looking-at regexp)))) @@ -549,7 +561,7 @@ uses PRE-MOVE before search. Return nil if no item was found." ;; We don't want to match the current line. (funcall pre-move) ;; Skip any sublist on the way - (while (and (funcall search-fun org-item-beginning-re limit t) + (while (and (funcall search-fun (org-item-beginning-re) limit t) (> (org-get-indentation) ind))) (when (and (/= (point-at-bol) start) ; Have we moved ? (= (org-get-indentation) ind)) @@ -610,7 +622,7 @@ function ends." (goto-char pos) ;; Is point in a special block? (when (org-in-regexps-block-p - "^[ \t]*#\\+\\(begin\\|BEGIN\\)_\\([a-zA-Z0-9_]+\\)" + "^[ \t]*#\\+\\(begin\\|BEGIN\\)_\\(\\(?:[a-zA-Z]\\|[0-9_]+\\)\\)" '(concat "^[ \t]*#\\+\\(end\\|END\\)_" (match-string 2))) (if (not (cdr (assq 'insert org-list-automatic-rules))) ;; Rule in `org-list-automatic-rules' forbids insertion. @@ -708,7 +720,7 @@ Return t if successful." (cond ((and regionp (goto-char rbeg) - (not (org-search-forward-unenclosed org-item-beginning-re rend t))) + (not (org-search-forward-unenclosed (org-item-beginning-re) rend t))) (error "No item in region")) ((not (org-at-item-p)) (error "Not on an item")) @@ -806,13 +818,13 @@ TOP is the position of list's top-item." (save-excursion (beginning-of-line) (let ((ind (org-get-indentation))) - (or (not (org-search-backward-unenclosed org-item-beginning-re top t)) + (or (not (org-search-backward-unenclosed (org-item-beginning-re) top t)) (< (org-get-indentation) ind))))) (defun org-at-item-p () "Is point in a line starting a hand-formatted item?" (save-excursion - (beginning-of-line) (looking-at org-item-beginning-re))) + (beginning-of-line) (looking-at (org-item-beginning-re)))) (defun org-at-item-bullet-p () "Is point at the bullet of a plain list item?" @@ -911,7 +923,7 @@ Assume point is in a list." (save-excursion ;; possibly match current line (end-of-line) - (org-search-backward-unenclosed org-item-beginning-re nil t) + (org-search-backward-unenclosed (org-item-beginning-re) nil t) (point-at-bol))) (defun org-beginning-of-item () @@ -947,7 +959,7 @@ BOTTOM is the position at list ending." (let ((ind (org-get-indentation))) (while (and (/= (point) bottom) (>= (org-get-indentation) ind)) - (org-search-forward-unenclosed org-item-beginning-re bottom 'move)) + (org-search-forward-unenclosed (org-item-beginning-re) bottom 'move)) (if (= (point) bottom) bottom (point-at-bol))))) (defun org-end-of-item-list () @@ -977,7 +989,7 @@ If the cursor is not in an item, throw an error." BOTTOM is the position at list ending." (end-of-line) (goto-char - (if (org-search-forward-unenclosed org-item-beginning-re bottom t) + (if (org-search-forward-unenclosed (org-item-beginning-re) bottom t) (point-at-bol) (org-get-end-of-item bottom)))) @@ -1139,11 +1151,11 @@ bullet string and bullet counter, if any." (list (point-at-bol) (org-get-indentation) (progn - (looking-at "^[ \t]*\\([-+*0-9.)]+[ \t]+\\)") + (looking-at "^[ \t]*\\([-+*0-9A-Za-z.)]+[ \t]+\\)") (match-string 1)) (progn (goto-char (match-end 0)) - (and (looking-at "\\[@\\(?:start:\\)?\\([0-9]+\\)\\]") + (and (looking-at "\\[@\\(?:start:\\)?\\(\\(?:[0-9]+\\|[A-Za-z]\\)\\)\\]") (match-string 1)))))) (defun org-list-struct (begin end top bottom &optional outdent) @@ -1172,7 +1184,7 @@ change is an outdent." (goto-char begin) ;; Find beginning of most outdented list (min list) (while (and (org-search-backward-unenclosed - org-item-beginning-re top t) + (org-item-beginning-re) top t) (>= (org-get-indentation) ind-min)) (setq pre-list (cons (org-list-struct-assoc-at-point) pre-list))) @@ -1186,7 +1198,7 @@ change is an outdent." (goto-char end) (end-of-line) (while (and (org-search-forward-unenclosed - org-item-beginning-re bottom 'move) + (org-item-beginning-re) bottom 'move) (>= (org-get-indentation) ind-min)) (setq post-list (cons (org-list-struct-assoc-at-point) post-list))) @@ -1195,13 +1207,13 @@ change is an outdent." (when (and (= (caar pre-list) 0) (< (point) bottom)) (beginning-of-line) (while (org-search-forward-unenclosed - org-item-beginning-re bottom t) + (org-item-beginning-re) bottom t) (setq post-list (cons (org-list-struct-assoc-at-point) post-list)))) (append pre-list struct (reverse post-list)))))) ;; Here we start: first get the core zone... (goto-char end) - (while (org-search-backward-unenclosed org-item-beginning-re begin t) + (while (org-search-backward-unenclosed (org-item-beginning-re) begin t) (setq struct (cons (org-list-struct-assoc-at-point) struct))) ;; ... then, extend it to make it a structure... (let ((extended (funcall extend struct))) @@ -1263,16 +1275,22 @@ This function modifies STRUCT." (let ((counter (nth 3 item)) (bullet (org-list-bullet-string (nth 2 item)))) (cond - ((and (string-match "[0-9]+" bullet) counter) + ((and (string-match "[0-9]+\\|[A-Za-z]" bullet) counter) (replace-match counter nil nil bullet)) ((string-match "[0-9]+" bullet) (replace-match "1" nil nil bullet)) + ((and (save-excursion (goto-char (nth 0 item)) + (org-list-can-be-alphabetical (caadr struct))) + (string-match "[A-Za-z]" bullet)) + (replace-match "a" nil nil bullet)) + ((string-match "[A-Za-z]" bullet) + (replace-match "1" nil nil bullet)) (t bullet))))) (set-bul (lambda (item bullet) (setcdr item (list (nth 1 item) bullet (nth 3 item))))) (get-bul (lambda (item bullet) (let* ((counter (nth 3 item))) - (if (and counter (string-match "[0-9]+" bullet)) + (if (and counter (string-match "[0-9]+\\|[A-Za-z]" bullet)) (replace-match counter nil nil bullet) bullet)))) (fix-bul @@ -1586,13 +1604,63 @@ It determines the number of whitespaces to append by looking at " "))) nil nil bullet 1))) +(defun org-increment-string (str cap) + "Increments str (a->a, b->b, z->aa, aa->ab etc). If cap is non-nil, then + the letters are capitalized." + (let ((res (org-convert-num-to-alpha-str + (1+ (org-convert-alpha-str-to-num str 1 (length str) cap)) cap)) + (z (if cap ?Z ?z)) + (b (if cap ?B ?b)) + (a (if cap ?A ?a))) + (if (and(= (string-to-char str) z) + (= (string-to-char res) b)) + (concat (if cap "A" "a") (substring res 1)) + (concat (make-string (- (length str) (length res)) a) res)))) + +(defun org-convert-alpha-str-to-num (str n pos cap) + "Converts the substring consisting of locations pos to pos-n to a + numeric representation." + (let ((a (if cap ?A ?a))) + (if (= pos 1) (* (- (string-to-char str) a) n) + (+ (* (- (nth (1- pos) (string-to-list str)) a) n) + (org-convert-alpha-str-to-num str (* 26 n) (1- pos) cap))))) + +(defun org-convert-num-to-alpha-str (n cap) + "Converts the number n to a alphabetical, base-26 representation." + (if (= n 0) "" + (concat (org-convert-num-to-alpha-str (/ n 26) cap) + (string (+ (if cap ?A ?a) (% n 26)))))) + +(defun org-list-can-be-alphabetical (item) + "Returns t if the list has only 26 elements." + (save-excursion + (goto-char (org-get-beginning-of-list item)) + (and org-alphabetical-lists + (let ((retn 1)) + (while (and + (< retn 27) + (org-get-next-item (point) (point-max))) + (setq retn (1+ retn)) + (goto-char (org-get-next-item (point) (point-max)))) + (<= retn 26))))) + (defun org-list-inc-bullet-maybe (bullet) "Increment BULLET if applicable." - (if (string-match "[0-9]+" bullet) + (let ((case-fold-search nil)) + (cond + ((string-match "[0-9]+" bullet) (replace-match (number-to-string (1+ (string-to-number (match-string 0 bullet)))) - nil nil bullet) - bullet)) + nil nil bullet)) + ((string-match "[a-z]" bullet) + (replace-match + (org-increment-string (match-string 0 bullet) nil) + nil nil bullet)) + ((string-match "[A-Z]" bullet) + (replace-match + (org-increment-string (match-string 0 bullet) t) + nil nil bullet)) + (t bullet)))) (defun org-list-repair (&optional force-bullet top bottom) "Make sure all items are correctly indented, with the right bullet. @@ -1633,15 +1701,29 @@ If WHICH is a valid string, use that as the new bullet. If WHICH is an integer, 0 means `-', 1 means `+' etc. If WHICH is 'previous, cycle backwards." (interactive "P") - (save-excursion (let* ((top (org-list-top-point)) - (bullet (progn + (alpha-possible (save-excursion + (goto-char top) + (and org-alphabetical-lists + (let ((retn 1)) + (condition-case nil + (progn (while (< retn 27) + (org-next-item) + (setq retn (1+ retn)) + nil)) + (error t)))))) + (bullet (save-excursion (goto-char (org-get-beginning-of-list top)) (org-get-bullet))) - (current (cond - ((string-match "\\." bullet) "1.") - ((string-match ")" bullet) "1)") - (t bullet))) + (current (let ((case-fold-search nil)) + (cond + ((string-match "[0-9]+\\." bullet) "1.") + ((string-match "[0-9]+)" bullet) "1)") + ((string-match "[a-z]\\." bullet) "a.") + ((string-match "[a-z])" bullet) "a)") + ((string-match "[A-Z]\\." bullet) "A.") + ((string-match "[A-Z])" bullet) "A)") + (t bullet)))) (bullet-rule-p (cdr (assq 'bullet org-list-automatic-rules))) (bullet-list (append '("-" "+" ) ;; *-bullets are not allowed at column 0 @@ -1649,11 +1731,21 @@ is an integer, 0 means `-', 1 means `+' etc. If WHICH is (looking-at "\\S-")) '("*")) ;; Description items cannot be numbered (unless (and bullet-rule-p + (or (eq org-plain-list-ordered-item-terminator ?.) + (org-at-item-description-p))) '("1)")) + (unless (and bullet-rule-p (or (eq org-plain-list-ordered-item-terminator ?\)) (org-at-item-description-p))) '("1.")) + (when (and org-alphabetical-lists alpha-possible) + (append (unless (and bullet-rule-p (or (eq org-plain-list-ordered-item-terminator ?.) - (org-at-item-description-p))) '("1)")))) + (org-at-item-description-p))) + '("A)" "a)")) + (unless (and bullet-rule-p + (or (eq org-plain-list-ordered-item-terminator ?\)) + (org-at-item-description-p))) + '("A." "a.")))))) (len (length bullet-list)) (item-index (- len (length (member current bullet-list)))) (get-value (lambda (index) (nth (mod index len) bullet-list))) @@ -1662,7 +1754,7 @@ is an integer, 0 means `-', 1 means `+' etc. If WHICH is ((numberp which) (funcall get-value which)) ((eq 'previous which) (funcall get-value (1- item-index))) (t (funcall get-value (1+ item-index)))))) - (org-list-repair new top)))) + (org-list-repair new top))) ;;; Checkboxes @@ -1689,7 +1781,7 @@ in subtree, ignoring drawers." (rend (region-end))) (save-excursion (goto-char rbeg) - (if (org-search-forward-unenclosed org-item-beginning-re rend 'move) + (if (org-search-forward-unenclosed (org-item-beginning-re) rend 'move) (list (point-at-bol) rend nil) (error "No item in region"))))) ((org-on-heading-p) @@ -1701,7 +1793,7 @@ in subtree, ignoring drawers." (goto-char limit) (org-search-backward-unenclosed ":END:" pos 'move) (org-search-forward-unenclosed - org-item-beginning-re limit 'move) + (org-item-beginning-re) limit 'move) (list (point) limit nil)))) ((org-at-item-p) (list (point-at-bol) (1+ (point-at-eol)) t)) @@ -1749,7 +1841,7 @@ in subtree, ignoring drawers." (goto-char beg) (while (< (point) end) (funcall act-on-item ref-presence ref-status) - (org-search-forward-unenclosed org-item-beginning-re end 'move))) + (org-search-forward-unenclosed (org-item-beginning-re) end 'move))) (org-update-checkbox-count-maybe))) (defun org-reset-checkbox-state-subtree () @@ -1858,7 +1950,7 @@ the whole buffer." (goto-char (or (org-get-next-item (point) lim) lim)) (end-of-line) (when (org-search-forward-unenclosed - org-item-beginning-re lim t) + (org-item-beginning-re) lim t) (beginning-of-line))) (setq next-ind (org-get-indentation))))) (goto-char continue-from) @@ -2031,10 +2123,10 @@ sublevels as a list of strings." (let* ((start (goto-char (org-list-top-point))) (end (org-list-bottom-point)) output itemsep ltype) - (while (org-search-forward-unenclosed org-item-beginning-re end t) + (while (org-search-forward-unenclosed (org-item-beginning-re) end t) (save-excursion (beginning-of-line) - (setq ltype (cond ((org-looking-at-p "^[ \t]*[0-9]") 'ordered) + (setq ltype (cond ((org-looking-at-p "^[ \t]*\\([0-9]+\\|[A-Za-z]\\)") 'ordered) ((org-at-item-description-p) 'descriptive) (t 'unordered)))) (let* ((indent1 (org-get-indentation)) @@ -2043,7 +2135,7 @@ sublevels as a list of strings." (org-end-of-item-or-at-child end)))) (nextindent (if (= (point) end) 0 (org-get-indentation))) (item (if (string-match - "^\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?\\[\\([xX ]\\)\\]" + "^\\(?:\\[@\\(?:start:\\)?\\(?:[0-9]+\\|[A-Za-z]\\)\\][ \t]*\\)?\\[\\([xX ]\\)\\]" item) (replace-match (if (equal (match-string 1 item) " ") "CBOFF" @@ -2128,7 +2220,7 @@ this list." (top-point (progn (re-search-backward "#\\+ORGLST" nil t) - (re-search-forward org-item-beginning-re bottom-point t) + (re-search-forward (org-item-beginning-re) bottom-point t) (match-beginning 0))) (list (save-restriction (narrow-to-region top-point bottom-point) -- 1.7.2.3.msysgit.0 [-- Attachment #3: Type: text/plain, Size: 201 bytes --] _______________________________________________ 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 ^ permalink raw reply related [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-12-11 2:41 ` Nathaniel Flath @ 2010-12-20 18:25 ` Nicolas Goaziou 2011-01-12 20:05 ` Nathaniel Flath 0 siblings, 1 reply; 41+ messages in thread From: Nicolas Goaziou @ 2010-12-20 18:25 UTC (permalink / raw) To: Nathaniel Flath Cc: Bernt Hansen, Jacob Mitchell, org-mode List, Carsten Dominik Hello, >>>>> Nathaniel Flath writes: > Sory for the long delay - I got caught up in other work. A > patchaddressing the sisues brought up is attached. I've had a look at your patch. I think the modifications to HTML and DocBook exporters are nice. It could be possible to do the same thing in LaTeX, but it would require yet another package (enumitem) by default. Anyway, here are the code comments : - in your patch, you should try to list modifications to the functions, and which functions were created. For example : * org-list.el (org-alphabetical-lists): new variable (org-cycle-list-bullet): added "A)" "a)" "A." and "a." to the list of bullets in cycle. None of them is allowed in a description list. - The "yes" at the beginning of org-docbook.el should be removed - I advise against using (org-next-item) programmatically. It means you compute the structure associated to the list for each item in the list. I left a note about this circa line 847 in org-list.el - There's a bug with the following situation : A) test B) tersi C) teirsu D) tersiu E) tesiu F) teisru G) etisu - sub-item 1 - sub-item 2 - sub-item 3 - sub-item 4 H) tesinu I) tesinru J) etnrsiu K) tesriun L) etnsiu M) estinu N) etsniu O) etsinu P) tesnu Q) etsinu R) etsiun S) etsnriu T) etsnriu U) etsinu V) etsiu W) etinrsu X) last item If you outdent sub-items 2 to 4 at the same time (with a region), bullet of the last item will become "AA)" and will not be recognized as a list item anymore. - There's also a bug with counters: * [0/0] Counter A. [X] first box B. [X] second box These boxes are not counted when bullets are literals (try C-c #). HTH, Regards, -- Nicolas ^ permalink raw reply [flat|nested] 41+ messages in thread
* Re: Re: [PATCH] Alphabetical ordered lists 2010-12-20 18:25 ` Nicolas Goaziou @ 2011-01-12 20:05 ` Nathaniel Flath 0 siblings, 0 replies; 41+ messages in thread From: Nathaniel Flath @ 2011-01-12 20:05 UTC (permalink / raw) To: Nicolas Goaziou Cc: Bernt Hansen, Jacob Mitchell, org-mode List, Carsten Dominik [-- Attachment #1: Type: text/plain, Size: 2075 bytes --] Updated patch attached. Thanks, Nathaniel Flath On Mon, Dec 20, 2010 at 10:25 AM, Nicolas Goaziou <n.goaziou@gmail.com> wrote: > Hello, > >>>>>> Nathaniel Flath writes: > >> Sory for the long delay - I got caught up in other work. A >> patchaddressing the sisues brought up is attached. > > I've had a look at your patch. > > I think the modifications to HTML and DocBook exporters are nice. It > could be possible to do the same thing in LaTeX, but it would require > yet another package (enumitem) by default. Anyway, here are the code > comments : > > - in your patch, you should try to list modifications to the > functions, and which functions were created. For example : > > * org-list.el (org-alphabetical-lists): new variable > (org-cycle-list-bullet): added "A)" "a)" "A." and "a." to the list > of bullets in cycle. None of them is allowed in a description list. > > - The "yes" at the beginning of org-docbook.el should be removed > > - I advise against using (org-next-item) programmatically. It means > you compute the structure associated to the list for each item in > the list. I left a note about this circa line 847 in org-list.el > > - There's a bug with the following situation : > > A) test > B) tersi > C) teirsu > D) tersiu > E) tesiu > F) teisru > G) etisu > - sub-item 1 > - sub-item 2 > - sub-item 3 > - sub-item 4 > H) tesinu > I) tesinru > J) etnrsiu > K) tesriun > L) etnsiu > M) estinu > N) etsniu > O) etsinu > P) tesnu > Q) etsinu > R) etsiun > S) etsnriu > T) etsnriu > U) etsinu > V) etsiu > W) etinrsu > X) last item > > If you outdent sub-items 2 to 4 at the same time (with a region), > bullet of the last item will become "AA)" and will not be recognized > as a list item anymore. > > - There's also a bug with counters: > > * [0/0] Counter > > A. [X] first box > B. [X] second box > > These boxes are not counted when bullets are literals (try C-c #). > > > HTH, > > Regards, > > -- Nicolas > [-- Attachment #2: 0001-Added-support-for-alphabetical-patches-to-org-list.patch --] [-- Type: application/octet-stream, Size: 33155 bytes --] From 11a5b944d6475f150333502a15ede70ce71807af Mon Sep 17 00:00:00 2001 From: Nathaniel Flath <flat0103@gmail.com> Date: Wed, 12 Jan 2011 11:52:32 -0800 Subject: [PATCH] Added support for alphabetical patches to org-list. Support can be enabled with the 'org-alphabetical-lists' variable, and the numeration goes from 'a' to 'z'. The latex, html, and docbook exporters have been updated to use these. * org-capture.el: (org-capture-place-item): changed use of variable org-item-beginning-re to be a function call. * org-docbook.el: (org-export-as-docbook): changed to export alphabetical lists * org-exp.el: (org-export-mark-list-ending): changed variable use of org-item-beginning-re to be function call. * org-html.el: (org-export-as-html): changed to export alphabetical lists * org-latex.el: (org-export-latex-lists): changed variable use of org-item-beginning-re to be a function call. * org-list.el: org-alphabetical-lists: new variable to control whether to use alphabetical lists(defaults nil) (org-item-re): converted to use correct regex for alphabetical lists if enabled (org-item-beginning-re): converted from a variable to a function (org-list-in-item-p-with-indent), (org-toggle-checkbox),(org-list-in-item-p-with-regexp), (org-list-top-point-with-regexp), (org-list-struct), (org-list-get-item-same-level), (org-get-item-beginning), (org-end-of-item-or-at-child), (org-list-first-item-p), (org-list-indent-item-generic): converted use of org-item-beginning-re to a function (org-list-at-regexp-after-bullet-p), (org-update-checkbox-count), (org-list-parse-list), (org-list-insert-item-generic), org-list-struct-assoc-at-point), (org-list-struct-fix-bul): corrected regexp to allow for alphabetical lists (org-increment-string), (org--convert-alpha-str-to-num), (org-convert-num-toalpha-str): new functions used to increment a bullet in an alphabetical list (org-list-can-be-alphabetical): new function that returns 't' if a list can be alphabetical( <27 items) (org-list-bullet-inc-maybe): modified to support alphabetical bullets as well as numeric ones (org-cycle-list-bullet): modified to also cycle into both capital and lowercas alphabetical bullets, if possible --- lisp/org-capture.el | 4 +- lisp/org-docbook.el | 21 +++- lisp/org-exp.el | 2 +- lisp/org-html.el | 24 ++++-- lisp/org-latex.el | 2 +- lisp/org-list.el | 262 +++++++++++++++++++++++++++++++++------------------ 6 files changed, 208 insertions(+), 107 deletions(-) diff --git a/lisp/org-capture.el b/lisp/org-capture.el index a28c3b8..462f3c9 100644 --- a/lisp/org-capture.el +++ b/lisp/org-capture.el @@ -815,14 +815,14 @@ already gone. Any prefix argument will be passed to the refile comand." (if (org-capture-get :prepend) (progn (goto-char beg) - (if (org-search-forward-unenclosed org-item-beginning-re end t) + (if (org-search-forward-unenclosed (org-item-beginning-re) end t) (progn (goto-char (match-beginning 0)) (setq ind (org-get-indentation))) (goto-char end) (setq ind 0))) (goto-char end) - (if (org-search-backward-unenclosed org-item-beginning-re beg t) + (if (org-search-backward-unenclosed (org-item-beginning-re) beg t) (progn (setq ind (org-get-indentation)) (org-end-of-item)) diff --git a/lisp/org-docbook.el b/lisp/org-docbook.el index ed835b0..a636dba 100644 --- a/lisp/org-docbook.el +++ b/lisp/org-docbook.el @@ -1012,14 +1012,15 @@ publishing directory." ;; Normal lines (when (string-match (cond - ((eq llt t) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+[.)]\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") - ((= llt ?.) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+\\.\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") - ((= llt ?\)) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+)\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((eq llt t) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\)[.)]\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((= llt ?.) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\)\\.\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((= llt ?\)) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\))\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") (t (error "Invalid value of `org-plain-list-ordered-item-terminator'"))) line) (setq ind (or (get-text-property 0 'original-indentation line) (org-get-string-indentation line)) item-type (if (match-beginning 4) "o" "u") + ordered-type (match-string 2 line) starter (if (match-beginning 2) (substring (match-string 2 line) 0 -1)) line (substring line (match-beginning 5)) @@ -1040,7 +1041,7 @@ publishing directory." (org-export-docbook-close-para-maybe) (insert (cond ((equal item-type "u") "<itemizedlist>\n<listitem>\n") - ((and (equal item-type "o") item-number) + ((equal item-type "o") ;; Check for a specific start number. If it ;; is specified, we use the ``override'' ;; attribute of element <listitem> to pass the @@ -1048,8 +1049,16 @@ publishing directory." ;; ``startingnumber'' attribute of element ;; <orderedlist>, but the former works on both ;; DocBook 5.0 and prior versions. - (format "<orderedlist>\n<listitem override=\"%s\">\n" item-number)) - ((equal item-type "o") "<orderedlist>\n<listitem>\n") + (progn + (concat "<orderedlist numeration=\"" + (cond + ((not starter) "arabic") + ((string-match "[0-9]+[.)]" ordered-type) "arabic") + ((string-match "[A-Z][.)]" ordered-type) "upperalpha") + ((string-match "[a-z][.)]" ordered-type) "loweralpha")) + "\">\n<listitem" + (if item-number (concat " override=\"" item-number "\">\n") + ">\n")))) ((equal item-type "d") (format "<variablelist>\n<varlistentry><term>%s</term><listitem>\n" item-tag)))) ;; For DocBook, we need to open a para right after tag diff --git a/lisp/org-exp.el b/lisp/org-exp.el index 3d466fa..680587b 100644 --- a/lisp/org-exp.el +++ b/lisp/org-exp.el @@ -1664,7 +1664,7 @@ These special cookies will later be interpreted by the backend. (let ((process-buffer (lambda (end-list-marker) (goto-char (point-min)) - (while (org-search-forward-unenclosed org-item-beginning-re nil t) + (while (org-search-forward-unenclosed (org-item-beginning-re) nil t) (goto-char (org-list-bottom-point)) (when (and (not (eq org-list-ending-method 'indent)) (looking-at (org-list-end-re))) diff --git a/lisp/org-html.el b/lisp/org-html.el index 312e716..be1d760 100644 --- a/lisp/org-html.el +++ b/lisp/org-html.el @@ -1553,20 +1553,21 @@ lang=\"%s\" xml:lang=\"%s\"> ;; Normal lines (when (string-match (cond - ((eq llt t) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+[.)]\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") - ((= llt ?.) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+\\.\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") - ((= llt ?\)) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\([0-9]+)\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((eq llt t) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\)[.)]\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((= llt ?.) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\)\\.\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") + ((= llt ?\)) "^\\([ \t]*\\)\\(\\([-+*] \\)\\|\\(\\(?:[0-9]+\\|[a-zA-Z]\\))\\) \\)?\\( *[^ \t\n\r]\\|[ \t]*$\\)") (t (error "Invalid value of `org-plain-list-ordered-item-terminator'"))) line) (setq ind (or (get-text-property 0 'original-indentation line) (org-get-string-indentation line)) item-type (if (match-beginning 4) "o" "u") + ordered-type (match-string 2 line) starter (if (match-beginning 2) (substring (match-string 2 line) 0 -1)) line (substring line (match-beginning 5)) item-number nil item-tag nil) - (if (string-match "\\[@\\(?:start:\\)?\\([0-9]+\\)\\][ \t]?" line) + (if (string-match "\\[@\\(?:start:\\)?\\([0-9]+\\|[a-zA-Z]\\)\\][ \t]?" line) (setq item-number (match-string 1 line) line (replace-match "" t t line))) (if (and starter (string-match "\\(.*?\\) ::[ \t]*" line)) @@ -1581,9 +1582,18 @@ lang=\"%s\" xml:lang=\"%s\"> (org-close-par-maybe) (insert (cond ((equal item-type "u") "<ul>\n<li>\n") - ((and (equal item-type "o") item-number) - (format "<ol>\n<li value=\"%s\">\n" item-number)) - ((equal item-type "o") "<ol>\n<li>\n") + ((equal item-type "o") + (progn + (message ordered-type) + (concat "<ol type=\"" + (cond + ((not starter) "1") + ((string-match "[0-9]+[.)]" ordered-type) "1") + ((string-match "[A-Z][.)]" ordered-type) "A") + ((string-match "[a-z][.)]" ordered-type) "a")) + "\"><li" + (if item-number (concat" value=\"" item-number "\">\n") + ">\n")))) ((equal item-type "d") (format "<dl>\n<dt>%s</dt><dd>\n" item-tag)))) (push item-type local-list-type) diff --git a/lisp/org-latex.el b/lisp/org-latex.el index 4085d6e..58feede 100644 --- a/lisp/org-latex.el +++ b/lisp/org-latex.el @@ -2385,7 +2385,7 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER." "Convert plain text lists in current buffer into LaTeX lists." (let (res) (goto-char (point-min)) - (while (org-search-forward-unenclosed org-item-beginning-re nil t) + (while (org-search-forward-unenclosed (org-item-beginning-re) nil t) (beginning-of-line) (setq res (org-list-to-latex (org-list-parse-list t) org-export-latex-list-parameters)) diff --git a/lisp/org-list.el b/lisp/org-list.el index bc8e7bd..b4eb60d 100644 --- a/lisp/org-list.el +++ b/lisp/org-list.el @@ -221,16 +221,16 @@ indent when non-nil, indenting or outdenting list top-item insert when non-nil, trying to insert an item inside a block will insert it right before the block instead of throwing an error." - :group 'org-plain-lists - :type '(alist :tag "Sets of rules" - :key-type - (choice - (const :tag "Bullet" bullet) - (const :tag "Checkbox" checkbox) - (const :tag "Indent" indent) - (const :tag "Insert" insert)) - :value-type - (boolean :tag "Activate" :value t))) + :group 'org-plain-lists + :type '(alist :tag "Sets of rules" + :key-type + (choice + (const :tag "Bullet" bullet) + (const :tag "Checkbox" checkbox) + (const :tag "Indent" indent) + (const :tag "Insert" insert)) + :value-type + (boolean :tag "Activate" :value t))) (defcustom org-hierarchical-checkbox-statistics t "Non-nil means checkbox statistics counts only the state of direct children. @@ -240,6 +240,11 @@ with the word \"recursive\" in the value." :group 'org-plain-lists :type 'boolean) +(defcustom org-alphabetical-lists nil + "Non-nil means alphabetical lists are activated." + :group 'org-plain-lists + :type 'boolean) + (defcustom org-description-max-indent 20 "Maximum indentation for the second line of a description list. When the indentation would be larger than this, it will become @@ -288,16 +293,23 @@ It depends on `org-empty-line-terminates-plain-lists'." If GENERAL is non-nil, return the general regexp independent of the value of `org-plain-list-ordered-item-terminator'." (cond + ((and org-alphabetical-lists (or general (eq org-plain-list-ordered-item-terminator t))) + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\)[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + ((and org-alphabetical-lists (= org-plain-list-ordered-item-terminator ?.)) + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\)\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + ((and org-alphabetical-lists (= org-plain-list-ordered-item-terminator ?\))) + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\|[A-Za-z]\\))\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") ((or general (eq org-plain-list-ordered-item-terminator t)) - "\\([ \t]*\\([-+]\\|\\([0-9]+[.)]\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\)[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") ((= org-plain-list-ordered-item-terminator ?.) - "\\([ \t]*\\([-+]\\|\\([0-9]+\\.\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+)\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") ((= org-plain-list-ordered-item-terminator ?\)) - "\\([ \t]*\\([-+]\\|\\([0-9]+)\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") + "\\([ \t]*\\([-+]\\|\\(\\([0-9]+\\))\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))) -(defconst org-item-beginning-re (concat "^" (org-item-re)) - "Regexp matching the beginning of a plain list item.") +(defun org-item-beginning-re () + "Regexp matching the beginning of a plain list item." + (concat "^" (org-item-re))) (defun org-list-ending-between (min max &optional firstp) "Find the position of a list ending between MIN and MAX, or nil. @@ -327,11 +339,11 @@ stopping at LIMIT." (save-match-data (let ((case-fold-search t) (boundary (if (eq search 're-search-forward) 3 5))) - (when (save-excursion - (and (funcall search "^[ \t]*#\\+\\(begin\\|end\\)_" limit t) - (= (length (match-string 1)) boundary))) - ;; We're in a block: get out of it - (goto-char (match-beginning 0)))))) + (when (save-excursion + (and (funcall search "^[ \t]*#\\+\\(begin\\|end\\)_" limit t) + (= (length (match-string 1)) boundary))) + ;; We're in a block: get out of it + (goto-char (match-beginning 0)))))) (defun org-list-search-unenclosed-generic (search re bound noerr) "Search a string outside blocks and protected places. @@ -385,7 +397,7 @@ indented than the previous item within LIMIT." ;; Ensure there is at least an item above (up-item-p (save-excursion (org-search-backward-unenclosed - org-item-beginning-re limit t)))) + (org-item-beginning-re) limit t)))) (and up-item-p (catch 'exit (while t @@ -413,7 +425,7 @@ Argument LIMIT specifies the upper-bound of the search." ;; `org-item-re'. (last-item-start (save-excursion (org-search-backward-unenclosed - org-item-beginning-re limit t))) + (org-item-beginning-re) limit t))) (list-ender (org-list-ending-between last-item-start actual-pos))) ;; We are in a list when we are on an item line or when we can @@ -433,7 +445,7 @@ List ending is determined by regexp. See ;; Otherwise, go back to the heading above or bob. (goto-char (or (org-list-ending-between limit pos) limit)) ;; From there, search down our list. - (org-search-forward-unenclosed org-item-beginning-re pos t) + (org-search-forward-unenclosed (org-item-beginning-re) pos t) (point-at-bol)))) (defun org-list-bottom-point-with-regexp (limit) @@ -536,8 +548,8 @@ List ending is determined by the indentation of text. See (save-excursion (goto-char (match-end 0)) ;; Ignore counter if any - (when (looking-at "\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?") - (goto-char (match-end 0))) + (when (looking-at "\\(?:\\[@\\(?:start:\\)?\\(?:[0-9]+\\|[A-Za-z]\\)\\][ \t]*\\)?") + (goto-char (match-end 0))) (looking-at regexp)))) (defun org-list-get-item-same-level (search-fun pos limit pre-move) @@ -551,7 +563,7 @@ uses PRE-MOVE before search. Return nil if no item was found." ;; We don't want to match the current line. (funcall pre-move) ;; Skip any sublist on the way - (while (and (funcall search-fun org-item-beginning-re limit t) + (while (and (funcall search-fun (org-item-beginning-re) limit t) (> (org-get-indentation) ind))) (when (and (/= (point-at-bol) start) ; Have we moved ? (= (org-get-indentation) ind)) @@ -612,7 +624,7 @@ function ends." (goto-char pos) ;; Is point in a special block? (when (org-in-regexps-block-p - "^[ \t]*#\\+\\(begin\\|BEGIN\\)_\\([a-zA-Z0-9_]+\\)" + "^[ \t]*#\\+\\(begin\\|BEGIN\\)_\\(\\(?:[a-zA-Z]\\|[0-9_]+\\)\\)" '(concat "^[ \t]*#\\+\\(end\\|END\\)_" (match-string 2))) (if (not (cdr (assq 'insert org-list-automatic-rules))) ;; Rule in `org-list-automatic-rules' forbids insertion. @@ -655,9 +667,9 @@ function ends." (org-list-exchange-items (org-get-item-beginning) (org-get-next-item (point) bottom) bottom) - ;; recompute next-item: last sexp modified list - (goto-char (org-get-next-item (point) bottom)) - (org-move-to-column col))) + ;; recompute next-item: last sexp modified list + (goto-char (org-get-next-item (point) bottom)) + (org-move-to-column col))) ;; checkbox update might modify bottom point, so use a ;; marker here (setq bottom (copy-marker bottom)) @@ -710,7 +722,7 @@ Return t if successful." (cond ((and regionp (goto-char rbeg) - (not (org-search-forward-unenclosed org-item-beginning-re rend t))) + (not (org-search-forward-unenclosed (org-item-beginning-re) rend t))) (error "No item in region")) ((not (org-at-item-p)) (error "Not on an item")) @@ -808,13 +820,13 @@ TOP is the position of list's top-item." (save-excursion (beginning-of-line) (let ((ind (org-get-indentation))) - (or (not (org-search-backward-unenclosed org-item-beginning-re top t)) + (or (not (org-search-backward-unenclosed (org-item-beginning-re) top t)) (< (org-get-indentation) ind))))) (defun org-at-item-p () "Is point in a line starting a hand-formatted item?" (save-excursion - (beginning-of-line) (looking-at org-item-beginning-re))) + (beginning-of-line) (looking-at (org-item-beginning-re)))) (defun org-at-item-bullet-p () "Is point at the bullet of a plain list item?" @@ -913,7 +925,7 @@ Assume point is in a list." (save-excursion ;; possibly match current line (end-of-line) - (org-search-backward-unenclosed org-item-beginning-re nil t) + (org-search-backward-unenclosed (org-item-beginning-re) nil t) (point-at-bol))) (defun org-beginning-of-item () @@ -949,7 +961,7 @@ BOTTOM is the position at list ending." (let ((ind (org-get-indentation))) (while (and (/= (point) bottom) (>= (org-get-indentation) ind)) - (org-search-forward-unenclosed org-item-beginning-re bottom 'move)) + (org-search-forward-unenclosed (org-item-beginning-re) bottom 'move)) (if (= (point) bottom) bottom (point-at-bol))))) (defun org-end-of-item-list () @@ -979,7 +991,7 @@ If the cursor is not in an item, throw an error." BOTTOM is the position at list ending." (end-of-line) (goto-char - (if (org-search-forward-unenclosed org-item-beginning-re bottom t) + (if (org-search-forward-unenclosed (org-item-beginning-re) bottom t) (point-at-bol) (org-get-end-of-item bottom)))) @@ -1141,11 +1153,11 @@ bullet string and bullet counter, if any." (list (point-at-bol) (org-get-indentation) (progn - (looking-at "^[ \t]*\\([-+*0-9.)]+[ \t]+\\)") + (looking-at "^[ \t]*\\([-+*0-9A-Za-z.)]+[ \t]+\\)") (match-string 1)) (progn (goto-char (match-end 0)) - (and (looking-at "\\[@\\(?:start:\\)?\\([0-9]+\\)\\]") + (and (looking-at "\\[@\\(?:start:\\)?\\(\\(?:[0-9]+\\|[A-Za-z]\\)\\)\\]") (match-string 1)))))) (defun org-list-struct (begin end top bottom &optional outdent) @@ -1174,7 +1186,7 @@ change is an outdent." (goto-char begin) ;; Find beginning of most outdented list (min list) (while (and (org-search-backward-unenclosed - org-item-beginning-re top t) + (org-item-beginning-re) top t) (>= (org-get-indentation) ind-min)) (setq pre-list (cons (org-list-struct-assoc-at-point) pre-list))) @@ -1188,7 +1200,7 @@ change is an outdent." (goto-char end) (end-of-line) (while (and (org-search-forward-unenclosed - org-item-beginning-re bottom 'move) + (org-item-beginning-re) bottom 'move) (>= (org-get-indentation) ind-min)) (setq post-list (cons (org-list-struct-assoc-at-point) post-list))) @@ -1197,13 +1209,13 @@ change is an outdent." (when (and (= (caar pre-list) 0) (< (point) bottom)) (beginning-of-line) (while (org-search-forward-unenclosed - org-item-beginning-re bottom t) + (org-item-beginning-re) bottom t) (setq post-list (cons (org-list-struct-assoc-at-point) post-list)))) (append pre-list struct (reverse post-list)))))) ;; Here we start: first get the core zone... (goto-char end) - (while (org-search-backward-unenclosed org-item-beginning-re begin t) + (while (org-search-backward-unenclosed (org-item-beginning-re) begin t) (setq struct (cons (org-list-struct-assoc-at-point) struct))) ;; ... then, extend it to make it a structure... (let ((extended (funcall extend struct))) @@ -1247,7 +1259,7 @@ STRUCT is the list's structure looked up." "Return parent association of ITEM in STRUCT or nil. ORIGINS is the alist of parents. See `org-list-struct-origins'." (let* ((parent-pos (cdr (assq (car item) origins)))) - (when (> parent-pos 0) (assq parent-pos struct)))) + (when (and parent-pos (> parent-pos 0)) (assq parent-pos struct)))) (defun org-list-struct-get-child (item struct) "Return child association of ITEM in STRUCT or nil." @@ -1260,21 +1272,27 @@ ORIGINS is the alist of parents. See `org-list-struct-origins'." ORIGINS is the alist of parents. See `org-list-struct-origins'. This function modifies STRUCT." + (let* (acc (init-bul (lambda (item) (let ((counter (nth 3 item)) (bullet (org-list-bullet-string (nth 2 item)))) (cond - ((and (string-match "[0-9]+" bullet) counter) + ((and (string-match "[0-9]+\\|[A-Za-z]" bullet) counter) (replace-match counter nil nil bullet)) ((string-match "[0-9]+" bullet) (replace-match "1" nil nil bullet)) + ((and (org-list-can-be-alphabetical origins) + (string-match "[A-Za-z]" bullet)) + (replace-match "a" nil nil bullet)) + ((string-match "[A-Za-z]" bullet) + (replace-match "1" nil nil bullet)) (t bullet))))) (set-bul (lambda (item bullet) (setcdr item (list (nth 1 item) bullet (nth 3 item))))) (get-bul (lambda (item bullet) (let* ((counter (nth 3 item))) - (if (and counter (string-match "[0-9]+" bullet)) + (if (and counter (string-match "[0-9]+\\|[A-Za-z]" bullet)) (replace-match counter nil nil bullet) bullet)))) (fix-bul @@ -1588,13 +1606,60 @@ It determines the number of whitespaces to append by looking at " "))) nil nil bullet 1))) +(defun org-increment-string (str cap) + "Increments str (a->a, b->b, z->aa, aa->ab etc). If cap is non-nil, then + the letters are capitalized." + (let ((res (org-convert-num-to-alpha-str + (1+ (org-convert-alpha-str-to-num str 1 (length str) cap)) cap)) + (z (if cap ?Z ?z)) + (b (if cap ?B ?b)) + (a (if cap ?A ?a))) + (if (and(= (string-to-char str) z) + (= (string-to-char res) b)) + (concat (if cap "A" "a") (substring res 1)) + (concat (make-string (- (length str) (length res)) a) res)))) + +(defun org-convert-alpha-str-to-num (str n pos cap) + "Converts the substring consisting of locations pos to pos-n to a + numeric representation." + (let ((a (if cap ?A ?a))) + (if (= pos 1) (* (- (string-to-char str) a) n) + (+ (* (- (nth (1- pos) (string-to-list str)) a) n) + (org-convert-alpha-str-to-num str (* 26 n) (1- pos) cap))))) + +(defun org-convert-num-to-alpha-str (n cap) + "Converts the number n to a alphabetical, base-26 representation." + (if (= n 0) "" + (concat (org-convert-num-to-alpha-str (/ n 26) cap) + (string (+ (if cap ?A ?a) (% n 26)))))) + +(defun org-list-can-be-alphabetical (origins) + "Returns t if the list has only 26 elements." + (let ((retn 1) + (tmp origins)) + (while (and (cdr tmp) (< retn 28)) + (when (= 0 (cdr (car tmp))) + (setq retn (1+ retn))) + (setq tmp (cdr tmp))) + (< retn 28))) + (defun org-list-inc-bullet-maybe (bullet) "Increment BULLET if applicable." - (if (string-match "[0-9]+" bullet) + (let ((case-fold-search nil)) + (cond + ((string-match "[0-9]+" bullet) (replace-match (number-to-string (1+ (string-to-number (match-string 0 bullet)))) - nil nil bullet) - bullet)) + nil nil bullet)) + ((string-match "[a-z]" bullet) + (replace-match + (org-increment-string (match-string 0 bullet) nil) + nil nil bullet)) + ((string-match "[A-Z]" bullet) + (replace-match + (org-increment-string (match-string 0 bullet) t) + nil nil bullet)) + (t bullet)))) (defun org-list-repair (&optional force-bullet top bottom) "Make sure all items are correctly indented, with the right bullet. @@ -1635,36 +1700,52 @@ If WHICH is a valid string, use that as the new bullet. If WHICH is an integer, 0 means `-', 1 means `+' etc. If WHICH is 'previous, cycle backwards." (interactive "P") - (save-excursion - (let* ((top (org-list-top-point)) - (bullet (progn - (goto-char (org-get-beginning-of-list top)) - (org-get-bullet))) - (current (cond - ((string-match "\\." bullet) "1.") - ((string-match ")" bullet) "1)") - (t bullet))) - (bullet-rule-p (cdr (assq 'bullet org-list-automatic-rules))) - (bullet-list (append '("-" "+" ) - ;; *-bullets are not allowed at column 0 - (unless (and bullet-rule-p - (looking-at "\\S-")) '("*")) - ;; Description items cannot be numbered - (unless (and bullet-rule-p - (or (eq org-plain-list-ordered-item-terminator ?\)) - (org-at-item-description-p))) '("1.")) - (unless (and bullet-rule-p - (or (eq org-plain-list-ordered-item-terminator ?.) - (org-at-item-description-p))) '("1)")))) - (len (length bullet-list)) - (item-index (- len (length (member current bullet-list)))) - (get-value (lambda (index) (nth (mod index len) bullet-list))) - (new (cond - ((member which bullet-list) which) - ((numberp which) (funcall get-value which)) - ((eq 'previous which) (funcall get-value (1- item-index))) - (t (funcall get-value (1+ item-index)))))) - (org-list-repair new top)))) + (let* ((top (org-list-top-point)) + (list (progn (save-excursion (goto-char top) (org-list-parse-list)))) + (alpha-possible (org-list-can-be-alphabetical (org-list-struct-origins list))) + (bullet (save-excursion + (goto-char (org-get-beginning-of-list top)) + (org-get-bullet))) + (current (let ((case-fold-search nil)) + (cond + ((string-match "[0-9]+\\." bullet) "1.") + ((string-match "[0-9]+)" bullet) "1)") + ((string-match "[a-z]\\." bullet) "a.") + ((string-match "[a-z])" bullet) "a)") + ((string-match "[A-Z]\\." bullet) "A.") + ((string-match "[A-Z])" bullet) "A)") + (t bullet)))) + (bullet-rule-p (cdr (assq 'bullet org-list-automatic-rules))) + (bullet-list (append '("-" "+" ) + ;; *-bullets are not allowed at column 0 + (unless (and bullet-rule-p + (looking-at "\\S-")) '("*")) + ;; Description items cannot be numbered + (unless (and bullet-rule-p + (or (eq org-plain-list-ordered-item-terminator ?.) + (org-at-item-description-p))) '("1)")) + (unless (and bullet-rule-p + (or (eq org-plain-list-ordered-item-terminator ?\)) + (org-at-item-description-p))) '("1.")) + (when (and org-alphabetical-lists alpha-possible) + (append + (unless (and bullet-rule-p + (or (eq org-plain-list-ordered-item-terminator ?.) + (org-at-item-description-p))) + '("A)" "a)")) + (unless (and bullet-rule-p + (or (eq org-plain-list-ordered-item-terminator ?\)) + (org-at-item-description-p))) + '("A." "a.")))))) + (len (length bullet-list)) + (item-index (- len (length (member current bullet-list)))) + (get-value (lambda (index) (nth (mod index len) bullet-list))) + (new (cond + ((member which bullet-list) which) + ((numberp which) (funcall get-value which)) + ((eq 'previous which) (funcall get-value (1- item-index))) + (t (funcall get-value (1+ item-index)))))) + (org-list-repair new top))) ;;; Checkboxes @@ -1691,7 +1772,7 @@ in subtree, ignoring drawers." (rend (region-end))) (save-excursion (goto-char rbeg) - (if (org-search-forward-unenclosed org-item-beginning-re rend 'move) + (if (org-search-forward-unenclosed (org-item-beginning-re) rend 'move) (list (point-at-bol) rend nil) (error "No item in region"))))) ((org-on-heading-p) @@ -1703,7 +1784,7 @@ in subtree, ignoring drawers." (goto-char limit) (org-search-backward-unenclosed ":END:" pos 'move) (org-search-forward-unenclosed - org-item-beginning-re limit 'move) + (org-item-beginning-re) limit 'move) (list (point) limit nil)))) ((org-at-item-p) (list (point-at-bol) (1+ (point-at-eol)) t)) @@ -1751,7 +1832,7 @@ in subtree, ignoring drawers." (goto-char beg) (while (< (point) end) (funcall act-on-item ref-presence ref-status) - (org-search-forward-unenclosed org-item-beginning-re end 'move))) + (org-search-forward-unenclosed (org-item-beginning-re) end 'move))) (org-update-checkbox-count-maybe))) (defun org-reset-checkbox-state-subtree () @@ -1782,6 +1863,7 @@ information.") (org-update-checkbox-count)) (run-hooks 'org-checkbox-statistics-hook)) + (defun org-update-checkbox-count (&optional all) "Update the checkbox statistics in the current section. This will find all statistic cookies like [57%] and [6/12] and update them @@ -1798,8 +1880,8 @@ the whole buffer." (error (point-min)))) (end (copy-marker (save-excursion (outline-next-heading) (point)))) - (re-cookie "\\(\\(\\[[0-9]*%\\]\\)\\|\\(\\[[0-9]*/[0-9]*\\]\\)\\)") - (re-box "^[ \t]*\\([-+*]\\|[0-9]+[.)]\\)[ \t]+\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?\\(\\[[- X]\\]\\)") + (re-cookie "\\(\\(\\[0-9]*%\\]\\)\\|\\(\\[[0-9]*/[0-9]*\\]\\)\\)") + (re-box "^[ \t]*\\([-+*]\\|\\(?:[0-9]+\\|[A-Za-z]\\)[.)]\\)[ \t]+\\(?:\\[@\\(?:start:\\)?\\(?:[0-9]+\\|[A-Za-z]\\)\\][ \t]*\\)?\\(\\[[- X]\\]\\)") beg-cookie end-cookie is-percent c-on c-off lim new curr-ind next-ind continue-from startsearch list-beg list-end (recursive @@ -1860,7 +1942,7 @@ the whole buffer." (goto-char (or (org-get-next-item (point) lim) lim)) (end-of-line) (when (org-search-forward-unenclosed - org-item-beginning-re lim t) + (org-item-beginning-re) lim t) (beginning-of-line))) (setq next-ind (org-get-indentation))))) (goto-char continue-from) @@ -1886,8 +1968,8 @@ the whole buffer." (goto-char continue-from))) (unless (and all (outline-next-heading)) (throw 'exit nil)))) (when (interactive-p) - (message "Checkbox statistics updated %s (%d places)" - (if all "in entire file" "in current outline entry") cstat))))) + (message "Checkbox statistics updated %s (%d places)" + (if all "in entire file" "in current outline entry") cstat))))) (defun org-get-checkbox-statistics-face () "Select the face for checkbox statistics. @@ -2033,10 +2115,10 @@ sublevels as a list of strings." (let* ((start (goto-char (org-list-top-point))) (end (org-list-bottom-point)) output itemsep ltype) - (while (org-search-forward-unenclosed org-item-beginning-re end t) + (while (org-search-forward-unenclosed (org-item-beginning-re) end t) (save-excursion (beginning-of-line) - (setq ltype (cond ((org-looking-at-p "^[ \t]*[0-9]") 'ordered) + (setq ltype (cond ((org-looking-at-p "^[ \t]*\\([0-9]+\\|[A-Za-z]\\)") 'ordered) ((org-at-item-description-p) 'descriptive) (t 'unordered)))) (let* ((indent1 (org-get-indentation)) @@ -2045,7 +2127,7 @@ sublevels as a list of strings." (org-end-of-item-or-at-child end)))) (nextindent (if (= (point) end) 0 (org-get-indentation))) (item (if (string-match - "^\\(?:\\[@\\(?:start:\\)?[0-9]+\\][ \t]*\\)?\\[\\([xX ]\\)\\]" + "^\\(?:\\[@\\(?:start:\\)?\\(?:[0-9]+\\|[A-Za-z]\\)\\][ \t]*\\)?\\[\\([xX ]\\)\\]" item) (replace-match (if (equal (match-string 1 item) " ") "CBOFF" @@ -2130,7 +2212,7 @@ this list." (top-point (progn (re-search-backward "#\\+ORGLST" nil t) - (re-search-forward org-item-beginning-re bottom-point t) + (re-search-forward (org-item-beginning-re) bottom-point t) (match-beginning 0))) (list (save-restriction (narrow-to-region top-point bottom-point) -- 1.7.2.3.msysgit.0 [-- Attachment #3: Type: text/plain, Size: 201 bytes --] _______________________________________________ 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 ^ permalink raw reply related [flat|nested] 41+ messages in thread
end of thread, other threads:[~2011-01-12 20:05 UTC | newest] Thread overview: 41+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2010-07-29 20:27 [PATCH] Alphabetical ordered lists Nathaniel Flath 2010-07-29 21:07 ` Nick Dokos 2010-08-01 18:33 ` David Maus 2010-08-02 9:31 ` Nicolas Goaziou 2010-08-27 8:11 ` Carsten Dominik 2010-08-27 10:53 ` Bernt Hansen 2010-08-27 12:44 ` Jacob Mitchell 2010-08-27 13:01 ` Nathaniel Flath 2010-09-18 7:43 ` Nathaniel Flath 2010-09-21 12:48 ` Carsten Dominik 2010-09-21 16:46 ` Nicolas Goaziou 2010-09-26 17:36 ` Nicolas Goaziou 2010-09-26 22:16 ` Nathaniel Flath 2010-09-27 6:55 ` Nicolas Goaziou 2010-09-28 16:12 ` Carsten Dominik 2010-09-29 15:49 ` Carsten Dominik 2010-09-29 16:50 ` Nathaniel Flath 2010-09-29 17:46 ` Nicolas Goaziou 2010-10-01 1:13 ` Nathaniel Flath 2010-10-04 8:33 ` Carsten Dominik 2010-10-04 17:18 ` Nicolas Goaziou 2010-10-05 0:07 ` Sebastian Rose 2010-10-05 0:21 ` Nathaniel Flath 2010-10-05 7:40 ` Carsten Dominik 2010-10-21 4:44 ` Nathaniel Flath 2010-10-22 5:30 ` Nathaniel Flath 2010-10-22 8:13 ` Carsten Dominik 2010-10-23 1:04 ` Nathaniel Flath 2010-10-26 8:21 ` Nicolas Goaziou 2010-10-26 8:23 ` Carsten Dominik 2010-10-28 7:17 ` Nathaniel Flath 2010-11-11 7:16 ` Nathaniel Flath 2010-11-11 8:57 ` Nicolas Goaziou 2010-11-13 15:16 ` Nicolas Goaziou 2010-11-22 4:45 ` Nathaniel Flath 2010-11-22 13:37 ` Bernt Hansen 2010-11-22 18:37 ` Nicolas Goaziou 2010-11-27 4:39 ` Nathaniel Flath 2010-12-11 2:41 ` Nathaniel Flath 2010-12-20 18:25 ` Nicolas Goaziou 2011-01-12 20:05 ` Nathaniel Flath
Code repositories for project(s) associated with this external index https://git.savannah.gnu.org/cgit/emacs.git https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.