all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* writing ledger mode, date picker
@ 2015-11-07 20:30 jenia.ivlev
  2015-11-07 21:18 ` jenia.ivlev
                   ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: jenia.ivlev @ 2015-11-07 20:30 UTC (permalink / raw)
  To: help-gnu-emacs

I want to insert a date in the current buffer.

I know the function `calendar-cursor-to-date` that when invoked
gives back the date at which the cursor is.

But how do I get that info back to my program?


Here is what I go so far:

(defun insert-new-entry ()
   (interactive)
   (save-excursion
      (goto-char (point-max))
      ;;next comes mostly pseudocode except *calendar-cursor-to-date*

      (calendar)
      (let ((x (bind-key (kdb "enter) 'calendar-mode calendar-cursor-to-date)))
              (insert x))))


So in english it's:

1. go to the last location in the buffer
2. open calendar
3. store in x whatever is returned where enter is pressed
4. insert it into buffer.


The problem is step 3. How do I store into x whatever is returned from
`calendar-cursor-to-date`?

Thanks




^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: writing ledger mode, date picker
  2015-11-07 20:30 writing ledger mode, date picker jenia.ivlev
@ 2015-11-07 21:18 ` jenia.ivlev
  2015-11-07 23:49   ` Emanuel Berg
  2015-11-08  0:47 ` Drew Adams
  2015-11-09  5:39 ` jenia.ivlev
  2 siblings, 1 reply; 13+ messages in thread
From: jenia.ivlev @ 2015-11-07 21:18 UTC (permalink / raw)
  To: help-gnu-emacs


I found an answer. I'm using `org-read-date`:

       (let ((x (org-read-date))) 



But I'm reading the function org-read-date and I can't understand how it 
binds `calendar-cursor-to-date` to "enter" key press in calendar mode.

What I see is that `org-ans2` is set in `org-eval-in-calendar`

But what I don't understand is how do you bind `org-ans2`,
`calendar-cursor-to-date` to the "enter" key in calendar mode.

Does anyone here know?

Thanks




^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: writing ledger mode, date picker
  2015-11-07 21:18 ` jenia.ivlev
@ 2015-11-07 23:49   ` Emanuel Berg
  2015-11-08 19:25     ` jenia.ivlev
  0 siblings, 1 reply; 13+ messages in thread
From: Emanuel Berg @ 2015-11-07 23:49 UTC (permalink / raw)
  To: help-gnu-emacs

jenia.ivlev@gmail.com (jenia.ivlev) writes:

