0

To get to my day page (agenda), currently I have to type in the following keys

  1. C-c a (binded to (org-agenda))
  2. a (Agenda for current week or day)
  3. d (to switch from week-view to day-view)
  4. C-c C-x C-c (to switch to column-view)

It's too much! Can I achieve the same thing by pressing just one key say <f10>, and hopefully without unnecessary evaluations? It's not as easy as normal key bindings I suppose, since one has to deal with the org agenda dispatcher.

EDIT: Answer found

  1. See NickD's answer. The key is (org-agenda-list nil nil 1 nil) and details can be found in the manual of the function (org-agenda-list) by C-h f org-agenda-list <RET>. This way is much faster than the second answer below.
  2. If you accept macro as a solution (which is slower), turn it into an elisp function by using the package elmacro and assign a keybind.
Student
  • 225
  • 1
  • 7

2 Answers2

4

You can define your own function that does all the things you want it to do and bind it to a key:

(defun my-day-page ()
   (interactive)
   (org-agenda-list nil nil 1 nil)
   (org-agenda-columns))

(define-key global-map [f10] 'my-day-page)

See the doc for org-agenda-list (C-h f org-agenda-list RET) for the meaning of the arguments: the third argument (the 1 above) is the span (i.e. how many days this list should cover).

NickD
  • 27,023
  • 3
  • 23
  • 42
  • Super! That's exactly what I'm looking for. It makes the workflow much faster by not evaluating unnecessary functions. – Student Apr 21 '20 at 19:53
0

The easiest way to do this would be a macro, more information can be found on the emacswiki, but essentially all you would do is:

  1. C-x (
    • Start Recording a Macro
  2. C-c a a C-c C-x C-c
    • Open the Agenda in column view
  3. C-x )
    • End the Macro
  4. M-x name-last-kbd-macro my-day-page
    • Give the macro a name
  5. M-x insert-kbd-macro
    • Insert the Macro
  6. (global-set-key (kbd "C-c b") 'my-day-page)

That macro function and keybinding can now be added to your ~/emacs.d/init.el file and pressing C-c b should now open up the day-page.

All together it might look like this:

;; Macro for Day View
(global-set-key (kbd "C-c a") 'org-agenda)
(fset 'my-day-page
(kmacro-lambda-form [?\C-c ?a ?a ?\C-c ?\C-x ?\C-c] 0 "%d"))
(global-set-key (kbd "C-c b") 'my-day-page)

-- EDIT by OP --

If you want to see what a macro is really doing, use the package elmacro, which turns your macro into a elisp function. In your case, after installation of elmacro from melpa, run elmacro-mode.

Define the macro as usual <f3>C-c a a d R C-c C-x C-c<f4>, and run the magical M-x elmacro-show-last-macro. It will generate a buffer with the elisp function!

(defun last-macro ()
  (interactive)
  (org-agenda-list nil)
  (org-agenda nil)
  (org-agenda-day-view nil)
  (org-agenda-clockreport-mode)
  (org-agenda-columns))

Please note that this result is not completely satisfactory. You want to get rid of (org-agenda nil) from the function, ending up give you

(defun the-macro-you-like ()
  (interactive)
  (org-agenda-list nil)
  (org-agenda-day-view nil)
  (org-agenda-clockreport-mode)
  (org-agenda-columns))

Finally, put this function in your config file, and bind it to <f10> for example by

(global-set-key (kbd "<f10>") 'the-macro-you-like)

Student
  • 225
  • 1
  • 7
  • Thank you. Still two more things are concerning.. 1. Are there other ways to circumvent org-agenda dispatcher, so it can be more scriptable? 2. A macro runs a risk when I happen to be in some other mode where the key-chords are mapped to other dangerous commands. Are there ways to be make it safer? – Student Apr 21 '20 at 14:14
  • A1. To make it more scriptable, use `elmacro`, which turns a macro into an elisp function. It might not be perfect everytime, see my edition to the answer. – Student Apr 21 '20 at 15:07