forked from rougier/emacs-gtd
-
Notifications
You must be signed in to change notification settings - Fork 0
/
GTD.html
2093 lines (1806 loc) · 90.9 KB
/
GTD.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<!-- 2022-07-05 Tue 21:58 -->
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Get Things Done with Emacs</title>
<meta name="author" content="Nicolas P. Rougier" />
<meta name="generator" content="Org Mode" />
<link rel="stylesheet" type="text/css" href="GTD.css" />
</head>
<body>
<div id="content" class="content">
<h1 class="title">Get Things Done with Emacs
<br />
<span class="subtitle">Nicolas P. Rougier - September 2020</span>
</h1>
<div id="table-of-contents" role="doc-toc">
<h2>Table of Contents</h2>
<div id="text-table-of-contents" role="doc-toc">
<ul>
<li><a href="#org2d1a786">Introduction</a>
<ul>
<li><a href="#org34af295">Get Things Done</a></li>
<li><a href="#org6a84e44">About this document</a></li>
<li><a href="#org2b1faee">License</a></li>
<li><a href="#org5ed3798">Resources</a></li>
</ul>
</li>
<li><a href="#orgbe6fce8">Inbox</a>
<ul>
<li><a href="#org947d62d">Basic setup</a></li>
<li><a href="#orgae380b3">Working with mail</a></li>
<li><a href="#org9683e20">Capturing tasks</a></li>
<li><a href="#orgfc57a12">Summary</a></li>
</ul>
</li>
<li><a href="#org212bab5">Agenda</a>
<ul>
<li><a href="#org2d62325">Basic setup (I)</a></li>
<li><a href="#org766e892">Recurrent events</a></li>
<li><a href="#org8696764">Meetings & notes</a></li>
<li><a href="#org6db3673">Summary</a></li>
</ul>
</li>
<li><a href="#orgf831e2f">Review</a>
<ul>
<li><a href="#orgd62eb19">Basic setup</a></li>
<li><a href="#org8c6ecc6">Moving things</a></li>
<li><a href="#org3fd9e80">Activating tasks</a></li>
<li><a href="#orgd2d7c02">Summary</a></li>
</ul>
</li>
<li><a href="#org3178978">Doing things</a>
<ul>
<li><a href="#org9f2e38c">Agenda setup (II)</a></li>
<li><a href="#org6bf79fc">Completing a task</a></li>
<li><a href="#org0993877">Summary</a></li>
</ul>
</li>
<li><a href="#orgad6a3d9">Additional changes</a>
<ul>
<li><a href="#orgd8a3d64">Automatic saving after refilling</a></li>
</ul>
</li>
<li><a href="#org326d709">Conclusion</a>
<ul>
<li><a href="#orgbbabfb3">Going further</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-org2d1a786" class="outline-2">
<h2 id="org2d1a786">Introduction</h2>
<div class="outline-text-2" id="text-org2d1a786">
<div class="back"><a href="#table-of-contents">⌘ Back to top</a></div>
<p>
Before I start describing how I organize my professional life using Emacs
and org-mode, let me introduce myself. I'm a <a href="https://www.labri.fr/perso/nrougier/">researcher in computational
neuroscience</a> working at the <a href="https://www.imn-bordeaux.org/en/">Institute of Neurodegenerative Diseases</a> in
Bordeaux (France). As such, my main tasks during a typical day are meetings
with my PhD students (physical or online), team and grant meetings
(physical or online), development (GitHub), reading (online), reviewing
(online) and writing (books, papers, grants, notes, etc). I'm also
co-founder and editor in chief for <a href="https://rescience.github.io/">ReScience C</a> and <a href="http://rescience.org/x">ReScience X</a> and I'm
involved in several academic and open source projects. I receive
approximately 100 mails and 10 GitHub notifications a day.
</p>
<p>
As of September 2020, I'm supervising five PhD students (two first year,
one second year, one third year and one finishing). I'm currently writing a
book (<a href="https://github.com/rougier/scientific-visualization-book">Scientific Visualization — Python & Matplotlib</a>), handling the
simulatenous writing of 6 academic papers (at various stages), while
preparing a SciFi festival (<a href="https://hypermondes.fr/">Hypermondes</a>), a hackaton (<a href="https://github.com/reprohack/reprohack-hq">ReproHack @
Bordeaux</a>), a workshop (<a href="https://github.com/ReScience/ten-years">Ten Years Reproducibility Challenge</a>) and a summer
school (<a href="https://aspp.school/wiki/">ASPP 2021</a>) to be held in Bordeaux in 2021.
</p>
<p>
All these activities requires some organisation.
</p>
</div>
<div id="outline-container-org34af295" class="outline-3">
<h3 id="org34af295">Get Things Done</h3>
<div class="outline-text-3" id="text-org34af295">
<p>
I've decided some weeks ago to (try to) adopt the method of David Allen
named "Get Things Done" (GTD). A lot of people were giving very positive
feedback about this method and there are a lot of related resources
online, including several Emacs/org-mode setup. This helped me a lot to
design my own setup since I did not read the book, but I found a nice
<a href="https://todoist.com/productivity-methods/getting-things-done">summary</a>:
</p>
<ol class="org-ol">
<li><b>Capture</b> anything that crosses your mind, nothing is too big or small.</li>
<li><b>Clarify</b> what you’ve captured into clear and concrete action steps.</li>
<li><b>Organize</b> and put everything into the right place.</li>
<li><b>Review</b>, update, and revise your lists.</li>
<li><b>Engage</b> Get to work on the important stuff.</li>
</ol>
<p>
Then I read a lot of other Emacs specific resources that were incredibly
useful but also a bit complex because people introduced their full setup
making it difficult to understand it sometime. Since I'm still in the setup
phase, I've decided to document the process while designing it, hoping it
will be helpful for others.
</p>
<p>
If you want to read my current full setup, just go the end of this
document. Else, you can read each section and discover the process step by
step. Note that this means we'll write some parts only to be rewritten
later with some improvements, just for the sake of clarity.
</p>
</div>
</div>
<div id="outline-container-org6a84e44" class="outline-3">
<h3 id="org6a84e44">About this document</h3>
<div class="outline-text-3" id="text-org6a84e44">
<p>
In all the following section, I'll suppose you're familiar with emacs (of
course) and knows bit of org-mode. If this is not the case, you can follow
the different links I've inserted. They point to the relevant section in
the org-mode manual. We'll start with a Vanilla emacs without any initial
configuration ("<i>emacs -q – GTD.el"</i>) such that you should obtain the same
result as me. <code>GTD.el</code> will be given in each section.
</p>
<p>
The address of this document is: <a href="https://www.labri.fr/perso/nrougier/GTD/index.html">https://www.labri.fr/perso/nrougier/GTD/index.html</a><br />
The sources of this document is: <a href="https://github.com/rougier/emacs-GTD">https://github.com/rougier/emacs-GTD</a>
</p>
</div>
</div>
<div id="outline-container-org2b1faee" class="outline-3">
<h3 id="org2b1faee">License</h3>
<div class="outline-text-3" id="text-org2b1faee">
<p>
This document has been written in org mode (<a href="GTD.org"><code>GTD.org</code></a>) using a customized
CSS stylesheet (<a href="GTD.css"><code>GTD.css</code>)</a> released (both) under a <a href="https://creativecommons.org/licenses/by/4.0/">CC-BY 4.0 international
license</a>. Feel free to re-use it if you like it.
</p>
</div>
</div>
<div id="outline-container-org5ed3798" class="outline-3">
<h3 id="org5ed3798">Resources</h3>
<div class="outline-text-3" id="text-org5ed3798">
<p>
Here are various resources that helped me to design my workflow:
</p>
<ul class="org-ul">
<li><p>
<a href="https://blog.jethro.dev/posts/org_mode_workflow_preview/">Org-mode Workflow: A Preview</a> by Jethro Kuan (2020)
</p>
<blockquote>
<p>
This is going to be a multi-part series on Emacs and org-mode. This is
also going to be a really long series, so before we begin I want to give
you an idea of what to expect. What I’m about to present is a workflow
I’ve tweaked over several years. It is a workflow that has constantly
evolved to adapt to my varying needs. At the time of writing, I have
completed 3478 todo items, and written over 29000 lines in my personal
knowledge base.
</p>
</blockquote></li>
<li><p>
<a href="https://emacs.cafe/emacs/orgmode/gtd/2017/06/30/orgmode-gtd.html">Orgmode for GTD</a> by Nicolas Petton (2017)
</p>
<blockquote>
<p>
I’ve been using Orgmode to implement the GTD methodology for the last 4
years. Rather than explaining the GTD methodology itself or how Orgmode
works, in this post I’ll detail how I use Orgmode to implement GTD. If
you don’t know Orgmode and are curious about it, you should head to its
website first.
</p>
</blockquote></li>
<li><p>
<a href="http://doc.norang.ca/org-mode.html">Org Mode - Organize Your Life In Plain Text!</a> by Bernt Hansen (2015)
</p>
<blockquote>
<p>
I have been using org-mode as my personal information manager for years
now. I started small with just the default TODO and DONE keywords. I
added small changes to my workflow and over time it evolved into what is
described by this document. I still change my workflow and try new things
regularly. This document describes mature workflows in my current
org-mode setup. I tend to document changes to my workflow 30 days after
implementing them (assuming they are still around at that point) so that
the new workflow has a chance to mature.
</p>
</blockquote></li>
<li><p>
<a href="http://members.optusnet.com.au/~charles57/GTD/gtd_workflow.html">How I use Emacs and Org-mode to implement GTD </a>by Charles Cave (2009)
</p>
<blockquote>
<p>
"Getting Things Done" is a book by David Allen in which he describes a
work-life management system developed after twenty years of consulting
work. The promise of GTD is "Stress-free productivity" and developing a
calm state of mind in a state of readiness. Allen's second book, "Ready
for Anything" elaborates on these principles in a series of essays. The
effectiveness of GTD lies in taking a complete and current inventory of
all your commitments, then organizing and reviewing this information
regularly in a systematic way. Your work and life can then be viewed from
different levels of detail allowing you to make choices about what to do
(and not do) at any moment.
</p>
</blockquote></li>
</ul>
<p>
And of course, the <a href="https://orgmode.org/guide/">org-mode documentation</a> helped me alot.
</p>
<blockquote>
<p>
Org is a mode for keeping notes, maintaining TODO lists, and doing
project planning with a fast and effective plain-text system. It is also
an authoring and publishing system, and it supports working with source
code for literal programming and reproducible research.
</p>
</blockquote>
</div>
</div>
</div>
<div id="outline-container-orgbe6fce8" class="outline-2">
<h2 id="orgbe6fce8">Inbox</h2>
<div class="outline-text-2" id="text-orgbe6fce8">
<div class="back"><a href="#table-of-contents">⌘ Back to top</a></div>
</div>
<div id="outline-container-org947d62d" class="outline-3">
<h3 id="org947d62d">Basic setup</h3>
<div class="outline-text-3" id="text-org947d62d">
<p>
The first step I was interested in was a way to quickly capture any idea
that I may have during the day. My goal was to have a non-disruptive
process, that is, type a key sequence to enter <a href="https://orgmode.org/guide/Capture.html#Capture">capture mode</a>, type some text
and then just forget about it. More specifically, I did not want to have to
think where I would store this text nor thinking about any related
information such as tags or date. I chose to store theses ideas in a
<code>~/Documents/org/inbox.org</code> file:
</p>
<div class="org-src-container">
<pre class="src src-lisp">(setq org-directory <span class="org-string">"~/Documents/org"</span>)
(setq org-agenda-files (list <span class="org-string">"inbox.org"</span>))
</pre>
</div>
<p>
My initial <code>inbox.org</code> reads (we'll modify it later):
</p>
<div class="org-src-container">
<pre class="src src-org"><span class="org-org-meta-line">#+STARTUP: content showstars indent</span>
<span class="org-org-meta-line">#+FILETAGS: inbox</span>
</pre>
</div>
<p>
The STARTUP line defines some <a href="https://orgmode.org/manual/In_002dbuffer-Settings.html">buffer settings</a> (<a href="https://orgmode.org/manual/Initial-visibility.html">initial visibility</a>, <a href="https://orgmode.org/manual/Org-Indent-Mode.html">indent
mode</a> and <a href="https://orgmode.org/manual/Hard-indentation.html#Hard-indentation">star visibility</a>) while the <a href="https://orgmode.org/manual/Tag-Inheritance.html">FILETAGS</a> line defines a common tag that
will be inherited by all entries (<code>inbox</code> in this case).
</p>
<p>
then we can setup a specific capture template for inbox:
</p>
<div class="org-src-container">
<pre class="src src-lisp">(setq org-capture-templates
`((<span class="org-string">"i"</span> <span class="org-string">"Inbox"</span> entry (file <span class="org-string">"inbox.org"</span>)
,(concat <span class="org-string">"* TODO %?\n"</span>
<span class="org-string">"/Entered on/ %U"</span>))))
</pre>
</div>
<p>
and setup a keyboard shortcut (<code>C-c c</code>):
</p>
<div class="org-src-container">
<pre class="src src-lisp">(define-key global-map (kbd <span class="org-string">"C-c c"</span>) 'org-capture)
</pre>
</div>
<p>
Note that this binding will invoke the org capture menu and to add
something to the inbox, the full sequence is <code>C-c c i</code>. Since I intend
to use it quite often, I prefer to have shorter bindings:
</p>
<div class="org-src-container">
<pre class="src src-lisp">(<span class="org-keyword">defun</span> <span class="org-function-name">org-capture-inbox</span> ()
(interactive)
(call-interactively 'org-store-link)
(org-capture nil <span class="org-string">"i"</span>))
(define-key global-map (kbd <span class="org-string">"C-c i"</span>) 'org-capture-inbox)
</pre>
</div>
</div>
</div>
<div id="outline-container-orgae380b3" class="outline-3">
<h3 id="orgae380b3">Working with mail</h3>
<div class="outline-text-3" id="text-orgae380b3">
<p>
For a long time, I've been using my mail inbox as a todo box, i.e. a
collection of emails that call for action. Any mail that was not archived
requested an answer in the short or long term. I doubt this is the
recommended way of handling the inbox (but is there any?) but since I
decided to move to GTD, it was also the opportunity to handle my mail
differently. A few months back, I moved away from the default system email
client on my OSX machine and started to use the almighty <a href="https://www.djcbsoftware.nl/code/mu/mu4e/">mu4e</a> (mu for
emacs) that provides a very smooth <a href="https://www.djcbsoftware.nl/code/mu/mu4e/Org_002dmode-links.html">capture integration</a>. We can thus add a
new template for quickly capturing a "Reply to" action to be filed in the
inbox.
</p>
<div class="org-src-container">
<pre class="src src-lisp">(setq org-capture-templates
`((<span class="org-string">"i"</span> <span class="org-string">"Inbox"</span> entry (file <span class="org-string">"inbox.org"</span>)
,(concat <span class="org-string">"* TODO %?\n"</span>
<span class="org-string">"/Entered on/ %U"</span>))
(<span class="org-string">"@"</span> <span class="org-string">"Inbox [mu4e]"</span> entry (file <span class="org-string">"inbox.org"</span>)
,(concat <span class="org-string">"* TODO Process \"%a\" %?\n"</span>
<span class="org-string">"/Entered on/ %U"</span>))))
</pre>
</div>
<p>
We can now define a binding for headers and view mode:
</p>
<div class="org-src-container">
<pre class="src src-lisp">(define-key mu4e-headers-mode-map (kbd <span class="org-string">"C-c c"</span>) 'mu4e-org-store-and-capture)
(define-key mu4e-view-mode-map (kbd <span class="org-string">"C-c c"</span>) 'mu4e-org-store-and-capture)
</pre>
</div>
<p>
To register a reply action, the full sequence is thus <code>C-c c @</code>.
Since I'm lazy, let's shorten it to <code>C-c i</code>:
</p>
<div class="org-src-container">
<pre class="src src-lisp">(<span class="org-keyword">defun</span> <span class="org-function-name">org-capture-mail</span> ()
(interactive)
(call-interactively 'org-store-link)
(org-capture nil <span class="org-string">"@"</span>))
(define-key mu4e-headers-mode-map (kbd <span class="org-string">"C-c i"</span>) 'org-capture-mail)
(define-key mu4e-view-mode-map (kbd <span class="org-string">"C-c i"</span>) 'org-capture-mail)
</pre>
</div>
<p>
Last thing is a small <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Hooks.html">hook</a> to tell org-capture to use the full window
instead of splitting the current window. This is not mandatory at all and
mostly depends on your taste.
</p>
<div class="org-src-container">
<pre class="src src-lisp">(add-hook 'org-capture-mode-hook 'delete-other-windows)
</pre>
</div>
</div>
</div>
<div id="outline-container-org9683e20" class="outline-3">
<h3 id="org9683e20">Capturing tasks</h3>
<div class="outline-text-3" id="text-org9683e20">
<p>
Any time you want to enter something in your inbox, be it a note or
something related to a mail, just type <code>C-c i</code> and you should see the
following capture window:
</p>
<div class="org-src-container">
<pre class="src src-org"><span class="org-bold">Capture buffer. Finish 'C-c C-c', refile 'C-c C-w', abort 'C-c C-k'.</span>
<span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-org-todo">TODO</span></span><span class="org-org-level-1"> </span><span class="org-org-level-1"><span class="custom">_</span></span>
<span class="org-italic">Entered on </span><span class="org-org-date"><span class="org-italic">[2020-09-11 Fri 07:53]</span></span>
</pre>
</div>
<p>
For mail related note, you don't have to do anything:
</p>
<div class="org-src-container">
<pre class="src src-org"><span class="org-bold">Capture buffer. Finish 'C-c C-c', refile 'C-c C-w', abort 'C-c C-k'.</span>
<span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-org-todo">TODO</span></span><span class="org-org-level-1"> Process "Adaptive Computation Time …" </span><span class="org-org-level-1"><span class="custom">_</span></span>
<span class="org-italic">Entered on </span><span class="org-org-date"><span class="org-italic">[2020-09-08 Tue 08:51]</span></span>
</pre>
</div>
<p>
My inbox notes are generally short (verb + subject) because I use a daily
review and it is generally enough information for later processing. To give
you an idea, here is my current inbox (<i>2020-09-11 Fri</i>). Note that all the
<code>Process</code> entries links to the relevant mail.
</p>
<div class="org-src-container">
<pre class="src src-org"><span class="org-org-meta-line">#+STARTUP: content showstars indent</span>
<span class="org-org-meta-line">#+FILETAGS: inbox</span>
<span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-org-todo">TODO</span></span><span class="org-org-level-1"> Organize bibliography …</span>
<span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-org-todo">TODO</span></span><span class="org-org-level-1"> Process "Adaptive Computation Time …" …</span>
<span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-org-todo">TODO</span></span><span class="org-org-level-1"> Process "Relevant paper" …</span>
<span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-org-todo">TODO</span></span><span class="org-org-level-1"> Mail F.Wagner about team talk …</span>
<span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-org-todo">TODO</span></span><span class="org-org-level-1"> Buy "Canon printer" …</span>
<span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-org-todo">TODO</span></span><span class="org-org-level-1"> Process "ICDL oral presentation" …</span>
<span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-org-todo">TODO</span></span><span class="org-org-level-1"> Write discussion (plasticity paper) …</span>
<span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-org-todo">TODO</span></span><span class="org-org-level-1"> Compute VSOM δxδy representation …</span>
</pre>
</div>
<p>
During the review, some of these notes will be filed directly under an
existing project, some will be split in several subtasks and some others
will lead to the creation of a new project.
</p>
</div>
</div>
<div id="outline-container-orgfc57a12" class="outline-3">
<h3 id="orgfc57a12">Summary</h3>
<div class="outline-text-3" id="text-orgfc57a12">
<p>
Our first (incomplete) GTD configuration is:
</p>
<details><summary><b>GTD.el</b> (version 1)</summary>
<div class="org-src-container">
<pre class="src src-lisp">(<span class="org-keyword">require</span> '<span class="org-constant">org</span>)
(setq org-directory <span class="org-string">"~/Documents/org"</span>)
(setq org-agenda-files (list <span class="org-string">"inbox.org"</span>))
(setq org-capture-templates
`((<span class="org-string">"i"</span> <span class="org-string">"Inbox"</span> entry (file <span class="org-string">"inbox.org"</span>)
,(concat <span class="org-string">"* TODO %?\n"</span>
<span class="org-string">"/Entered on/ %U"</span>))
(<span class="org-string">"@"</span> <span class="org-string">"Inbox [mu4e]"</span> entry (file <span class="org-string">"inbox.org"</span>)
,(concat <span class="org-string">"* TODO Reply to \"%a\" %?\n"</span>
<span class="org-string">"/Entered on/ %U"</span>))))
(<span class="org-keyword">defun</span> <span class="org-function-name">org-capture-inbox</span> ()
(interactive)
(call-interactively 'org-store-link)
(org-capture nil <span class="org-string">"i"</span>))
(<span class="org-keyword">defun</span> <span class="org-function-name">org-capture-mail</span> ()
(interactive)
(call-interactively 'org-store-link)
(org-capture nil <span class="org-string">"@"</span>))
<span class="org-comment-delimiter">;; </span><span class="org-comment">Use full window for org-capture</span>
(add-hook 'org-capture-mode-hook 'delete-other-windows)
(define-key global-map (kbd <span class="org-string">"C-c c"</span>) 'org-capture)
(define-key global-map (kbd <span class="org-string">"C-c i"</span>) 'org-capture-inbox)
<span class="org-comment-delimiter">;; </span><span class="org-comment">Only if you use mu4e</span>
<span class="org-comment-delimiter">;; </span><span class="org-comment">(require 'mu4e)</span>
<span class="org-comment-delimiter">;; </span><span class="org-comment">(define-key mu4e-headers-mode-map (kbd "C-c i") 'org-capture-mail)</span>
<span class="org-comment-delimiter">;; </span><span class="org-comment">(define-key mu4e-view-mode-map (kbd "C-c i") 'org-capture-mail)</span>
</pre>
</div>
</details>
<p>
The set of available commands at this point is:
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Command</th>
<th scope="col" class="org-left">Bindings</th>
<th scope="col" class="org-left">Mode + where</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Capture menu</td>
<td class="org-left"><b>C-c c</b></td>
<td class="org-left">any</td>
</tr>
<tr>
<td class="org-left">Capture a new TODO</td>
<td class="org-left"><b>C-c i</b> or <b>C-c c i</b></td>
<td class="org-left">any</td>
</tr>
<tr>
<td class="org-left">Capture a mail-related TODO</td>
<td class="org-left"><b>C-c i</b> or <b>C-c c @</b></td>
<td class="org-left">mu4e view/headers mode</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div id="outline-container-org212bab5" class="outline-2">
<h2 id="org212bab5">Agenda</h2>
<div class="outline-text-2" id="text-org212bab5">
<div class="back"><a href="#table-of-contents">⌘ Back to top</a></div>
</div>
<div id="outline-container-org2d62325" class="outline-3">
<h3 id="org2d62325">Basic setup (I)</h3>
<div class="outline-text-3" id="text-org2d62325">
<p>
Before heading to the review process, we need first to setup the <a href="https://orgmode.org/manual/Agenda-Views.html#Agenda-Views">agenda</a>
that will help us to track daily meetings and tasks. Using the previous
inbox configuration, you can actually already have a view of your inbox
using the <code>M-x org-agenda</code> command that will bring up a menu where you can
choose what to display. Before using it, let me first define a new global
key binding (<code>C-c a</code>) for quick access to the agenda:
</p>
<div class="org-src-container">
<pre class="src src-lisp">(define-key global-map (kbd <span class="org-string">"C-c a"</span>) 'org-agenda)
</pre>
</div>
<p>
Now, let's see what our tasks look like by invoking the "List of All TODO
entries" using the <code>t</code> menu (full sequence is thus <code>C-c a t</code>):
</p>
<div class="org-src-container">
<pre class="src src-org"><span class="org-bold">Global list of TODO items of type: ALL</span>
<span class="org-bold">Press ‘N r’ (e.g. ‘0 r’) to search again: (0)[ALL] (1)TODO (2)DONE</span>
inbox: TODO Organize bibliography <span class="org-italic">:inbox:</span>
inbox: TODO Process "Adaptive Computation Time…" <span class="org-italic">:inbox:</span>
inbox: TODO Process "Relevant paper" <span class="org-italic">:inbox:</span>
inbox: TODO Mail F.Wagner about team talk <span class="org-italic">:inbox:</span>
inbox: TODO Buy "Canon printer" <span class="org-italic">:inbox:</span>
inbox: TODO Process "ICDL oral presentation" <span class="org-italic">:inbox:</span>
inbox: TODO Write discution (plasticity paper) <span class="org-italic">:inbox:</span>
inbox: TODO Compute VSOM δxδy representation <span class="org-italic">:inbox:</span>
</pre>
</div>
<p>
The display of the task list is bit redundant because we have an "inbox" on
the left and an "inbox" on the right. However, they do not have the same
origin. The one on the left is the name of the file where the related TODO
is stored while the one on the right is a tag. If you remember our inbox
file setup header, there was a <code>#+FILETAGS: inbox</code> line that assign the
"inbox" tag to each entry. Since tags are redundant, let's just remove them
by filtering them out:
</p>
<div class="org-src-container">
<pre class="src src-lisp">(setq org-agenda-hide-tags-regexp <span class="org-string">"."</span>)
</pre>
</div>
<p>
With this line, we actually ask the agenda to hide any tag (<code>.</code>) that may be
present. Of course, you can choose to be more specific and hide only some
tags, it's up to you. Now we still have to choose what to do with the left
part displaying "inbox". This is displayed because there is no <a href="https://orgmode.org/manual/Categories.html">category</a>
assigned to the entry and when the agenda display a TODO item, the default
behavior is to display the category or the filename if there is no
category. You can of course change what is actually displayed by modifying
the <a href="https://orgmode.org/manual/Presentation-and-Sorting.html">org-agenda-prefix-format</a>:
</p>
<div class="org-src-container">
<pre class="src src-lisp">(setq org-agenda-prefix-format
'((agenda . <span class="org-string">" %i %-12:c%?-12t% s"</span>)
(todo . <span class="org-string">" %i %-12:c"</span>)
(tags . <span class="org-string">" %i %-12:c"</span>)
(search . <span class="org-string">" %i %-12:c"</span>)))
</pre>
</div>
<p>
We could also add a <i>#+CATEGORY: INBOX</i> to the header of our inbox file but I
prefer not to have anything displayed for now. So let's get's rid of the
category display for todo items:
</p>
<div class="org-src-container">
<pre class="src src-lisp">(setq org-agenda-prefix-format
'((agenda . <span class="org-string">" %i %-12:c%?-12t% s"</span>)
(todo . <span class="org-string">" "</span>)
(tags . <span class="org-string">" %i %-12:c"</span>)
(search . <span class="org-string">" %i %-12:c"</span>)))
</pre>
</div>
<p>
And the result is:
</p>
<div class="org-src-container">
<pre class="src src-org"><span class="org-bold">Global list of TODO items of type: ALL</span>
<span class="org-bold">Press ‘N r’ (e.g. ‘0 r’) to search again: (0)[ALL] (1)TODO (2)DONE</span>
TODO Organize bibliography
TODO Process "Adaptive Computation Time…"
TODO Process "Relevant paper"
TODO Mail F.Wagner about team talk
TODO Buy "Canon printer"
TODO Process "ICDL oral presentation"
TODO Write discution (plasticity paper)
TODO Compute VSOM δxδy representation
</pre>
</div>
</div>
</div>
<div id="outline-container-org766e892" class="outline-3">
<h3 id="org766e892">Recurrent events</h3>
<div class="outline-text-3" id="text-org766e892">
<p>
Beside notes taking, I send or received a number of appointments (generally
through mail) and I need to save them. I prefer not to file them in my
inbox since generally I know both the topic and when they will occur such
that I can directly store them in a dedicated <code>agenda.org</code> file that will be
used to store all my scheduled events and meetings. Let's first add this
new file to the list of org files:
</p>
<div class="org-src-container">
<pre class="src src-lisp">(setq org-agenda-files (list <span class="org-string">"inbox.org"</span> <span class="org-string">"agenda.org"</span>))
</pre>
</div>
<p>
The initial file has a basic startup header configuration and I also
defined a set of default <a href="https://orgmode.org/manual/Tags.html">tags</a> using the <code>#+TAGS</code> syntax. This will ease the
assignment of tags when adding a new entry or modifying an entry (we'll
that later):
</p>
<div class="org-src-container">
<pre class="src src-org"><span class="org-org-meta-line">#+STARTUP: hideall showstars indent</span>
<span class="org-org-meta-line">#+TAGS: event(e) meeting(m) deadline(d)</span>
<span class="org-org-meta-line">#+TAGS: @outside(o) @imn(i) @inria(r) @online(l) @canceled(c)</span>
</pre>
</div>
<p>
The structure of my agenda is split into birthdays and recurrent / past /
future events. This quite arbitrary and you can use any a different
structure.
</p>
<div class="org-src-container">
<pre class="src src-org"><span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-bold">Birthdays</span></span>
<span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-bold">Recurrent</span></span>
* <span class="org-bold">Scheduled</span>
* <span class="org-bold">People</span>
* <span class="org-bold">Team</span>
<span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-bold">Past</span></span>
<span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-bold">Future</span></span>
</pre>
</div>
<p>
Let's first start filling the birthdays part. For any yearly event such as
birthdays, we can add special entries using the <a href="https://www.gnu.org/software/emacs/manual/html_node/org/Weekly_002fdaily-agenda.html">org-anniversary</a> syntax
(from the <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/Diary.html">diary</a>).
</p>
<div class="org-src-container">
<pre class="src src-org"><span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-bold">Birthdays</span></span>
%%(org-anniversary 1976 6 1) Emacs is %d years old
%%(org-anniversary 1953 3 16) Richard Stallman is %d years old
</pre>
</div>
<p>
Each time month/day is displayed in the agenda, the corresponding text will
be displayed as well.
</p>
<p>
For the recurrent events, I make a separation between scheduled, people and
team. In my case, scheduled events are mostly daily events and I use the
agenda as a reminder. I could have used the <a href="https://orgmode.org/manual/Repeated-tasks.html">repeating tasks</a> feature (using
syntax such as <i><span class="timestamp-wrapper"><span class="timestamp">[2020-09-12 Sat 09:00 +1d]</span></span></i>, but the problem is that I wanted
to have some daily repeating task only for workdays and the previous syntax
does not offer such choice. Instead, I've used the <a href="https://stackoverflow.com/questions/28369833">following code</a>:
</p>
<div class="org-src-container">
<pre class="src src-org"><span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-bold">Recurrent</span></span>
* <span class="org-bold">Scheduled</span>
* <span class="org-bold">GTD Review</span> 18:00-18:20 <span class="org-italic">:review:@home:</span>
<span class="org-org-special-keyword"><span class="org-italic">SCHEDULED:</span></span><span class="org-italic"> </span><span class="org-org-sexp-date"><span class="org-italic"><%%(memq (calendar-day-of-week date) '(1 2 3 4 5))></span></span>
* <span class="org-bold">Notes cleaning</span> 18:20-18:30 <span class="org-italic">:review:@home:</span>
<span class="org-org-special-keyword"><span class="org-italic">SCHEDULED:</span></span><span class="org-italic"> </span><span class="org-org-sexp-date"><span class="org-italic"><%%(memq (calendar-day-of-week date) '(1 2 3 4 5))></span></span>
* <span class="org-bold">Agenda cleaning</span> <span class="org-italic">:review:@home:</span>
<span class="org-org-special-keyword"><span class="org-italic">SCHEDULED:</span></span><span class="org-italic"> </span><span class="org-org-date"><span class="org-italic"><2020-09-01 Tue +1m></span></span>
</pre>
</div>
<p>
For recurrent events with people, I do not use the repeating task feature
because I want to be able to cancel a specific meeting if it did not happen
and also to use the entry for taking notes (we will see that below).
</p>
<div class="org-src-container">
<pre class="src src-org"><span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="org-bold">Recurrent</span></span>
* <span class="org-bold">People</span>
* <span class="org-bold">Student A (weekly meeting)</span> <span class="org-italic">:meeting:</span>
* <span class="org-bold">Student A</span> <span class="org-italic">:@canceled:</span>
<span class="org-org-date"><span class="org-italic"><2020-09-14 Mon 10:00-11:00></span></span>
* <span class="org-bold">Student A</span> <span class="org-italic">:@online:</span>
<span class="org-org-date"><span class="org-italic"><2020-09-07 Mon 10:00-11:00></span></span>
* <span class="org-bold">Student A</span> <span class="org-italic">:@imn:</span>
<span class="org-org-date"><span class="org-italic"><2020-09-14 Mon 10:00-11:00></span></span>
</pre>
</div>
<p>
For these recurrent events, I write them directly into the agenda file at
the end of a meeting where we generally agree on next meeting. Here is
<a href="https://emacs.stackexchange.com/questions/10504">quick reminder</a> by <a href="https://emacs.stackexchange.com/users/780/glucas">Greg Lucas</a> on how to enter date and their definition:
</p>
<dl class="org-dl">
<dt><b>PLAIN timestamp</b> (<code>C-c .</code>)</dt><dd>This is used for things like appointments where
the entry occurs at a specific date/time. Such an entry will show up in
the agenda on the specified day, and will not show up after that day has
passed. Note that an appointment in the past won't keep showing up on
your agenda regardless of whether you mark it DONE: if you didn't go to
your doctor's appointment yesterday, that doesn't mean you still have one
today!</dd>
<dt><b>SCHEDULED timestamp</b> (<code>C-c C-s</code>)</dt><dd>This is used to indicate when you intend to
do the task. It will show up on the agenda on the scheduled day. If you
don't complete the task at that time, it will continue to show up on the
agenda on the following days to show you that you have not completed
something that you planned to do.</dd>
<dt><b>DEADLINE timestamp</b> (<code>C-c C-d</code>)</dt><dd>This is used to indicate when something must
be completed. Typically you want to see deadlines ahead of time, so that
you can do whatever it is that must be done to meet them. Like a
scheduled entry, if you miss a deadline it will continue to appear on the
agenda as past due.</dd>
<dt><b>INACTIVE timestamp</b> (<code>C-c !</code>)</dt><dd>This is when you want to attach a date to an
entry but do not want it to show up in the agenda at all. Inactive
timestamps have no special behavior.</dd>
</dl>
</div>
</div>
<div id="outline-container-org8696764" class="outline-3">
<h3 id="org8696764">Meetings & notes</h3>
<div class="outline-text-3" id="text-org8696764">
<p>
Now it is time to define a new capture template for registering a meeting.
</p>
<div class="org-src-container">
<pre class="src src-lisp">(<span class="org-string">"m"</span> <span class="org-string">"Meeting"</span> entry (file+headline <span class="org-string">"agenda.org"</span> <span class="org-string">"Future"</span>)
,(concat <span class="org-string">"* %? :meeting:\n"</span>
<span class="org-string">"<%<%Y-%m-%d %a %H:00>>"</span>))
</pre>
</div>
<p>
It is not very complicated: any meeting will be filed in <code>agenda.org</code> under
the <b>Future</b> header (and will be refiled later, during agenda review). By
default, the timestamp is the current day with a rounded clock since my
meetings generally starts at plain hours. When invoked, this template looks
like:
</p>
<div class="org-src-container">
<pre class="src src-org"><span class="org-bold">Capture buffer. Finish 'C-c C-c', refile 'C-c C-w', abort 'C-c C-k'.</span>
<span class="org-org-level-1">* </span><span class="org-org-level-1"><span class="custom">_</span></span><span class="org-org-level-1"> </span><span class="org-org-level-1"><span class="org-italic">:meeting:</span></span>
<span class="org-org-date"><span class="org-italic"><2020-09-11 Fri 11:00></span></span>
</pre>
</div>
<p>
When I enter a meeting, I generally use the name of people that will be
present at the meeting (if there are not too many people) or the topic of
the meeting. The goal is to have short but useful information when the
meeting shows up in my agenda.
</p>
<p>
The next step is to define a "Note" template that will be used to take
notes during a meeting:
</p>
<div class="org-src-container">
<pre class="src src-lisp">(<span class="org-string">"n"</span> <span class="org-string">"Note"</span> entry (file <span class="org-string">"notes.org"</span>)
,(concat <span class="org-string">"* Note (%a)\n"</span>
<span class="org-string">"/Entered on/ %U\n"</span> <span class="org-string">"\n"</span> <span class="org-string">"%?"</span>))
</pre>
</div>
<p>
We will (temporarily) store these notes in a <code>notes.org</code> dedicated file.
Maybe you've noticed the "<code>%a</code>", in the template. This is a <a href="https://orgmode.org/manual/Template-expansion.html#Template-expansion">template
extension</a> that will be resolved to the content created with the
<b>org-store-link</b> command. However, if you capture a note while your cursor is
on the same line of an agenda entry, the content will be filled with this
entry. This is super convenient to link your note with the agenda entry.
</p>
<p>
My initial <code>notes.org</code> is as follows:
</p>
<div class="org-src-container">
<pre class="src src-org"><span class="org-org-meta-line">#+STARTUP: content showstars indent</span>
<span class="org-org-meta-line">#+FILETAGS: notes</span>
</pre>
</div>
<p>
Nothing fancy here since it is actually a temporary storage, notes will be
later moved to the relevant project they belong to.
</p>
</div>
</div>
<div id="outline-container-org6db3673" class="outline-3">
<h3 id="org6db3673">Summary</h3>
<div class="outline-text-3" id="text-org6db3673">
<p>
Here is our updated configuration:
</p>
<details><summary><b>GTD.el</b> (version 2)</summary>
<div class="org-src-container">
<pre class="src src-lisp">(<span class="org-keyword">require</span> '<span class="org-constant">org</span>)
(setq org-directory <span class="org-string">"~/Documents/org"</span>)
(setq org-agenda-files (list <span class="org-string">"inbox.org"</span> <span class="org-string">"agenda.org"</span> <span class="org-string">"notes.org"</span>))
(setq org-capture-templates
`((<span class="org-string">"i"</span> <span class="org-string">"Inbox"</span> entry (file <span class="org-string">"inbox.org"</span>)
,(concat <span class="org-string">"* TODO %?\n"</span>
<span class="org-string">"/Entered on/ %U"</span>))
(<span class="org-string">"m"</span> <span class="org-string">"Meeting"</span> entry (file+headline <span class="org-string">"agenda.org"</span> <span class="org-string">"Future"</span>)
,(concat <span class="org-string">"* %? :meeting:\n"</span>
<span class="org-string">"<%<%Y-%m-%d %a %H:00>>"</span>))
(<span class="org-string">"n"</span> <span class="org-string">"Note"</span> entry (file <span class="org-string">"notes.org"</span>)
,(concat <span class="org-string">"* Note (%a)\n"</span>
<span class="org-string">"/Entered on/ %U\n"</span> <span class="org-string">"\n"</span> <span class="org-string">"%?"</span>))
(<span class="org-string">"@"</span> <span class="org-string">"Inbox [mu4e]"</span> entry (file <span class="org-string">"inbox.org"</span>)
,(concat <span class="org-string">"* TODO Reply to \"%a\" %?\n"</span>
<span class="org-string">"/Entered on/ %U"</span>))))
(<span class="org-keyword">defun</span> <span class="org-function-name">org-capture-inbox</span> ()
(interactive)
(call-interactively 'org-store-link)
(org-capture nil <span class="org-string">"i"</span>))
(<span class="org-keyword">defun</span> <span class="org-function-name">org-capture-mail</span> ()
(interactive)
(call-interactively 'org-store-link)
(org-capture nil <span class="org-string">"@"</span>))
<span class="org-comment-delimiter">;; </span><span class="org-comment">Use full window for org-capture</span>
(add-hook 'org-capture-mode-hook 'delete-other-windows)
(define-key global-map (kbd <span class="org-string">"C-c a"</span>) 'org-agenda)
(define-key global-map (kbd <span class="org-string">"C-c c"</span>) 'org-capture)
(define-key global-map (kbd <span class="org-string">"C-c i"</span>) 'org-capture-inbox)
<span class="org-comment-delimiter">;; </span><span class="org-comment">Only if you use mu4e</span>
<span class="org-comment-delimiter">;; </span><span class="org-comment">(require 'mu4e)</span>
<span class="org-comment-delimiter">;; </span><span class="org-comment">(define-key mu4e-headers-mode-map (kbd "C-c i") 'org-capture-mail)</span>
<span class="org-comment-delimiter">;; </span><span class="org-comment">(define-key mu4e-view-mode-map (kbd "C-c i") 'org-capture-mail)</span>
</pre>
</div>
</details>
<p>
The set of available commands is now:
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<colgroup>
<col class="org-left" />
<col class="org-left" />
<col class="org-left" />
</colgroup>
<thead>
<tr>
<th scope="col" class="org-left">Command</th>
<th scope="col" class="org-left">Bindings</th>
<th scope="col" class="org-left">Mode + where</th>
</tr>
</thead>
<tbody>
<tr>
<td class="org-left">Agenda</td>
<td class="org-left"><b>C-c a</b></td>
<td class="org-left">any</td>
</tr>
<tr>
<td class="org-left">Agenda for today</td>
<td class="org-left"><b>C-c a a</b></td>
<td class="org-left">any</td>
</tr>
<tr>
<td class="org-left"> </td>
<td class="org-left"> </td>
<td class="org-left"> </td>
</tr>
<tr>
<td class="org-left">Capture menu</td>
<td class="org-left"><b>C-c c</b></td>
<td class="org-left">any</td>
</tr>
<tr>
<td class="org-left">Capture meeting (agenda.org)</td>
<td class="org-left"><b>C-c c m</b></td>
<td class="org-left">any</td>
</tr>
<tr>
<td class="org-left">Capture meeting note (notes.org)</td>
<td class="org-left"><b>C-c c n</b></td>
<td class="org-left">any</td>
</tr>
<tr>
<td class="org-left">Capture generic TODO (inbox.org)</td>
<td class="org-left"><b>C-c i</b> or <b>C-c c i</b></td>
<td class="org-left">any</td>