> I found an answer. I'm using `org-read-date`:
>
>        (let ((x (org-read-date)))
>
> But I'm reading the function org-read-date and
> I can't understand how it binds
> `calendar-cursor-to-date` to "enter" key press in
> calendar mode.
>
> What I see is that `org-ans2` is set in
> `org-eval-in-calendar`
>
> But what I don't understand is how do you bind
> `org-ans2`, `calendar-cursor-to-date` to the "enter"
> key in calendar mode.

I don't understand your question even 50%, but
assuming `calendar-cursor-to-date' is a command
(interactive function) then this should work:

    (define-key calendar-mode-map "\r" #'calendar-cursor-to-date)

If it doesn't, try add this:

    (defun calendar-cursor-to-date ()
      (interactive)
      (message "Calendar Crazy") )

Then it "works", or at least it shows you the
mechanics, so you can get it to work yourself when you
have defined your functions alright.

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 13+ messages in thread

* RE: writing ledger mode, date picker
  2015-11-07 20:30 writing ledger mode, date picker jenia.ivlev
  2015-11-07 21:18 ` jenia.ivlev
@ 2015-11-08  0:47 ` Drew Adams
  2015-11-08 19:37   ` jenia.ivlev
  2015-11-09  5:39 ` jenia.ivlev
  2 siblings, 1 reply; 13+ messages in thread
From: Drew Adams @ 2015-11-08  0:47 UTC (permalink / raw)
  To: jenia.ivlev, help-gnu-emacs

http://www.emacswiki.org/emacs/InsertingAndUpdatingDates
should help.  This, in particular:
http://www.emacswiki.org/emacs/InsertAnyDate



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: writing ledger mode, date picker
  2015-11-07 23:49   ` Emanuel Berg
@ 2015-11-08 19:25     ` jenia.ivlev
  2015-11-08 22:38       ` Emanuel Berg
  2015-11-09  2:42       ` Yuri Khan
  0 siblings, 2 replies; 13+ messages in thread
From: jenia.ivlev @ 2015-11-08 19:25 UTC (permalink / raw)
  To: help-gnu-emacs

Hello Emanuel. 

I'm trying to write a program that will prompt the user for a
date and insert it into a buffer called "asti" ;)

I'm having some success but also some problems. My problem, I think, is
that I'm using the `(when...)` function wrong. 

Here is the newest iteration of the program:

    (defun insert-new-entry ()
    (interactive)
    (save-excursion
        (goto-char (point-max))
        (print "Asti")
        (define-key calendar-mode-map (kbd "RET") 'get-date)
        (calendar)
        (when (calendar-cursor-to-date)
        (let ((x (calendar-cursor-to-date)))
            (select-window (get-buffer-window "asti" t))

                (insert format-time-string "%Y-%m-%d" x)))))


    (defun get-date ()
    (interactive)
    calendar-cursor-to-date)

The interpreter tells me, though, that `x` is nil basically: "Symbol's
value as a variable is void: format-time-string"

How do I execute this part AFTER the user has pressed "RET". 

    (let ((x (calendar-cursor-to-date))) <---- execute after "RET" pressed
        (select-window (get-buffer-window "asti" t))
            (insert format-time-string "%Y-%m-%d" x)))))

Thanks

P.S. To try my prog out, you need to open a buffer called asti by
doing `C-b 4 asti`.






^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: writing ledger mode, date picker
  2015-11-08  0:47 ` Drew Adams
@ 2015-11-08 19:37   ` jenia.ivlev
  0 siblings, 0 replies; 13+ messages in thread
From: jenia.ivlev @ 2015-11-08 19:37 UTC (permalink / raw)
  To: help-gnu-emacs


Hi Drew.

I'm having a much more fundamental problem.

I can't execute stuff after an event has happened. 

I wrote a function using the `(when (calendar-cursor-to-date) ...)` function that at first I
sincerely hoped will execute the `...` part when
`(calendar-cussor-to-date)` was finished executing but I wasn't so
lucky. Here is my program:

  (defun insert-new-entry ()
     (interactive)
     (save-excursion
        (goto-char (point-max))
        (print "Asti")
        (define-key calendar-mode-map (kbd "RET") 'get-date)
        (calendar)
        (when (calendar-cursor-to-date)
          (let ((x (calendar-cursor-to-date)))
            (select-window (get-buffer-window "asti" t))

            (insert format-time-string "%Y-%m-%d" x)))))


  (defun get-date ()
    (interactive)
     calendar-cursor-to-date)

How do I execute this part AFTER the user has pressed "RET":


  (let ((x (calendar-cursor-to-date))) <------ execute after "RET"
    (select-window (get-buffer-window "asti" t))
    (insert format-time-string "%Y-%m-%d" x)))))


This is just such a totally basic thing to want to do that I'm in
despair for not being able to do it very simply.

Can you please help me in achieving this? Setting `x` to be
`(calendar-cursor-to-date)` when "RET" has been pressed?


Thanks

P.S. If you decide to test the prog out, please create the buffer "asti"
first by pressing "C-x 4 b asti"






^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: writing ledger mode, date picker
  2015-11-08 19:25     ` jenia.ivlev
@ 2015-11-08 22:38       ` Emanuel Berg
  2015-11-09  2:42       ` Yuri Khan
  1 sibling, 0 replies; 13+ messages in thread
From: Emanuel Berg @ 2015-11-08 22:38 UTC (permalink / raw)
  To: help-gnu-emacs

jenia.ivlev@gmail.com (jenia.ivlev) writes:

> Hello Emanuel.
>
> I'm trying to write a program that will prompt the
> user for a date and insert it into a buffer called
> "asti" ;)

