emacs-orgmode
[Top][All Lists]
Advanced

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

Re: [O] using a simple numerical variable in an org text ocument


From: Thorsten Jolitz
Subject: Re: [O] using a simple numerical variable in an org text ocument
Date: Fri, 26 Jul 2013 01:39:56 +0200
User-agent: Gnus/5.130002 (Ma Gnus v0.2) Emacs/24.3 (gnu/linux)

Matt Price <address@hidden> writes:

> Hi,
>
> I'm making a very simple org-document -- a packing list for a trip.
> It has entries like
>
> - 4 mugs
> - for sleeping bags
> - 4 thermarest pads
>
>
> I'd like to replace the numbers there by a variable -- so if I make a
> list for 4 people, the number displayed will be '4'; but if the list
> is for 2 people, the number displayed will be 2.  Better would be if I
> could also do simple arithmetic manipulations (x * 6 dinners for a
> week...).  I there a really simple way to do this? if it's not really
> easy, it won't really seem worth it, but if it is really easy, I will
> use it a lot...

Or, if you insist on checkboxes (private conversation), you might put this
function in your .emacs and run it to replace all numbers (that are either
factors or totals) with num * people (when people >= 0) or with num / people
(when people > 0).

#+begin_src emacs-lisp
  (defun tj/calc-total-items (people)
    "Replace factor cookies with factor * people totals."
    (interactive "NPeople: ")
    (save-excursion
      (save-restriction
        (save-match-data
          (goto-char (point-min))
          (widen)
          (while (not (eobp))
            (and (org-at-item-checkbox-p)
                 (looking-at
                  (concat
                   "\\(^[[:space:]]*-[[:space:]]"
                   "\\[[-X\s]\\][[:space:]]\\)"
                   "\\([[:digit:]]+\\)\\([[:space:]]+\\)"))
                 (let* ((num
                         (string-to-number
                          (match-string-no-properties 2)))
                        (total
                         (if (>= people 0)
                             (* num people)
                           (/ num (abs people)))))
                   (replace-match
                    (format "%s" total) nil nil nil 2)))
            (forward-line))))))
#+end_src

#+results:
: tj/calc-total-items


Use either as 

,----------------------------------
| M-x tj/calc-total-items RET 7 RET
`----------------------------------

or 

,----------------------------------
| C-7 M-x tj/calc-total-items RET
`----------------------------------

in your org-buffer.

When there are e.g. 7 people, this checkbox list 

- [ ] 1 toothbrushes
- [ ] 4 socks

turns into 

- [ ] 7 toothbrushes
- [ ] 28 socks

after applying the above command in this buffer, and the change is
reversed when applying

,----------------------------------
| M-x tj/calc-total-items RET -7 RET
`----------------------------------

or 

,----------------------------------
| C--7 M-x tj/calc-total-items RET
`----------------------------------

afterwards. Note that you must stick to the format 

,--------------------------
| - [ ] <<digit>> text ....
`--------------------------

for this to work.

-- 
cheers,
Thorsten




reply via email to

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