(require 'calendar)

(defun prompt-date-into-asti ()
  (interactive)
  (let*((date        (calendar-read-date))
        (date-string (format-time-string "%Y-%m-%d\n" date))
        (buffer      (get-buffer-create "asti")) )
    (with-current-buffer buffer
      (insert date-string) )))

> I'm having some success but also some problems.
> My problem, I think, is that I'm using the
> `(when...)` function wrong.

`when' is equivalent to `if' with no need for `progn',
only `when' doesn't come with an "else" branch, as do
`if'. So this

    (when something do)

is the same as

    (if something do)

The rule of thumb is:

    1. When you need an "else" branch, use `if' (or
       `cond'), with `progn' if necessary to scope
       the branches.

    2. When you don't need an "else" branch, and the
       condition is positive, i.e. (if something ... )
       then use `when' and there is no need for
       a progn (in the `if' sense at least).

    3. When you don't need an "else" branch, and the
       condition is *negative*, i.e. (if (not
       something) ... ) then use `unless', otherwise
       it is as with `when'.

> Here is the newest iteration of the program ...
> (define-key calendar-mode-map (kbd "RET") 'get-date)

That isn't anything you'd do in a defun. Do that when
you initialize calendar-mode if so. On the whole, you
code is too complicated, like you try to do to many
things at once. If you can describe what you want to
do, it'll be more easy to help.

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: writing ledger mode, date picker
  2015-11-08 19:25     ` jenia.ivlev
  2015-11-08 22:38       ` Emanuel Berg
@ 2015-11-09  2:42       ` Yuri Khan
  2015-11-09  3:45         ` Emanuel Berg
  1 sibling, 1 reply; 13+ messages in thread
From: Yuri Khan @ 2015-11-09  2:42 UTC (permalink / raw)
  To: jenia.ivlev; +Cc: help-gnu-emacs@gnu.org

On Mon, Nov 9, 2015 at 1:25 AM, jenia.ivlev <jenia.ivlev@gmail.com> wrote:

>                 (insert format-time-string "%Y-%m-%d" x)))))
> […]
> The interpreter tells me, though, that `x` is nil basically: "Symbol's
> value as a variable is void: format-time-string"

No. It’s telling you, in its own way, that you forgot parentheses
around the format-time-string function call and are instead trying to
insert the value of a non-existant variable. The fix for that is:

>                 (insert (format-time-string "%Y-%m-%d" x))))))


To your other question, the “when” form has no relation to time or
circumstances. It does not mean “please remember to execute this form
when this condition becomes true, and let’s go on with the following
forms”. It means “every time you come to interpret this expression,
test this condition right then and there, and when it is true, execute
this form”.


You want to ask a user to select a date on the calendar and then
insert that date into a buffer. The steps to that are, in a typical
“asynchronous call with continuation” pattern:

1. Cause the next press of RET in a calendar-mode buffer to call a
function specified by you. (By adding a binding to calendar-mode-map,
for example.)
2. Open the calendar.

When (and if) your code you specified in step 1 gets called:

101. Figure out the currently selected date. (By calling
calendar-cursor-to-date.)
102. Activate the buffer you want to insert into.
103. Insert the date from step 101, formatted suitably.
104. Do any cleanup work you might need. (Bury or close the calendar
buffer, and/or restore the previous binding of RET in
calendar-mode-map, if any.)


Looking at your code, it seems to me that it can be achieved by moving
the whole (when …) form from your insert-new-entry into get-date to
replace the reference to the undefined calendar-cursor-to-date
variable and fixing the missing parentheses on the format-time-string
call.



^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: writing ledger mode, date picker
  2015-11-09  2:42       ` Yuri Khan
@ 2015-11-09  3:45         ` Emanuel Berg
  2015-11-09  4:35           ` jenia.ivlev
  0 siblings, 1 reply; 13+ messages in thread
From: Emanuel Berg @ 2015-11-09  3:45 UTC (permalink / raw)
  To: help-gnu-emacs

Yuri Khan <yuri.v.khan@gmail.com> writes:

> You want to ask a user to select a date on the
> calendar and then insert that date into a buffer.

Aha, that is what the OP wants to do!

Then what I provided should be modified somewhat - see
the code below.

The problem is, `calendar-cursor-to-date' only gives
me dates in February 1970... So what is that, Diane
Keaton and Mariel Hemingway?

Maybe the OP has better luck (?) with that!

(require 'calendar)

(defun calendar-cursor-date-into-asti ()
  (interactive)
  (let*((date (calendar-cursor-to-date))
        (date-string (format-time-string "%Y-%m-%d\n" date))
        (buffer (get-buffer-create "asti")) )
    (with-current-buffer
        buffer (insert date-string) )))

(define-key calendar-mode-map "\r" 'calendar-cursor-date-into-asti)

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: writing ledger mode, date picker
  2015-11-09  3:45         ` Emanuel Berg
@ 2015-11-09  4:35           ` jenia.ivlev
  0 siblings, 0 replies; 13+ messages in thread
From: jenia.ivlev @ 2015-11-09  4:35 UTC (permalink / raw)
  To: help-gnu-emacs

Emanuel Berg <embe8573@student.uu.se> writes:

> Yuri Khan <yuri.v.khan@gmail.com> writes:
>
>> You want to ask a user to select a date on the
>> calendar and then insert that date into a buffer.
>
> Aha, that is what the OP wants to do!
>
> Then what I provided should be modified somewhat - see
> the code below.
>
> The problem is, `calendar-cursor-to-date' only gives
> me dates in February 1970... So what is that, Diane
> Keaton and Mariel Hemingway?
>
> Maybe the OP has better luck (?) with that!
>
Yes I did. I'll copy paste the answer. 

(defun insert-new-entry ()
   (interactive)
   (save-excursion
      (goto-char (point-max))
      (print "Asti")
      (define-key calendar-mode-map (kbd "RET") 'get-date)
      (calendar)
          (let* ((x (calendar-cursor-to-date))
                (time (encode-time 0 0 0 (nth 1 x) (nth 0 x) (nth 2 x))))
            (select-window (get-buffer-window "asti" t))
            (insert (format-time-string "%Y-%m-%d" time)))))

I didn't yet use the `calendar-mode-map`. Too tired. But I'm confident
that it'll work. 
So now I have all the pieces ;))))

Thanks you so much Emanuel, Yuri and Drew!!

P.S. I got this from org-read-date ;)
> (require 'calendar)
>
> (defun calendar-cursor-date-into-asti ()
>   (interactive)
>   (let*((date (calendar-cursor-to-date))
>         (date-string (format-time-string "%Y-%m-%d\n" date))
>         (buffer (get-buffer-create "asti")) )
>     (with-current-buffer
>         buffer (insert date-string) )))
>
> (define-key calendar-mode-map "\r" 'calendar-cursor-date-into-asti)




^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: writing ledger mode, date picker
  2015-11-07 20:30 writing ledger mode, date picker jenia.ivlev
  2015-11-07 21:18 ` jenia.ivlev
  2015-11-08  0:47 ` Drew Adams
@ 2015-11-09  5:39 ` jenia.ivlev
  2015-11-10  1:15   ` Emanuel Berg
  2015-11-10  1:22   ` Emanuel Berg
  2 siblings, 2 replies; 13+ messages in thread
From: jenia.ivlev @ 2015-11-09  5:39 UTC (permalink / raw)
  To: help-gnu-emacs


The program is amazing in it's simplicity. 
Thanks very much everyone for your kind help.


(defun insert-new-entry ()
   (interactive)
      (goto-char (point-max))
      (define-key calendar-mode-map "\r" 'get-date)
      (calendar))


(defun get-date ()
(interactive)
    (let* ((x (calendar-cursor-to-date))
           (time (encode-time 0 0 0 (nth 1 x) (nth 0 x) (nth 2 x))))
          (select-window (get-buffer-window "asti" t))
          (insert (format-time-string "%Y-%m-%d" time))))



P.S. This assumes you have an "asti" buffer opened (C-x 4 b asti).




^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: writing ledger mode, date picker
  2015-11-09  5:39 ` jenia.ivlev
@ 2015-11-10  1:15   ` Emanuel Berg
  2015-11-10  1:22   ` Emanuel Berg
  1 sibling, 0 replies; 13+ messages in thread
From: Emanuel Berg @ 2015-11-10  1:15 UTC (permalink / raw)
  To: help-gnu-emacs

jenia.ivlev@gmail.com (jenia.ivlev) writes:

> (defun insert-new-entry ()
>    (interactive)
>       (goto-char (point-max))
>       (define-key calendar-mode-map "\r" 'get-date)
>       (calendar))

That function first moves point to the end of the
buffer, than changes the key-map for the calendar
mode, then brings up the calendar.

1. Why is that called "insert-new-entry"?

2. Why move point? That happens *before* `calendar' is
   invoked. Remember your function can be called from
   anywhere in Emacs, i.e. from all modes and all
   buffers. Why move point in any and all of those?

3. If you want to change the key-map for a mode, don't
   do that in a defun. Just put this

       (require 'calendar)
       (define-key calendar-mode-map "\r" #'get-date)

    in an initiation file, i.e. most often ~/.emacs or
    some other file that is `load'ed from ~/.emacs.

Also, at least according to my Lisp-vision, there
shouldn't be indentation after the (interactive) line.
That is, the `goto-char' line should be align on the
same vertical level as the `interactive' line.

> (defun get-date ()
> (interactive)
>     (let* ((x (calendar-cursor-to-date))
>            (time (encode-time 0 0 0 (nth 1 x) (nth 0 x) (nth 2 x))))
>           (select-window (get-buffer-window "asti" t))
>           (insert (format-time-string "%Y-%m-%d" time))))

Even with the `encode-time' I still only get 1970s
dates! But if time works for you, still, check out
a previous post and the function I provided.

Some hints:

1. Be more pedantic with indentation!
   Use `indent-for-tab-command' (TAB) in the
   `emacs-lisp-mode' and let it be done for you.

2. Think of better names than `x'.

3. Instead of (nth 0 x), you can use `car'.

> P.S. This assumes you have an "asti" buffer opened
> (C-x 4 b asti).

Use `get-buffer-create' which will "[r]eturn the
buffer specified ... creating a new one if needed.
..." (from the help). get-buffer-create is what I used
in the function in my previous post, and that will
work regardless so you don't have to assume anything.

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: writing ledger mode, date picker
  2015-11-09  5:39 ` jenia.ivlev
  2015-11-10  1:15   ` Emanuel Berg
@ 2015-11-10  1:22   ` Emanuel Berg
  1 sibling, 0 replies; 13+ messages in thread
From: Emanuel Berg @ 2015-11-10  1:22 UTC (permalink / raw)
  To: help-gnu-emacs

jenia.ivlev@gmail.com (jenia.ivlev) writes:

> (defun insert-new-entry ()
>    (interactive)
>       (goto-char (point-max))
>       (define-key calendar-mode-map "\r" 'get-date)
>       (calendar))

That function first moves point to the end of the
buffer, than changes the key-map for the calendar
mode, then brings up the calendar.

1. Why is that called "insert-new-entry"?

2. Why move point? That happens *before* `calendar' is
   invoked. Remember your function can be called from
   anywhere in Emacs, i.e. from all modes and all
   buffers. Why move point in any and all of those?

3. If you want to change the key-map for a mode, don't
   do that in a defun. Just put this

       (require 'calendar)
       (define-key calendar-mode-map "\r" #'get-date)

    in an initiation file, i.e. most often ~/.emacs or
    some other file that is `load'ed from ~/.emacs.

Also, at least according to my Lisp-vision, there
shouldn't be indentation after the (interactive) line.
That is, the `goto-char' line should be align on the
same vertical level as the `interactive' line.

> (defun get-date ()
> (interactive)
>     (let* ((x (calendar-cursor-to-date))
>            (time (encode-time 0 0 0 (nth 1 x) (nth 0 x) (nth 2 x))))
>           (select-window (get-buffer-window "asti" t))
>           (insert (format-time-string "%Y-%m-%d" time))))

Even with the `encode-time' I still only get 1970s
dates! But if time works for you, still, check out
a previous post and the function I provided.

Some hints:

1. Be more pedantic with indentation!
   Use `indent-for-tab-command' (TAB) in the
   `emacs-lisp-mode' and let it be done for you.

2. Think of better names than `x'.

3. Instead of (nth 0 x), you can use `car'.

> P.S. This assumes you have an "asti" buffer opened
> (C-x 4 b asti).

Use `get-buffer-create' which will "[r]eturn the
buffer specified ... creating a new one if needed.
..." (from the help). get-buffer-create is what I used
in the function in my previous post, and that will
work regardless so you don't have to assume anything.

-- 
underground experts united
http://user.it.uu.se/~embe8573




^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2015-11-10  1:22 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-11-07 20:30 writing ledger mode, date picker jenia.ivlev
2015-11-07 21:18 ` jenia.ivlev
2015-11-07 23:49   ` Emanuel Berg
2015-11-08 19:25     ` jenia.ivlev
2015-11-08 22:38       ` Emanuel Berg
2015-11-09  2:42       ` Yuri Khan
2015-11-09  3:45         ` Emanuel Berg
2015-11-09  4:35           ` jenia.ivlev
2015-11-08  0:47 ` Drew Adams
2015-11-08 19:37   ` jenia.ivlev
2015-11-09  5:39 ` jenia.ivlev
2015-11-10  1:15   ` Emanuel Berg
2015-11-10  1:22   ` Emanuel Berg

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.