Ever since I started on this “Wicked Cool Emacs” project with No Starch Press, I’ve run into all sorts of amazing geeks who have been working on something similar. For example, Ted Roden‘s further along in writing the book than I am. It would be a shame to waste that effort. <laugh>
I would love to work on this book with other people. I think that it would become an even better book than I could write by myself, just as Emacs is better because all these people have worked on it. Besides, I’d love an opportunity to widen my Emacs network!
So here’s the outline I planned:
|A Day in the Life||30 pages|
|Customizing Emacs||20 pages|
|Working with Files||80 pages|
|Working with Code||40 pages|
|Browsing the Web||15 pages|
|Reading Mail with Gnus||30 pages|
|Being Big Brother||30 pages|
|Taking Notes||35 pages|
|Managing Tasks||35 pages|
|Managing Your Schedule||20 pages – DRAFTED AND SENT, YAY!|
|Other weird stuff||?|
I’d be totally happy to co-author this book with someone else who can commit time over the next year to help me do it. Take a look at the first chapter I’ve written: Organizing your schedule (OpenOffice.org document). I know you can do better than that. =) Let’s find out how wonderful we can make this book.
If you’re seriously interested in coauthoring this, get in touch with me and we’ll talk to the folks over at NSP.
Random Emacs symbol: message-insert-disposition-notification-to – Command: Request a disposition notification (return receipt) to this message.
Do you remember what it was like to be new to the job? I do. I
remember it like it was yesterday. Wait, it _was_ yesterday. I was in
a customer meeting with all these people who were trying to solve a
problem. I was just fascinated by all the stories and insights
and perspectives they shared, and I knew that I was nowhere
near being able to contribute something like that.
I’ve read that new graduates often come into the workplace thinking
they know everything. There’s no danger of that here. From my point of
view, I don’t know anything compared to these folks. I keep warning my
teammates not to expect that I know anything. ;) On the way into the
meeting yesterday, I told my teammate, “You do know that I’m a
complete newbie at this, right?” She told me that it was fine and that
I shouldn’t worry about it. Well, if she’s okay with that, I guess it
will work out. After all, everyone started from somewhere. =)
So if I can’t bring decades of experience and thought leadership,
what can I bring?
I can bring hard work. Someone needs to take care of the grunt
work, and I’ll happily volunteer for that so that my team members can
be freed up for more creative work. I might even be faster doing that
than other people would be because of the shortcuts I come up with and
the tools I use. Besides, with fewer habits to unlearn, I might
stumble across interesting ways of doing things.
I can bring my questions. Questions make people think, and
maybe they’ll realize something interesting in new.
I can bring my writing and reflections. I’m still a little shy
about speaking up in meetings, but I enjoy thinking about what I
learned during the meeting and writing it up as a blog post or handout
or article. I can make educational materials, too. I’m looking forward
to helping people learn by sharing those handouts and giving people
Even if I’m new, I can bring something to the table.
And so can you. If you’re new to the job, cheer up and don’t be
intimidated by all the other people who do it so easily because of
their experience. If you’re already experienced, please look out for
us newbies and help us settle in. =) After all, everyone has to start
On Technorati: career
Random Emacs symbol: gnus-predicate-implies-unread – Function: Say whether PREDICATE implies unread articles only.
Read her blog for the story of what happened during my convocation. =)
Random Emacs symbol: gnus-mark-article-hook – Variable: *A hook called when an article is selected for the first time.
Today was a day for catching up with old friends. I spent an hour
catching up with Clair Ching over the webcam
this morning, and another hour with
Kendra Castillo in the
evening. It was good to talk to them again. Many of the things we’ve
gone through or are going through are surprisingly similar. =)
Random Emacs symbol: gnus-group-make-help-group – Command: Create the Gnus documentation group.
What I know is nothing compared to what I will learn, and what I will
learn is nothing compared to what is knowable. That was the key thought for this week as I went into my second client
engagement, this time with a financial services firm. There’s just so
much to learn. It’s a little bit intimidating,
but even though I’m new, I can bring useful things to the table: my
questions and my notes. If I take in as much as I can from lots of
different people and serve as a conduit between them, then that’ll be
a good way to get started.
The second key thing about this week was reconnection. I pinged Michael Nielsen and Jennifer Dodd after I finished “Made to Stick”, which they had highly recommended to me. I also Cc’d Driss Benzakour, who shares my interest in business books. I had fun chatting with him when he called me to catch up. Gabriel Mansour also e-mailed to say that he missed my tea parties, so we’re going to have another one on Dec 9 (Sunday). I also had webcam conversations with Clair Ching, Kendra Castillo, and my mom. I briefly got to talk to my dad, too. Oh, and I got plenty of cheers and feedback on the first chapter of my book. Yay! =)
The third key thing about this week (ah, gotta love the structure of threes) was that I learned more about the power of stories. Thanks to
I saw how the stories people told through their blogs helped me discover deep and wonderful things about the company I’ve joined, and how my blog can help me practice storytelling. I’ll try to tell more stories, and I hope to practice some of the things I’ve learned from the books I read. =)
My goals for next week are:
On Technorati: weekly
Random Emacs symbol: bbdb/gnus-split-nomatch-function – Variable: *This function will be called after searching the BBDB if no place to
I didn’t have a lot of energy today, and even my IBM team mate noticed
it. Perhaps it was the stress of fighting with the wiki I was using
this morning. Perhaps information overload from trying to organize so
many case studies and thoughts. Perhaps it was last night’s
high-energy DemoCamp, when I was out until 11. Perhaps it was the
embarrassment of being late and needing help finding the meeting room
this afternoon. Perhaps it was the effort of forcing myself to stay
awake (or at least not nod off too obviously) during the
conference-call interview. (I have to get better at sitting
still in one spot and listening actively.) Whatever the reason—or
combinations of reasons—today wasn’t one of my best days.
I did find the energy, though, to give one of my friends a big warm
virtual hug and a pep talk that she much appreciated. There’s always
energy for the important things in life.
Good thing I learned: many people don’t mind helping if you ask them
nicely. It makes them smile, too, remembering what it was like when
they were new. =)
How can I make this better in the future?
What do you do during low-energy days?
Random Emacs symbol: x-uses-old-gtk-dialog – Function: Return t if the old Gtk+ file selection dialog is used.
This morning was another stressful one, but that was my doing. I had stayed up late last night playing with Free Rice. (Word quizzes! For charity!) As a result, I hadn’t gotten up until 7:15. A mad scramble for the door might have worked better than a non-rushed-but-not-leisurely breakfast; perhaps next time. In any case, I arrived at 120 Bloor East ten minutes late for our team call.
I will fix that tomorrow. I hate being late. I hate being late more than I like staying up, so that should be easy.
After a morning of meetings, I was frustrated when I couldn’t quite make progress on the market scan I needed to do for a team member. I just couldn’t think of the right words that I could use to find news. I kept running into the same things I turned up during the previous market scan I did for the company. After a short chat with my team member, I tried reframing it from a market scan (“What are people out there doing in this space?”) into a brainstorming session (“How can we make this better?”), and _then_ the ideas started flowing. Sometimes it’s all about what question you ask.
I’m getting a little uncomfortable about one aspect, though. I don’t think I have a good process yet for assembling a large variety of information. I need to do market scans and stay abreast of developments, and it’s absolutely fantastic that there are blogs covering most of the areas I’m looking into. But I don’t yet have a good way to organize this information so that I can see patterns and summarize them easily. Maybe a mindmap. http://freemind.sourceforge.net/wiki/index.php/Main_Page just released a new test version, and I’m looking forward to giving it a try.
I used another mind map on MindMeister
to share my brainstorming with my team member. It was _fun_ thinking
creatively, and I’m back to feeling a sense of centered-ness that I’d
missed over the past few days. One of the things I’ll need to practice
is to build that time and space into my schedule, even if it means
admitting that yes, I don’t have spare cycles for something.
Now there’s something important. It’s not really saying, “No, I can’t
do that,” just helping people see that it might take longer than
expected. If I help adjust the level of expectations (or
“level-setting” in businessese), then other people can plan more
accurately around me. Again, this sense of how many ‘cycles’ I can
spare is something I’ll need to develop over time! <laugh> What
Saying yes to everything is a quick way to burn out. I don’t think I’m
close to that yet, but it’s good to practice managing people’s
expectations so that I’ll be good at it when it really matters. Not
that I’m going to waste any time, of course, but it’s better to
deliver more than expected than it is to deliver less.
On Technorati: work
Random Emacs symbol: nntp-telnet-command – Variable: *Telnet command used to connect to the nntp server.
The photos are available under the Creative Commons Sharealike license. Let me check with Simon about access…
Random Emacs symbol: other-calendars-buffer – Variable: Name of the buffer used for the display of date on other calendars.
If you’re anything like me, your task list is long and growing, but
the time you have is just as fixed. How do you manage that? I handle
that problem by looking at my calendar and my task list together when
I’m planning my day. I tend to be too optimistic about my tasks,
trying to schedule more into my day than I should. Fortunately, Emacs
can help me make sure I don’t overcommit. Here’s how it works.
When I create and schedule tasks, I try my best to add time estimates.
The numbers in the TODO headline represent minutes.
* TODO 15 Announce tea party SCHEDULED: <2007-12-08 Sat> * DONE 30 Drop letters off at post office SCHEDULED: <2007-12-08 Sat> * TODO 60 Write blog post about tasks SCHEDULED: <2007-12-08 Sat> * TODO 60 Make book notes SCHEDULED: <2007-12-09 Sun> * TODO 30 Start on my letter for 2007 SCHEDULED: <2007-12-08 Sat> * TODO 60 Follow up with DemoCamp contacts SCHEDULED: <2007-12-08 Sat> DEADLINE: <2007-12-09 Sun> * TODO 60 Respond to mail SCHEDULED: <2007-12-08 Sat>
Then my custom agenda view looks like this:
Day-agenda: Saturday 8 December 2007 6:00...... -------------------- 8:00...... -------------------- 10:00...... -------------------- 12:00...... -------------------- 14:00...... -------------------- 14:00-17:15 Scheduled: TODO Take another driving lesson - emergency stuff 16:00...... -------------------- 18:00...... -------------------- 20:00...... -------------------- 22:00...... -------------------- In 1 d.: TODO 60 Follow up with DemoCamp contacts Scheduled: TODO 15 Announce tea party Scheduled: TODO 60 Write blog post about tasks Scheduled: TODO 30 Start on my letter for 2007 Scheduled: TODO 60 Follow up with DemoCamp contacts Scheduled: TODO 60 Respond to mail In 937 d.: 101 things in 1001 days 62.7% load: 225 minutes to be scheduled, 359 minutes free, 134 minutes gap
I’ll need to figure out over the next few weeks what kind of a load
threshold is good (you really don’t want to try for 100%), but at
least it’s visible!
(setq org-agenda-custom-commands '(("i" "My agenda" ((org-agenda-list nil nil 1) (sacha/org-load))) ;; ... other stuff goes here )) (defun sacha/org-show-load () "Show my unscheduled time and free time for the day." (interactive) (let ((time (sacha/org-calculate-free-time ;; today (calendar-gregorian-from-absolute (time-to-days (current-time))) ;; now (let* ((now (decode-time)) (cur-hour (nth 2 now)) (cur-min (nth 1 now))) (+ (* cur-hour 60) cur-min)) ;; until the last time in my time grid (let ((last (car (last (elt org-agenda-time-grid 2))))) (+ (* (/ last 100) 60) (% last 100)))))) (message "%.1f%% load: %d minutes to be scheduled, %d minutes free, %d minutes gap" (/ (car time) (* .01 (cdr time))) (car time) (cdr time) (- (cdr time) (car time))))) (defun sacha/org-load (match) "Can be included in `org-agenda-custom-commands'." (let ((inhibit-read-only t) (time (sacha/org-calculate-free-time ;; today (calendar-gregorian-from-absolute org-starting-day) ;; now if today, else start of day (if (= org-starting-day (time-to-days (current-time))) (let* ((now (decode-time)) (cur-hour (nth 2 now)) (cur-min (nth 1 now))) (+ (* cur-hour 60) cur-min)) (let ((start (car (elt org-agenda-time-grid 2)))) (+ (* (/ start 100) 60) (% start 100)))) ;; until the last time in my time grid (let ((last (car (last (elt org-agenda-time-grid 2))))) (+ (* (/ last 100) 60) (% last 100)))))) (goto-char (point-max)) (insert (format "%.1f%% load: %d minutes to be scheduled, %d minutes free, %d minutes gap" (/ (car time) (* .01 (cdr time))) (car time) (cdr time) (- (cdr time) (car time)))))) (defun sacha/org-calculate-free-time (date start-time end-of-day) "Return a cons cell of the form (TASK-TIME . FREE-TIME) for DATE, given START-TIME and END-OF-DAY. DATE is a list of the form (MONTH DAY YEAR). START-TIME and END-OF-DAY are the number of minutes past midnight." (save-window-excursion (let ((files org-agenda-files) (total-unscheduled 0) (total-gap 0) file rtn rtnall entry (last-timestamp start-time) scheduled-entries) (while (setq file (car files)) (catch 'nextfile (org-check-agenda-file file) (setq rtn (org-agenda-get-day-entries file date :scheduled :timestamp)) (setq rtnall (append rtnall rtn))) (setq files (cdr files))) ;; For each item on the list (while (setq entry (car rtnall)) (let ((time (get-text-property 1 'time entry))) (cond ((and time (string-match "\\([^-]+\\)-\\([^-]+\\)" time)) (setq scheduled-entries (cons (cons (save-match-data (appt-convert-time (match-string 1 time))) (save-match-data (appt-convert-time (match-string 2 time)))) scheduled-entries))) ((and time (string-match "\\([^-]+\\)\\.+" time) (string-match "^[A-Z]+ \\([0-9]+\\)" (get-text-property 1 'txt entry))) (setq scheduled-entries (let ((start (and (string-match "\\([^-]+\\)\\.+" time) (appt-convert-time (match-string 1 time))))) (cons (cons start (and (string-match "^[A-Z]+ \\([0-9]+\\)" (get-text-property 1 'txt entry)) (+ start (string-to-number (match-string 1 (get-text-property 1 'txt entry)))))) scheduled-entries)))) ((string-match "^[A-Z]+ \\([0-9]+\\)" (get-text-property 1 'txt entry)) (setq total-unscheduled (+ (string-to-number (match-string 1 (get-text-property 1 'txt entry))) total-unscheduled))))) (setq rtnall (cdr rtnall))) ;; Sort the scheduled entries by time (setq scheduled-entries (sort scheduled-entries (lambda (a b) (< (car a) (car b))))) (while scheduled-entries (let ((start (car (car scheduled-entries))) (end (cdr (car scheduled-entries)))) (cond ;; are we in the middle of this timeslot? ((and (>= last-timestamp start) (<= last-timestamp end)) ;; move timestamp later, no change to time (setq last-timestamp end)) ;; are we completely before this timeslot? ((< last-timestamp start) ;; add gap to total, skip to the end (setq total-gap (+ (- start last-timestamp) total-gap)) (setq last-timestamp end))) (setq scheduled-entries (cdr scheduled-entries)))) (if (< last-timestamp end-of-day) (setq total-gap (+ (- end-of-day last-timestamp) total-gap))) (cons total-unscheduled total-gap))))
Random Emacs symbol: select-safe-coding-system-function – Variable: Function to call to select safe coding system for encoding a text.
I’m curled up in front of the fireplace, writing on my laptop as W- and J- read books. We’ve just come back from a trip to the library, and I brought back eight books that I’m looking forward to reading. I’ve started on a whole ‘nother reading tear, this time about storytelling. My current source for book recommendations? LibraryThing. In particular, the catalogs of people like victors (2211 books!) provide me with plenty of great titles for topics like storytelling. Tip: find mavens and read everything they read. ;)
On Technorati: reading
Emacs symbol: pgg-add-passphrase-to-cache – Function: Associate KEY with PASSPHRASE in time-limited passphrase cache.
“I could warn you that I can’t sing,” I joked.
Mike Tsang had invited me to join a Christmas
caroling group. Rehearsals tomorrow, then carols at a hospital on
Wednesday. I’d better be a quick study. Well, it’s a choir; as long as
I don’t sing too loudly, I’ll blend in. I love singing, and I’d love
to be more comfortable with it. And it’s not a bad time to sing, too,
with familiar tunes and more forgiving people. ;)
I listened to the Christmas CDs from the UP Singing Ambassadors
yesterday. It always amazes me that people can sing so beautifully,
and I really enjoyed listening to the Tagalog Christmas carols. (Come
to think of it, I know people who would like to hear them too.)
Listening to songs like “Noche Buena” took me right back to Paskorus,
our annual choral contest in high school. I remember how Simonette
Santos, one of our musically-talented classmates, would play the piano
and help conduct the rest of us tone- and rhythm-deaf geeks. ;)
Somehow we survived. Somehow we even won, one of those years.
(Facebook tells me that Simonette has a four-month old baby. More on the baby blog.)
Toronto seems strangely quiet during the holiday season. Sure, there
are plenty of holiday decorations. The supermarkets and department
stores all play cheery (but slow-paced) tunes to brighten the mood and
encourage browsing. At 120 Bloor E, there’s even a Christmas tree
festooned with computer mice and network cards that have been
spraypainted gold. But no streetkids rattling home-made tambourines
and cheerfully belting out off-key carols, no aroma from
freshly-made bibingka, no parols.
I’m going to make a parol. We know where to get bamboo, and I can find
decorative paper easily. J- will like the crafts bit. This weekend…
Random Emacs symbol: whitespace-buffer – Command: Find five different types of white spaces in buffer.
Let me tell you about a recent example of how social computing can help us form better relationships with our clients.
It started on December 7, when we were heading into the elevator at the end of the day. Making small talk, one of the clients asked me, “How long have you been with IBM?” “Two months,” I answered. I thought I saw a look of surprise flash across his face. I remembered belatedly that companies don’t generally like being sent fresh trainees with no experience. I hurried to say that I had just finished my master’s degree and that my research focused on expertise location using social media in a large organization, which was a good fit for what the clients wanted to do. I had scarcely explained myself when the elevator door opened and we had to go on our separate ways.
The client team knew my teammate from years of working together, and had originally intended to get only her services for this engagement. She had convinced them to take on an additional resource, a junior consultant with some more exposure to social media and networking–me. Still thinking of my gaffe in the elevator and feeling very junior indeed, it was with more than a little doubt that I walked to the client office the next Monday, December 10. During the commute, I thought about how I could establish my credibility and help the clients feel that they were getting value. Perhaps I could prepare a short narrative bio or send them a copy of my resume. It didn’t help the bulk of my project work wouldn’t be visible for a while. I didn’t want the clients to feel shortchanged.
I think it’s fair to say that in the past, that negative impression might have stuck with them. Had I given them an impressive resume, they would probably have been even more cautious, having seen overstated accomplishments before. At least I had a personal recommendation from someone they trusted. I was there because my teammate vouched for me. But clients are not in the business of training or education, and most clients would prefer getting the most experienced person available.
But I shouldn’t have worried. When I walked into the boardroom with the other members of the client team, the client I chatted with in the elevator casually mentioned that he had checked out my blog over the weekend. He thought that my Flickr photos were cool. He remarked that he felt he knew me more than he knew some of the other members on the team, at least on a personal basis. Another client noted that he does better business with people he likes, and that getting to know people is important.
It was the perfect segue into my story about social computing. In the minutes before the start of our working session, I shared with them how that kind of quick, deep connection is one of the things I find so amazing about social computing, and how I am passionate about helping companies help people connect in that and other ways. With that shared context, I found it so much easier to relate to the clients, and it seems they found it easier to connect with me, too. And now that I’ve also checked out some of their blogs and profiles, we’ve discovered that we have quite a few things in common. I care more about their success now that I know who they are, and I hope that they feel more comfortable working with me.
I’m looking forward to having more of these moments in the future. =)
I left my purse at the Bay food court at around 1:30 this afternoon.
When I realized this at 5:00, I spent few minutes of frantic rushing
about with a pounding pulse, checking asking cleaning personnel and
security desks if a purse was reported found. I made a few calls
cancelling my evening plans, borrowed transit fare from my manager,
and headed home. (It would have been difficult to sing festive
Christmas carols in that state of mind.)
A few years ago, I might have spent the commute home fretting.
Instead, calmed by the realization that there wasn’t anything else
I could do about it at the moment and that it was just
stuff anyway, I continued reading Denning’s book (“The Leader’s
Guide to Storytelling”, a very good read).
W- greeted me at the door with a big warm hug. I shucked my coat and
proceeded to the kitchen, where I booted up the little computer that
held the encrypted backup of my account numbers. I called TD,
PCFinancial, Fido, and the Toronto Public Library to block my
accounts. I also called the Toronto Police, and a friendly police
officer promptly called me back for the police report.
I’m getting better at dealing with the consequences of these mistakes.
It’s just stuff. Credit and debit cards can be cancelled, phones can
be blocked and replaced, identification can be flagged and reissued,
and cash I can subtract from my play money budget. And I’m still
looking forward to finding the purse at the lost and found counter
tomorrow. Some of my favorite letters were in the purse, but W- will
write me more over the years, and the letters themselves are not
important; the sentiments within them are.
It’s just stuff. While paying more attention will definitely help in
the future, there’s no reason to beat myself up about it—which W-
gently helps me remember whenever I forget this and let out a
frustrated “I suck!”. I’m glad he’s around and that he’s so understanding.
My personal challenge is blur. It’s an evil, evil thing. A
moment’s inattention is all it takes for me to not see something I’m
looking for, lose a set of keys, or leave a purse. I’m going through
the motions of doing something, but I’m not fully present, so things
slip through the cracks. I may remember something about the key
moment, but I don’t remember enough of the context in order to easily
find things again, and my memories are disjointed. This feeling sucks.
When does this happen? When I’m thinking about other things, when I’m
running on autopilot, when I’m rushed. Misplacing small things or
detecting small inconsistencies usually serves as a good warning sign
that something’s taking up too much of my thought on the whole. If I
don’t slow down and pay more attention to what I’m doing, it gets
Here’s what I need to do in order to avoid this:
It’s a constant struggle against blur. How do you manage this?
Random Emacs symbol: undo-extra-outer-limit – Variable: If non-nil, an extra level of size that’s ok in an undo item.
On Technorati: blur
Add this as yet another story about Filipinos doing good. =)
A customer brought my lost purse to Josie, the owner of Subs Plus in
the food court under the Bay building at Yonge and Bloor. Josie tried
every way to get in touch with me, even calling the Philippines long
distance. (Must’ve tried calling my mom and gotten a busy signal.)
She eventually got in touch with Michael McGuffin, who was still part
of my speed dial list despite having moved to Montreal. (Hey, in an
emergency… =) ) She left a message, which Michael e-mailed me, but I
was already in bed at that time.
I finally got to connect with her today. And yes, she’s from the
Philippines – Baguio, to be precise. When I learned that she was also
from home, I burst into a flood of even more profuse thanks.
I’m looking forward to getting to know her. =) And giving her some
thank-you gifts in addition to a small cash reward… Happy happy!
If you’re ever in Toronto, please drop by and tell her, “Thank you for
Conference reports are a great way to help share knowledge and justify
the expense of conference travel, but attendees are often so busy
learning and networking that they don’t have the time to send detailed
conference reports from the road. Postponing the report-writing to the
plane trip back could mean many lost insights and lost momentum.
Liveblogging can help. With a little preparation, conference
reports can be posted and shared with coworkers and the rest of the
world within ten minutes of the presentation. Ethan Zuckerman and Bruno
Giussani have put together a collection of terrific tips for conference bloggers, which you should read before you head out to your next conference.
Ingredients for the sketchblog:
I’m looking forward to sketchblogging a lot. It’s so much fun playing with color… =)
Random Emacs symbol: window-live-p – Function: Returns t if OBJECT is a window which is currently visible.
The week was full of starts and stops and starts again. I practiced
Christmas carols with Mike Tsang last Tuesday because I wanted to join
the caroling group for a quick whirl through one of the hospitals, but
I lost my purse on Wednesday and couldn’t make to caroling. (I got my
purse back last Friday, but I’m still waiting for all my cards to be
I went to several client meetings and I’ve been working on some of the
material they need, but I still don’t have access to a wiki I can put
them on. Still, they loved Google Calendar, and I’m glad I showed them
how shared calendars can be awesome.
And oooh, I got the DS Lite I ordered, and I’ve set it up for
sketchblogging. This makes me happy.
No progress on the Emacs book, though. I need to tweak my schedule to
make myself more effective.
And no cooking, either… =(
Goals for next week: Client work, think about job, mindmap chapter
outline and really start filing it in. Already halfway through the
On Technorati: weekly
Random Emacs symbol: cddadr – Function: Return the `cdr’ of the `cdr’ of the `car’ of the `cdr’ of X.
- [ ] What you might be using now - [ ] Your brain - [ ] Paper - [ ] A text file - [ ] A sophisticated task management system - [ ] The power of customization (tell a story) - [ ] Integrating with your non-Emacs life
- [ ] Top-down - [ ] Bottom-up - [ ] Combining both strategies - [ ] The daily and weekly reviews
- [ ] Outline-oriented planning, dynamic views - [ ] Day orientation, more flexibility in prioritizing individual tasks, publishing, sharing additional information
- [ ] A day in the life - [ ] The basics - [ ] Working with tasks - [ ] Viewing your task list - [ ] Prioritizing tasks - [ ] Scheduling tasks - [ ] Viewing your agenda - [ ] Marking a task as done - [ ] Weekly reviews - [ ] Intermediate topics - [ ] Clocking time - [ ] Repeating tasks - [ ] Working with projects - [ ] Working with tags - [ ] Advanced stuff - [ ] Managing multiple identities - [ ] Estimating your time - [ ] Publishing your task list - [ ] Twitter task updates - [ ] Daily task list - [ ] Project summary
- [ ] A day in the life - [ ] The basics - [ ] Working with tasks - [ ] Viewing your task list for the day - [ ] Prioritizing tasks - [ ] Scheduling tasks - [ ] Marking a task as done - [ ] Weekly reviews - [ ] Intermediate topics - [ ] Clocking time - [ ] Working with plan pages - [ ] Task overviews - [ ] Repeating tasks - [ ] Advanced stuff - [ ] Estimating your time - [ ] Publishing your task list - [ ] Private information in your tasks - [ ] Twitter task updates - [ ] Daily task list - [ ] Project summary
Random Emacs symbol: appt-display-format – Variable: How appointment reminders should be displayed.
The tips Joseph Miklojcik shared for reading e-mail in Gnus included this _really_ nifty thing that I hadn’t come across when I set up my Gnus before: multi-pane reading.
You know how modern news readers have a folder pane, a summary pane
and a preview pane?
Well, you can have that too.
(gnus-add-configuration '(article (horizontal 1.0 (vertical 60 (group 1.0)) (vertical 1.0 (summary 0.20 point) (article 1.0))))) (gnus-add-configuration '(summary (horizontal 1.0 (vertical 60 (group 1.0)) (vertical 1.0 (summary 1.0 point)))))
This is good stuff. =)
Random Emacs symbol: sacha/gnus-add-subject-to-bbdb-record – Function: Add datestamped subject note for each person this message has been sent to.
There’s nothing like a commute to make me think existentially. ;) The 1.5 hour commute up to and 1.5 hour commute back from 3600 gave me plenty of things to ponder.
My first reaction was to resent the wasted time. I could’ve been on-site! I could’ve stayed home! I could’ve been eating clementine oranges like popcorn instead of debating about whether to get oatmeal from the cafeteria! (The oatmeal _was_ good, though. First time to try it with almond flakes and dried apricots.)
It was tempting to blame other people for assumptions I had and decisions I made, too. If only this, if only that.
And I confess, I didn’t make the most of my time at 3600, either. When my teleconference finished and I confirmed that no one was going to be around all day, I decided to skip the afternoon rush and work from home instead. I didn’t feel comfortable pinging random strangers for a quick coffee/hot chocolate break, and I knew I’d feel better working from home (with healthy food within reach and the freedom to do jumping jacks during my hourly breaks) than working in a cubicle without a good view of sunlight.
Three hours. I kept myself busy. My DS Lite proved really handy as an MP3 player when I was walking and as a game machine when I was sitting down. I listened to executive summaries and book reviews of “Mastery”, “Success Built to Last”, “Citizen Marketers”, and “Go Put Your Strengths to Work”. I played Brain Age 2, getting my brain score down to 25 years. I even drew a little using DS Colors, which I’ve been using to sketchblog. It was not a waste of time, but I still had that nagging feeling that I could have used that time better.
Or could I?
Could I have done anything better at that moment, in that situation: during the commute? No, I don’t think so; I’m reasonably happy with what I did, given the circumstances.
If I didn’t have that commute, could I have used the time more wisely? Now there’s a more interesting question.
Could I have worked more? It was hard to tell today, because I let the stress affect me. Overall, I think my work hours would have been the same, although less stressed.
Could I have done something else to work towards my goals? Write a blog post, write part of my book, hem my pants? Would these alternate activities have been worth _not_ going? I can’t really say that, either. These are things I would like to do, but it wouldn’t be fair to say that I should have been writing instead of commuting, and then still take a break. Downtime is important. Gaps are important. Life needs room.
That seems to be a healthier way to look at it. Start from the assumption that commutes are downtime and that’s okay, then look at the glass as half-full. Maybe throw in a few visualization exercises to take advantage of time, too. Hmm… I’ll try that on my next commute.
As for the other point–not feeling like pinging random strangers–I’m going to try experimenting with being social at IBM. Hey, it worked in TorCamp, it can work at IBM. Of course, it helped that people at TorCamp events were there to network, but still, it’s worth a try. I can meet people and make friends. =)
It’s funny, but the On This Day widget on my personal blog tells me that precisely three years ago, I linked to a post about making sure that there was space in life. The original link is gone now, but here is a mirror of the essay: “Quitting the Paint Factory.” An excerpt:
Ah, but hereâ€™s the rub: Idleness is not just a psychological necessity, reqÂuisite to the construction of a complete human being; it constitutes as well a kind of political space, a space as necessary to the workings of an actual democracy as, say, a free press. How does it do this? By allowing us time to figure out who we are, and what we believe; by allowing us time to consider what is unjust, and what we might do about it. By giving the inner life (in whose precincts we are most ourselves) its due.
“Know the differences between Technology, Features, Benefits, and Value,” Jeremiah Owyang
advises in his blog post about effectively talking to executives and clients about social media. He goes on to provide concrete examples of all four approaches, and suggests how to establish trust and respond to indicators of interest or disinterest. Good stuff.
I’m an emerging technologies evangelist focusing on social computing in the enterprise. Some people come to me with a technology focus. They want to use a blog or a wiki, but their objectives aren’t clear, and they don’t know where to start. Sometimes they start on their own, but they quickly lose interest in it when people don’t reply to their posts or update their wiki. Part of my role as a technology evangelist is to get them from focusing on the technology to focusing on at least the benefits as soon as possible. In order to do that, I need to know who they are and what matters to them. What are they looking for? What words do they use to describe what they do? Listening is a huge part of evangelism. (This makes me want to find another term, actually, as “evangelist” brings up images of people who just talk at other people.)
When I talk about benefits or value, I talk about WIIFM: “What’s in it for me.” It’s a good idea to lead with personal benefits, and let the social benefits follow. Blogs, social bookmarks, wikis… All of these things should pay off for you on a personal level, because the social benefits might not kick in for a while. When I talk to people who are new to blogging, for example, I emphasize how it’s useful as a professional notebook for recording lessons learned and questions to explore. I talk about how the practice I get in thinking about what I think makes it easier for me to talk to other people. I talk about how my blog helps me remember what I’m passionate and excited about. When the personal benefits are established, then I can talk about the social benefits: the unexpected connections, the deeper conversations, the online and offline interactions. But personal benefits have to come first. Otherwise, it becomes a chore and you won’t be able to appreciate the social benefits.
Kids are a great way to show some of those benefits, because kids pick up the technologies that have good WIIFM value. Here’s an example: At a recent kick-off meeting, one of the clients mentioned that he saw his daughter using del.icio.us to coordinate a school project with some of her classmates. Using del.icio.us, they could quickly put together and share relevant sites. And hey, if his daughter could do that, maybe people in his company could, too.
The caveat is that it’s also easy to get locked into thinking of social media as just for the kids, or just for our personal lives. That’s why it’s also important to tell stories about older people using social media. (My mom shares business tips on her blog!) It’s important to tell stories about the business benefits of social media. (I got my job because of my blog, my bookmarks, and my other social stuff!) We need to tell those stories so that we can help people see what’s in it for them and what’s in it for their company.
So how do you talk to people about social media?
I’m writing a chapter on how to use Emacs to manage your tasks. I find it hard to explain why Emacs is so compelling.
I’ve tried all sorts of other task manager before. I used Lotus Organizer, Microsoft Outlook, and Lotus Notes. I’ve tried iPaqs and Palms. I’ve tried Tada List and Remember the Milk (which has an interesting Gmail plugin). I’ve seen people use Life Balance. Heck, I’ve even done the Hipster PDA, index cards, Moleskine hacks, and bits of paper (which I always ended up losing).
I keep coming back to my Emacs.
Day after day, year after year, it’s the only system I’d trust with my plans. (Yes, I trust Emacs with my life. Meep! I’ve really gone off the deep end, haven’t I?)
Why? I spent some time talking things through last night, trying to get to the bottom of the reason why Emacs works for me and why it might work for other people. (Well, I was talking to myself and using a voice recorder, as my significant other is a fan of the Other Editor.)
Hmm. Those last two things there are interesting, because they’re _so_ difficult to demonstrate when people are looking at my computer. Or when I’m writing a book, for that matter.
It’s not just about the freedom to customize it. Many programmers’
development environments are customizable. What’s great—no,
transformational—about task management in Emacs is that each
customization encourages you to explore even more. Here’s how that works:
I think what’s really amazing is that you get _used_ to this process.
You get a crazy idea, you build it in, you’re happy about the hack,
and you’re free to think of other crazy ideas. More than that, you
give your brain permission to think of crazy ideas, because you can
actually make it happen. And you get used to thinking about how you do
things, looking for ways to do things better. And you get used to
talking about things with other people who are also looking for ways
to do things better.
How do I make this process clearer for people? How do I show people
how amazing it is to consciously work on being more effective,
together with other geeks who are doing similar things?
Random Emacs symbol: w3m-list-buffers – Function: Return a list of buffers in which emacs-w3m sessions are open.
I spend most of my day working on or near a computer: writing,
replying to e-mail, making phone calls, and so on. I use Lotus Notes
for my calendar because people need to be able to check my
availability for meetings. I use Emacs to keep track of what I need to
do, because it makes planning my day so much easier.
The first thing I do each morning is quickly go through my e-mail
looking for action items. Instead of leaving them in my mail inbox, I
create tasks for each of the items in my Org to-do list. I add notes
so that I don’t have to find the e-mails again. I also add other tasks
that come to mind. I add time estimates whenever I can.
This step is also a good time to review my personal objectives and
proactively set myself some tasks so that I can move towards them. For
example, if I want to learn more about career growth, I can’t wait for
e-mail from someone else telling me what to do. I have to think of
something to do, and build time into my day in order to do it. I put
all those tasks into my task inbox, which is just a header at the
bottom of my task list, like this:
(remove the leading space)
* Inbox ** TODO .... ** TODO ....
Now that I’ve captured all these tasks, I review my day. What are my
appointments? What items are due today? I double-check this against
my official calendar to make sure I haven’t missed any
appointments. After I make sure that the important tasks and
appointments are there, I start filling in gaps, scheduling some of my
important-but-not-urgent tasks onto today.
After I’ve decided what to do that day, I review the rest of the
week. Does my workload look reasonable? Are there upcoming deadlines?
I try to make sure that all of my inbox items have scheduled dates. I
also review my list of waiting tasks to see if I need to follow up
After I’ve gotten the tasks all down and scheduled, it’s easy to
organize them under the appropriate headings. Billable tasks are filed
under the projects they belong to, and unbilled tasks are categorized
by how I need to report them and how I organize them into personal
projects. Organizing tasks into categories AFTER I schedule them means
less jumping around looking for unscheduled tasks.
This process (e-mail scan and daily and weekly overview) takes me
around 15 minutes, and helps keep me sane.
I try to keep my mornings free for creative brainstorming and heavy
lifting. Once I’ve reviewed my plans for the day and the week, I pick
a task and work on it for an hour or so. When I mark the task as
STARTED (“t” or “C-u t” from the Org agenda view), the clock
automatically starts ticking. When I mark the task as WAITING or DONE,
the clock automatically stops. Org timeclocking makes it easier for me
to report my hours at the end of each week. I can also compare the
actual times against my estimates, helping me improve my accuracy.
This process is my morning ritual: putting tasks into my Org agenda,
organizing them, reviewing and planning from my calendar, and then
getting started by working on something useful _before_ I spend time
catching up with the blogosphere or responding to my mail. It’s
complemented by my afternoon ritual of reviewing my completed tasks
with the Org agenda logbook and possibly blogging about some lessons
Here’s how you can use Org to do the same, assuming that you’ve set it
*Read your e-mail and create tasks.* Open your Org file. If it’s not yet in your Org agenda list, add it with C-c [ (org-agenda-file-to-front).
You can jump to the end of the file using M-> (end-of-buffer) and
add tasks just by typing “** TODO ” and the task name. If you read
e-mail in Emacs (and there are plenty of good reasons to do so!), you
can set up Remember Mode to make it easy to create hyperlinked tasks
from mail and other sources. Use C-c C-d (org-deadline) to note
deadlines for the current task, and use C-c C-s (org-schedule) to note
when a task needs to be done on a certain date.
*Review your projects and create tasks.* Tag projects like this:
** Learn about career options within the company :PROJECT:
Then you can use a custom agenda view to see your agenda for today, your projects, and other useful information.
Here’s something you can add to your ~/.emacs:
(global-set-key (kbd "C-c a") 'org-agenda) (setq org-agenda-custom-commands '(("a" "My custom agenda" ((org-agenda-list nil nil 1) (tags "PROJECT-WAITING") (tags-todo "WAITING") (tags-todo "-MAYBE")))))
You can then use C-c a a (org-agenda, custom command) to get an overview of your day/week, your
current projects, your WAITING tasks, and your active tasks.
*Review your day.* Use C-c a a (org-agenda, custom command) to see
your appointments for the day, and open your Org file in another
buffer. Use C-c C-s (org-schedule) in your Org file to schedule some
of your inbox tasks for the day and some of your tasks for other days
in the week. You can use Shift-right and Shift-left to reschedule
tasks from the agenda view. Use “w” in the agenda to switch to a
weekly view, and “d” to switch to a daily view.
If you want to see how your time estimates fit into your workday with
a load estimate like this:
15.8% load: 90 minutes to be scheduled, 570 minutes free, 480 minutes gap
add estimated number of minutes to your tasks like this:
** TODO 60 Browse through a book ** TODO 15 Scan my RSS feeds
and use the following code in your ~/.emacs:
(defun sacha/org-show-load () "Show my unscheduled time and free time for the day." (interactive) (let ((time (sacha/org-calculate-free-time ;; today (calendar-gregorian-from-absolute (time-to-days (current-time))) ;; now (let* ((now (decode-time)) (cur-hour (nth 2 now)) (cur-min (nth 1 now))) (+ (* cur-hour 60) cur-min)) ;; until the last time in my time grid (let ((last (car (last (elt org-agenda-time-grid 2))))) (+ (* (/ last 100) 60) (% last 100)))))) (message "%.1f%% load: %d minutes to be scheduled, %d minutes free, %d minutes gap\n" (/ (car time) (* .01 (cdr time))) (car time) (cdr time) (- (cdr time) (car time))))) (defun sacha/org-agenda-load (match) "Can be included in `org-agenda-custom-commands'." (let ((inhibit-read-only t) (time (sacha/org-calculate-free-time ;; today (calendar-gregorian-from-absolute org-starting-day) ;; now if today, else start of day (if (= org-starting-day (time-to-days (current-time))) (let* ((now (decode-time)) (cur-hour (nth 2 now)) (cur-min (nth 1 now))) (+ (* cur-hour 60) cur-min)) (let ((start (car (elt org-agenda-time-grid 2)))) (+ (* (/ start 100) 60) (% start 100)))) ;; until the last time in my time grid (let ((last (car (last (elt org-agenda-time-grid 2))))) (+ (* (/ last 100) 60) (% last 100)))))) (goto-char (point-max)) (insert (format "%.1f%% load: %d minutes to be scheduled, %d minutes free, %d minutes gap\n" (/ (car time) (* .01 (cdr time))) (car time) (cdr time) (- (cdr time) (car time)))))) (defun sacha/org-calculate-free-time (date start-time end-of-day) "Return a cons cell of the form (TASK-TIME . FREE-TIME) for DATE, given START-TIME and END-OF-DAY. DATE is a list of the form (MONTH DAY YEAR). START-TIME and END-OF-DAY are the number of minutes past midnight." (save-window-excursion (let ((files org-agenda-files) (total-unscheduled 0) (total-gap 0) file rtn rtnall entry (last-timestamp start-time) scheduled-entries) (while (setq file (car files)) (catch 'nextfile (org-check-agenda-file file) (setq rtn (org-agenda-get-day-entries file date :scheduled :timestamp)) (setq rtnall (append rtnall rtn))) (setq files (cdr files))) ;; For each item on the list (while (setq entry (car rtnall)) (let ((time (get-text-property 1 'time entry))) (cond ((and time (string-match "\\([^-]+\\)-\\([^-]+\\)" time)) (setq scheduled-entries (cons (cons (save-match-data (appt-convert-time (match-string 1 time))) (save-match-data (appt-convert-time (match-string 2 time)))) scheduled-entries))) ((and time (string-match "\\([^-]+\\)\\.+" time) (string-match "^[A-Z]+ \\(\\[#[A-Z]\\]\\)? \\([0-9]+\\)" (get-text-property 1 'txt entry))) (setq scheduled-entries (let ((start (and (string-match "\\([^-]+\\)\\.+" time) (appt-convert-time (match-string 1 time))))) (cons (cons start (and (string-match "^[A-Z]+ \\(\\[#[A-Z]\\]\\)? \\([0-9]+\\) " (get-text-property 1 'txt entry)) (+ start (string-to-number (match-string 2 (get-text-property 1 'txt entry)))))) scheduled-entries)))) ((string-match "^[A-Z]+ \\([0-9]+\\)" (get-text-property 1 'txt entry)) (setq total-unscheduled (+ (string-to-number (match-string 1 (get-text-property 1 'txt entry))) total-unscheduled))))) (setq rtnall (cdr rtnall))) ;; Sort the scheduled entries by time (setq scheduled-entries (sort scheduled-entries (lambda (a b) (< (car a) (car b))))) (while scheduled-entries (let ((start (car (car scheduled-entries))) (end (cdr (car scheduled-entries)))) (cond ;; are we in the middle of this timeslot? ((and (>= last-timestamp start) (< = last-timestamp end)) ;; move timestamp later, no change to time (setq last-timestamp end)) ;; are we completely before this timeslot? ((< last-timestamp start) ;; add gap to total, skip to the end (setq total-gap (+ (- start last-timestamp) total-gap)) (setq last-timestamp end))) (setq scheduled-entries (cdr scheduled-entries)))) (if (< last-timestamp end-of-day) (setq total-gap (+ (- end-of-day last-timestamp) total-gap))) (cons total-unscheduled total-gap))))
Then you can add it to your custom agenda by using this in your ~/.emacs:
;; Change your existing org-agenda-custom-commands (setq org-agenda-custom-commands '(("a" "My custom agenda" ((org-agenda-list nil nil 1) (sacha/org-agenda-load) ; ADD THIS LINE (tags "PROJECT-WAITING") (tags-todo "WAITING") (tags-todo "-MAYBE")))))
*Organize your inbox.* Now that you’ve scheduled your tasks, move them
under the appropriate headings. You can use TAB to collapse a task
into a single line, then C-k (kill-line) to cut it and C-y to paste it
elsewhere. I like using C-r (isearch-backward) to search for the right
place in the file.
*Get to work!* You may find it useful to have four states for a task: TODO, STARTED, WAITING, and DONE.
It’s also handy to type in a note when you mark a task as done. To set that up, just add the following to the beginning of your Org file:
#+STARTUP: lognotedone #+SEQ_TODO: TODO STARTED WAITING DONE
Then you can use “t” (org-todo) from the Org agenda view or C-c C-t
(org-todo) from the Org file to mark a TODO task as STARTED, or to
move from one state to the other. To move to a specific state (DONE
from STARTED, for example), either edit it directly or use C-u before
the org-todo command.
Use the following code to automatically clock in when you start a
task, start a task when you clock in, and clock out of a task when you
mark it as waiting.
(defun sacha/org-clock-in-if-starting () "Clock in when the task is marked STARTED." (when (and (string= state "STARTED") (not (string= last-state state))) (org-clock-in))) (add-hook 'org-after-todo-state-change-hook 'sacha/org-clock-in-if-starting) (defadvice org-clock-in (after sacha activate) "Set this task's status to 'STARTED'." (org-todo "STARTED")) (defun sacha/org-clock-out-if-waiting () "Clock in when the task is marked STARTED." (when (and (string= state "WAITING") (not (string= last-state state))) (org-clock-out))) (add-hook 'org-after-todo-state-change-hook 'sacha/org-clock-out-if-waiting)
*Review your accomplishments at the end of the day.* You can use the
Org agenda logbook to see all your completed tasks. From an Org agenda
view such as the custom one you set up for C-c a a, type “l”
(lowercase L). You can then see your completed TODOs.
To review your time usage, you can use C-c C-x C-d (org-clock-display)
from an Org buffer to see time totals according to the tree, or you
can add a table to your custom agenda view. Add the following to your
(defun sacha/org-agenda-clock (match) ;; Find out when today is (let* ((inhibit-read-only t)) (goto-char (point-max)) (org-dblock-write:clocktable `(:scope agenda :maxlevel 4 :tstart ,(format-time-string "%Y-%m-%d" (calendar-time-from-absolute (1+ org-starting-day) 0)) :tend ,(format-time-string "%Y-%m-%d" (calendar-time-from-absolute (+ org-starting-day 2) 0))))))
and then add sacha/org-agenda-clock to your custom agenda in
org-agenda-custom-commands in your ~/.emacs file, like this:
;; Change your existing org-agenda-custom-commands (setq org-agenda-custom-commands '(("a" "My custom agenda" ((org-agenda-list nil nil 1) (sacha/org-agenda-load) (sacha/org-agenda-clock) ; Add this line (tags "PROJECT-WAITING") (tags-todo "WAITING") (tags-todo "-MAYBE")))))
You can then use C-c a a (org-agenda, custom command) to see a table summarizing your clocked-in time for that day.
END RESULT: You can add tasks, quickly get an overview of your day and
week, reschedule tasks until you’ve got a realistic load, keep track
of your progress, and review your accomplishments.
Org keeps me sane. =) The code above only looks like a lot of customization, but it’s well worth it.
Next, I’m going to figure out how to calculate my velocity, or estimated time divided by actual time taken… =)
(Thanks to Pete Bevin for catching a typo! =) )
Random Emacs symbol: floor – Function: Return the largest integer no greater than ARG.
The daily rituals I described yesterday can also be done with Planner, another personal information manager for Emacs. In fact, I spent about four years managing my tasks using Planner before I tried out Org. My process then was similar to my Org process now in that I wrote the tasks down before I tried to organize or do them, and I built in some time for a review. The difference was that I didn’t organize most of my tasks into separate projects (or plan pages, as Planner calls them). Instead, I tended to organize them according to day. This was helpful when publishing my blog, as I could post my task list along with it. I also liked the greater control I had over my daily task list, and I often used blank lines or extra notes to keep things organized.
The core of the process was the same, though:
The first thing I did each day was to put all of my tasks into my
Planner. I briefly scanned through my mail looking for action items,
and whenever I found something I needed to do that would take more
than two minutes, I created a task for it using
planner-create-task-from-buffer. This automatically created a
hyperlink back to the e-mail or file I was reading, and included
useful information such as the e-mail author.
I treated appointments just like tasks, although I added a timestamp
like @13:00 to make it easier to see and sort my appointments.
planner-create-task-from-buffer helped me keep track of reactive
tasks, or things that I needed to do because someone else asked me to
do them. However, I also made a point of reviewing my goals and making
up my own tasks so that I could work on my personal projects. For
example, I had a plan page where I put all my writing ideas, and I
added those tasks to today’s page once in a while.
I also scanned the last few day pages to see if I’d missed anything,
and the next few days to see if I needed to plan for anything.
Although the M-x plan command automatically brings tasks forward, I
didn’t use it to start my day. Instead, I reviewed the last three days
or so, marking tasks that I’d completed but not updated, cancelling
tasks I no longer wanted or needed to do, and rescheduling other tasks
forward using C-c C-c (planner-copy-or-move-task). I also reviewed the
next three days or so. C-c C-j C-y (planner-goto-yesterday) and C-c
C-j C-t (planner-goto-tomorrow) were handy for flipping through pages.
To make the shortcuts shorter and more natural, I bound them to F9 F8
and F9 F10 with:
(global-set-key (kbd "<f9> <f8>") 'planner-goto-yesterday) (global-set-key (kbd "<f9> <f10>") 'planner-goto-tomorrow)
At the end of this step, I had all the things I needed to do scheduled
So the first thing you need to do is get used to creating tasks
quickly. Get them out of your head and into Planner, where you can
then schedule, organize, act on, and review them. You can bind
planner-create-task-from-buffer to a convenient shortcut key such as
C-c t SPC by using the following code in your ~/.emacs:
(global-set-key (kbd "C-c t SPC") 'planner-create-task-from-buffer)
By default, planner-create-task-from-buffer asks you for a date and a
plan page when you create tasks. You can either slow down and think
about this, hit RET twice to accept the defaults, or modify Planner so
that it doesn’t prompt you at all. Being lazy, I chose to let Planner
put all the tasks on today’s page and a copy on the TaskPool plan page
for backup. If I knew I had to do something on a specific date, I
could tell it to prompt for the date by using the prefix argument (C-u
before the command).
Here’s the code that makes that happen:
(defun sacha/planner-read-task () "Do not prompt for date unless the prefix argument is given." (let ((planner-expand-name-favor-future-p t)) (list (read-string "Describe task: ") (if current-prefix-arg (planner-read-date) (planner-today)) "TaskPool" planner-default-task-status))) (defalias 'planner-read-task 'sacha/planner-read-task)
Getting the tasks out of my head often resulted in a long list of
tasks, not all of which I needed to do or could even do that day. Then
it was time to ruthlessly use C-c C-c (planner-copy-or-move-task) and
M-x planner-copy-or-move-region to trim my task list down to a
manageable size. I moved tasks that didn’t need to be done on a
certain date to the TaskPool, which I checked whenever I had some free
If I wanted to assign a task to a specific time, I just added a
timestamp such as @14:30 to the task. I had some code which
automatically sorted the tasks by time, so it would go to the right
I also used M-down and M-up (planner-lower-task and
planner-raise-task) to move tasks around. To visually group tasks, I
added blank lines and explanatory text. For example, I put errands
together and I moved the tasks up and down into a logical order for
If there were a lot of small items in my day, I also separated the
“must-be-dones” from the “nice-to-dos”. This wasn’t related to the
importance of the task, just the urgency. Urgent items went in the
first group, and non-urgent items went in the second group of tasks.
At the end of this step, I had a daily plan page which showed me my
tasks and appointments for the day, in the rough order in which I
planned to do them. I also had some tasks on future days, and some
tasks in my TaskPool.
Now that all my tasks were on the page, it was easy to go through
them. To start working on a task, I marked it as in-progress with C-c
C-i (planner-task-in-progress). If I needed to postpone it, I used C-c
C-p (planner-task-pending). To mark it finished, I used C-c C-x
(planner-task-done). To mark it cancelled, I used C-c C-S-x
(planner-task-cancelled; does not work in some terminals).
Because I had loaded planner-timeclock.el using code like this:
the clock automatically started when I marked tasks as in-progress and stopped when I marked tasks as pending or done. I could also clock out of a task manually by using C-c C-o (timeclock-out).
To review what I did that day, all I had to do was go to the day page using planner-goto-today, which I bound to F9 F9 with:
(global-set-key (kbd "<f9> <f9>") 'planner-goto-today)
I checked my timeclock reports with M-x planner-timeclock-summary-show, which gave me reports that looked like this:
Timeclock summary report for 2007.11.25 Project | Time | Ratio | Task Not Planned | 0:28:38 | 38.6% | Do weekly review . | 0:45:37 | 61.4% | Figure out how to set up syndicated blog on WordPress Total: | 1:14:15 | 100.0% | . Day began: 21:01:20, Day ended: 22:16:06 Time elapsed: 1:14:46, Time clocked: 1:14:15 Time clocked ratio: 99.3%
It’s easy to configure planner-timeclock-summary to add that report to
day pages automatically, but I rarely checked my time usage then, so I
didn’t set that up. I also didn’t usually need to see my time summary
for a particular project, but you could get that with
So at the end of this step, I had a warm and fuzzy feeling from seeing
many checked-off tasks on my task list. I published my task list to
the Net, too, which made it easy for other people to keep up to date
with what I was doing. Good stuff.
Planner helped me keep track of the different things I wanted to do.
Working with the other Planner geeks was also an incredible
experience. I’ve switched to Org for my task management because Org
does timeclocking better, but I still miss being able to easily
organize, publish, and tweak my daily task list. =) If you’re new to Emacs planning, I suggest giving both OrgMode and PlannerMode a try!
My Random Posts widget turned up a link to Another kitten who must not be named!, which told the story of how my parents adopted Ollie, another stray cat.
And of course there’s Neko, my somewhat psychotic but sweet-to-me cat.
I miss them. I rarely talk about the cats during my webcam chats with my family because there’s not much I can do. W- has asthma, so no kitties ever. =( So I content myself by watching cat videos on Cute Overload. It’s nice not dealing with kitty litter, but it’s not the same as feeling something purr as it nestles in your lap.
Here is my cat:
Scottish Folds have nothing on my cat. =)
I miss her. But I’m still glad I had a chance to rescue her from inside the walls, and I’m still glad that I woke up at odd hours to feed her, and I’m still glad that I got tremendously attached to her. And I really appreciate how my family’s still taking care of my cat even if she tears up all the furniture…
On Technorati: cat
Random Emacs symbol: modula-2-mode – Command: This is a mode intended to support program development in Modula-2.
I’m beginning to understand what comes naturally to me, the strengths that I can build on for an excellent career. One of the things that I’m good at and working on getting even better at is information development. This week, I started on a wiki that’ll document some of the best practices we’re learning at IBM for using these emerging collaborative technologies. I loved figuring out a structure and filling it in with tips and examples that I’ve seen. I’ve also been working on my book, and I’m now up to 13 raw pages. I’ve still got a long way to go (35 pages due by Dec 31!), but it’s a lot of fun explaining (and re-learning!) the things I picked up over the last six years. (Has it really been that long?) I enjoy writing and talking about what I’ve learned because I learn even more along the way. =)
Another strength that I exercised and developed this week was that of connecting. I had a number of deep, thought-provoking, insight-rich conversations with other people, and by that I meant that I had all these wonderful opportunities to ask people questions and learn from their experiences. The conversations weren’t always bright and sunny. In fact, some of the best conversations were where in addition to asking questions, I also found myself telling stories about how things could be, how things should be.
Oh, and I finished “Me and My Katamari!” Sense of accomplishment. I rarely finish video games, normally losing interest after a while. Maybe this shows that I’m learning how to do that. It helped that W- was also playing it, and that the game was broken down into 5-minute chunks. And it’s fun finishing things well… That’s something I’d like to get hooked on, just like I’d like to build exercise into my daily habits.
And I got started with homebrew development for the Nintendo DS. I’ve gone through some of the tutorials. =) The first thing I’d like to do is build a personal finance module for DS Organize. Good time to get back into embedded C programming. And it’s the ARM architecture, too, just like when I was programming on the iPaq.
What’s up for next week? Christmas and Boxing Day are holidays over here, and I’ll be working on Monday and for the rest of the week. Aside from the wiki I’m doing for work, I’ll also work on my book, and I’ll spend a little time getting in touch with people. My work goal is to finish all the tool recommendations. My personal goal for next week is to review my contacts and either get back in touch with people or archive old contact information. =)
I’ve just ordered Dragon Naturally Speaking – Preferred, the best speech recognition program around. I’m not filing this under “Play money”–I’m filing this under “Investment”, and I’m looking forward to wringing as much value out of it as I can. It will be worth it.
I’m planning to use it for braindumping my thoughts. I want to be able to _talk_ this blog post out, and in the process, practice talking in a semi-organized manner. I want to be able to talk my book out as well as write it out, depending on how I feel at the time.
I want to read to it. While I’m reading a book, I’d like to be able to say, “Oooh, page 87, Live and preach the culture, or it just won’t happen.” (This is from Saving Big Blue.) And the cool thing about the preferred version (and the professional version, which at $799 is out my current first-time-personal-investment budget) is that I can get it to transcribe recordings from a digital recorder that I bought some time ago. That would make it even easier to grab snippets of ideas and put them into my book notes system, maybe even my blog. Mwahahaha!
And if I’m _really_ lucky, I may even get it to transcribe other people’s podcasts. Wouldn’t that be nifty?
I’m excited. Looking forward to getting it after this bunch of holidays… =)
Most time management books will tell you to think of your three- to
five-year goals, come up with projects, and then make tasks based on
You know that life doesn’t happen as neatly as that. Instead, tasks
come at you from all sides: the bugs you discover while you read code,
the e-mails you get from coworkers, the milk that you need to pick up
on the way home. The task list just keeps getting bigger.
I want to help you set up Emacs so that it will:
If you’ve been keeping your task list in your head, you’ll find it
immensely helpful to get it out and into your computer. If you swear
by your day planner or index cards, you might find that Emacs is not
only a good backup, but it can also give you an overview of where
you’re going and where you’ve been. If you need to bill for your time,
you’ll love how time tracking is integrated into your task list. And
even if you’ve never written a line of Emacs Lisp before, you might
find that customizing Emacs to fit the way you think will *transform*
the way you think.
Give it a try. Use Emacs to manage your tasks for a month. Write
everything down in it. Use it to run your life. At the end of the
month, if it doesn’t feel natural to you, at least you can say that
Emacs really isn’t just an editor, it’s a way of life. It might not be
_your_ way of life, but you’ll have learned something from it,
In this chapter, you will learn how to:
Let’s get started!
(This is a draft for my book, “Wicked Cool Emacs”. See other Wicked Cool Emacs blog entries.)
Random Emacs symbol: gnus-summary-number-of-articles-in-thread –
Function: Return the number of articles in THREAD.
No, I don’t know why, either. =)
But it’s up again, just in case you want to see it. This one is based
on Org-mode for Emacs, so it’s not the same task list that used to
show up on my Planner wiki.
Expect this to change a lot as I figure out how I want it to fit in.
The downside of using WordPress as my front-end is that it looks like
it’s going to be difficult to get the kind of day view I have with my
Planner version. How
do I get it to display future pages?
I may end up writing yet another layer on top of this… =(
Anyway, here’s my highly idiosyncratic config, just in case you want
to get started hacking this onto your system:
(defvar sacha/org-publish-agenda-directory "~/notebook/org/" "*Directory to save the published agenda to.") (org-defkey org-agenda-mode-map "p" 'sacha/org-publish-agenda) (defun sacha/org-publish-agenda () "Copy the agenda buffer to a file in `sacha/org-publish-agenda-directory'." (interactive) ;; Take the entire contents of the agenda and dump it into a text file labeled with the date. (let ((agenda (with-current-buffer org-agenda-buffer-name (unless org-agenda-show-log (org-agenda-log-mode)) (buffer-string))) (filename (format-time-string "%Y-%m-%d.txt" (if org-starting-day (calendar-time-from-absolute (1+ org-starting-day) 0) (current-time))))) (with-temp-buffer (insert agenda) (write-file (expand-file-name filename sacha/org-publish-agenda-directory))))) (defun sacha/org-publish-agenda-today (interactive) "Publish today's agenda. Suitable for ~/.emacs, we hope." (let ((entry (assoc "a" org-agenda-custom-commands))) (if entry (org-run-agenda-series (nth 1 entry) (cddr entry)) (call-interactively 'org-agenda-list)) (sacha/org-publish-agenda)))
Random Emacs symbol: hack-local-variables – Function: Parse and put into effect this buffer’s local variables spec.
“If you want to build a ship, don’t drum up people together to collect wood and don’t assign them tasks and work, but rather teach them to long for the endless immensity of the sea.”
Antoine de Saint-Exupery
The creation of something new is not accomplished by the intellect but by the play instinct acting from inner necessity. The creative mind plays with the objects it loves.
There’s a story of a tech-support representative who kept a stuffed toy on his desk. When users approached with questions, he required that they ask the question of the stuffed toy before bothering him. The stuffed toy allegedly had an 80% success rate…
On Technorati: quote
This is a slightly better version of sacha/org-calculate-free-time
that can understand prioritized tasks. Also, if you’re working after
midnight, it takes into account the need to sleep. That is, it doesn’t
treat _now_ as the starting point for the free-time calculation unless
it’s after the start time, so if you’re up at 12:30 writing Emacs Lisp
code, Emacs doesn’t assume you’ve got 450 extra minutes of work time.
This is what the result looks like:
Day-agenda: Wednesday 26 December 2007 8:00...... -------------------- 10:00...... -------------------- 12:00...... -------------------- Scheduled: 12:00-21:00 TODO Christmas festivities with W-'s family 14:00...... -------------------- 16:00...... -------------------- 18:00...... -------------------- 20:00...... -------------------- 22:00...... -------------------- Scheduled: TODO [#A] 120 Write Planner and Org comparison for tasks Scheduled: TODO 30 Start on my letter for 2007 Scheduled: TODO 60 Respond to e-mail Scheduled: TODO 30 Donate when my charity budget hits $1000 Scheduled: WAITING 30 Send money to Ateneo CS dept In 919 d.: 101 things in 1001 days 90.0% load: 270 minutes to be scheduled, 300 minutes free, 30 minutes ga
And here’s the code:
(defun sacha/org-agenda-load (match) "Can be included in `org-agenda-custom-commands'." (let ((inhibit-read-only t) (time (sacha/org-calculate-free-time ;; today (calendar-gregorian-from-absolute org-starting-day) ;; now if today AND after starting time, else start of day (if (= org-starting-day (time-to-days (current-time))) (max (let* ((now (decode-time)) (cur-hour (nth 2 now)) (cur-min (nth 1 now))) (+ (* cur-hour 60) cur-min)) (let ((start (car (elt org-agenda-time-grid 2)))) (+ (* (/ start 100) 60) (% start 100)))) (let ((start (car (elt org-agenda-time-grid 2)))) (+ (* (/ start 100) 60) (% start 100)))) ;; until the last time in my time grid (let ((last (car (last (elt org-agenda-time-grid 2))))) (+ (* (/ last 100) 60) (% last 100)))))) (goto-char (point-max)) (insert (format "%.1f%% load: %d minutes to be scheduled, %d minutes free, %d minutes gap" (/ (car time) (* .01 (cdr time))) (car time) (cdr time) (- (cdr time) (car time)))))) (defun sacha/org-calculate-free-time (date start-time end-of-day) "Return a cons cell of the form (TASK-TIME . FREE-TIME) for DATE, given START-TIME and END-OF-DAY. DATE is a list of the form (MONTH DAY YEAR). START-TIME and END-OF-DAY are the number of minutes past midnight." (save-window-excursion (let ((files org-agenda-files) (total-unscheduled 0) (total-gap 0) file rtn rtnall entry (last-timestamp start-time) scheduled-entries) (while (setq file (car files)) (catch 'nextfile (org-check-agenda-file file) (setq rtn (org-agenda-get-day-entries file date :scheduled :timestamp)) (setq rtnall (append rtnall rtn))) (setq files (cdr files))) ;; For each item on the list (while (setq entry (car rtnall)) (let ((time (get-text-property 1 'time entry))) (cond ((and time (string-match "\\([^-]+\\)-\\([^-]+\\)" time)) (setq scheduled-entries (cons (cons (save-match-data (appt-convert-time (match-string 1 time))) (save-match-data (appt-convert-time (match-string 2 time)))) scheduled-entries))) ((and time (string-match "\\([^-]+\\)\\.+" time) (string-match "^[A-Z]+ \\(\\[#[A-Z]\\] \\)?\\([0-9]+\\)" (get-text-property 1 'txt entry))) (setq scheduled-entries (let ((start (and (string-match "\\([^-]+\\)\\.+" time) (appt-convert-time (match-string 2 time))))) (cons (cons start (and (string-match "^[A-Z]+ \\(\\[#[A-Z]\\] \\)?\\([0-9]+\\)" (get-text-property 1 'txt entry)) (+ start (string-to-number (match-string 2 (get-text-property 1 'txt entry)))))) scheduled-entries)))) ((string-match "^[A-Z]+ \\(\\[#[A-Z]\\] \\)?\\([0-9]+\\)" (get-text-property 1 'txt entry)) (setq total-unscheduled (+ (string-to-number (match-string 2 (get-text-property 1 'txt entry))) total-unscheduled))))) (setq rtnall (cdr rtnall))) ;; Sort the scheduled entries by time (setq scheduled-entries (sort scheduled-entries (lambda (a b) (< (car a) (car b))))) (while scheduled-entries (let ((start (car (car scheduled-entries))) (end (cdr (car scheduled-entries)))) (cond ;; are we in the middle of this timeslot? ((and (>= last-timestamp start) (<= last-timestamp end)) ;; move timestamp later, no change to time (setq last-timestamp end)) ;; are we completely before this timeslot? ((< last-timestamp start) ;; add gap to total, skip to the end (setq total-gap (+ (- start last-timestamp) total-gap)) (setq last-timestamp end))) (setq scheduled-entries (cdr scheduled-entries)))) (if (< last-timestamp end-of-day) (setq total-gap (+ (- end-of-day last-timestamp) total-gap))) (cons total-unscheduled total-gap))))
Random Emacs symbol: gnus-summary-display-while-building - Variable: If non-nil, show and update the summary buffer as it's being built.
jaaronfarr asked me why I switched from Planner to Org. Both of them are popular personal information managers for Emacs, and both of them have practically all the features I need. They both do a good job at helping people
manage tasks, schedule, and notes. If you have a few
months to explore this, I suggest that you try both for at least a
month each. On the other hand, if you want quick results, some time
thinking about how you plan can save you more time later.
I tried out Org because I was working on a chapter about schedule
management and it wasn’t fair to just rely on the manual or the
mailing list. In the beginning, I
felt frustrated by the lack of things I’d gotten used to in Planner:
the freedom to edit anything on my day page, little conveniences like +2tue to mean two Tuesdays from now (which Carsten has just added), publishing my blog…
After two months of using Org almost every day, I’m starting to
understand it. I’ve come to appreciate the ease of working with an
outline. I love the way it clocks time. I find the daily and weekly
views really helpful. I’ve hacked stuff for it: time/load estimation,
time reporting, next action summaries, agenda publishing… I’m fairly deeply
As a geek, I have to confess—I like Planner more. Planner is more fun
to code. Maybe it’s because I’ve spent years with it, and I know my
way around the source.
Maybe it’s because we split Planner up into lots of little pieces that
can be reused and advised. Maybe the modularity of Planner is because
chunks of the code were written on a computer with a teensy screen,
which forced me to write functions that fit 80×48 characters. (See,
that limitation was there for a reason!) There are plenty of entry
points. From time to time, I still find myself copying an entire
function in order to change something in the middle, but usually I can
just get away with wrapping something around something else. With Org,
I find myself doing a lot of copy-and-paste programming. I’d fix this
by breaking the functions down into smaller bits, but I don’t have the
brainspace right now. Maybe after the book.
Org is better for my brain, though. It gives me a better overview of
both the ground-level tasks (what am I going to do right now, today,
this week) as well as the 50,000-foot view (what are my big projects)?
Planner’s good at the ground-level tasks, but the overview’s always
been a little awkward because it has to visit a number of files to get
a big picture. Org handles that easily.
And the one-place-for-data thing of Org is pretty cool, too. Org
dynamically generates reports, which could take a bit longer if you
have a large Org file. Planner copies data wherever it makes sense, so
you’d have a copy of the task on your day page and a copy of the task
on your plan page. Plan pages can get out of sync unless you’re either
religious about using planner-edit-task-description and other
functions to edit your tasks, or you use planner-id and you’re lucky.
Timeclock entries get out of sync, too. You can trust Org more than
Planner in terms of consistency.
So now I’m kinda in the middle of these two modules. I use Org for all
my work tasks, and I’m moving towards using it for all of my personal
tasks as well. But I still keep my blog entries in Planner, even
though they get mirrored into a WordPress blog on my web server.
*What would I recommend?*
It depends on the way you think. If you’re the kind of person who was
never happy with day planners because you needed more space to doodle,
write notes, move things around, add other things, try out Planner. If
you like outlines and organizing your tasks into projects, try out
Note that just because you work that way now doesn’t mean you’ll work
that way in the future. Don’t worry. Emacs will adapt. You can switch
between Planner and Org fairly easily. Just give yourself a week or so
to adjust (or a month if you’ve customized your old tool extensively
and miss lots of things about it). Use the tool every day, and you’ll
Have you tried out both? Or have you tried out one of them and are curious about the other? I’d love to learn from your experience or answer your questions.
Random Emacs symbol: malayalam-composition-function – Function: Compose Malayalam characters in REGION, or STRING if specified.
(please remove leading spaces from code excerpts)
You’d like to use the Org Mode for Emacs to manage your tasks. In this
blog post, I’ll cover the absolute minimum you need to get started.
We’ll assume that you already have GNU Emacs 22 and that you’re reasonably
familiar with using Emacs, including installing external modules and
adding them to your load path.
There are a million ways to plan, but we’re going to focus on two. The
first approach is Getting Things Done (GTD), described by David Allen
in the book of the same title. GTD focuses on next actions (the very
next thing you can do) and uses context lists to keep things
manageable. Popular ways to do GTD are with index cards, recycled
business cards, or software programs. If most of your tasks are in
your head or scattered on scraps of paper, GTD will probably give you
the most organizational bang for the least effort.
The second approach is day planning. You plan your week based on your
projects and priorities, write your tasks onto the pages for each day,
and copy unfinished tasks over to the next day. If you’ve used one of
those Filofax, Franklin-Covey or Dayrunner personal organizers, you’re
probably used to this way of planning.
As you learn more about Emacs and task management, you’ll probably
develop your own way of doing things. These two are a good place to
start, though. (Don’t recognize how you plan your day, but
interested in using Emacs anyway? Please get in touch with me! I may
know of something that fits, and I’d certainly love to hear about the
way you work.)
If you use GTD, read on. Otherwise, read the Setup and then wait for
the next blog post! =)
Org is part of Emacs 22. To make it even easier to collect tasks and
notes, install a separate package called Remember.
First, download and unpack Remember. As of this writing, Remember is
at version 1.9. You can get the TAR.GZ from
http://download.gna.org/remember-el/remember-1.9.tar.gz or the ZIP
archive from http://download.gna.org/remember-el/remember-1.9.zip . If
these instructions are out of date, check
http://www.emacswiki.org/cgi-bin/wiki/RememberMode to find out where to get Remember.
Then add this basic configuration for Org and Remember to your ~/.emacs,
(add-to-list 'load-path "~/elisp/remember-1.9") ;; (1) (require 'remember-autoloads) (setq org-remember-templates '(("Tasks" ?t "* TODO %?\n %i\n %a" "~/organizer.org") ;; (2) ("Appointments" ?a "* Appointment: %?\n%^T\n%i\n %a" "~/organizer.org"))) (setq remember-annotation-functions '(org-remember-annotation)) (setq remember-handler-functions '(org-remember-handler)) (eval-after-load 'remember '(add-hook 'remember-mode-hook 'org-remember-apply-template)) (global-set-key (kbd "C-c r") 'remember) ;; (3) (require 'org) (add-to-list 'auto-mode-alist '("\\.org$" . org-mode)) ;; (4) (global-set-key (kbd "C-c a") 'org-agenda) ;; (5) (setq org-todo-keywords '("TODO" "STARTED" "WAITING" "DONE")) ;; (6) (setq org-agenda-include-diary t) ;; (7) (setq org-agenda-include-all-todo t) ;; (8)
After you evaluate that code by calling M-x eval-buffer or restarting Emacs, you’re ready to create an Org file.
Read on to find out how to use your new Org file for GTD, or skip ahead to the section on Day Planning to find out how to plan by day!
So you’ve read David Allen’s book about Getting Things Done (or any of
the countless summaries of it on the Net), and you’d like to get
started with Emacs and Org mode. I’ll show you the bare minimum you
need to support the five phases in the GTD task workflow:
|Collect||Capture everything you need to do.||Collect all your bits of paper or put everything into your inbox|
|Process||Actionable? Yes: do, delegate, or defer; no: file, throw, or incubate||Put tasks on your list, track delegated tasks|
|Organize||Next actions, projects, waiting for, someday/maybe||Tag tasks, view tasks by tag|
|Review||Daily, weekly, etc.||Agenda view|
|Do||Actually do the work!||No, Emacs won’t do the work for you… (But it can brew coffee!)|
The first thing you need to do is get all the tasks out of your head,
off scraps of paper, out of your e-mail, and so on. If this is the
first time you’re putting tasks into Org, you have a lot of tasks to
collect. The best way to collect lots of tasks is to open your Org
agenda file (~/organizer.org) and put this heading at the end of the
Now go to the end of the file, and type in ** TODO and the first task
you can think of, like this:
** TODO Buy milk
Press C-M-RET and keep typing other tasks. Keep going until you’ve
gone through all the things in your head and all the scraps of paper
lying around. Do not get distracted. Your goal is to write all the
tasks down. If you are as easily distracted as I am, do not even open
up a browser window or look at your e-mail. It can be a real struggle
sometimes to focus long enough to get everything down, especially when
you’re writing down all these tasks that you can work on. DO NOT DO A
TASK UNLESS IT TAKES LESS THAN TWO MINUTES TO DO. In fact, if you are
just starting out with GTD, you might find it better to resist all
temptations to do tasks during this step. Get it all out.
Now that you’ve gotten your tasks out of your head and into your
organizer.org file, breathe. There’s less stress in your brain now,
because you don’t have to worry about forgetting things (as long as
you remember to check your Org file, that is!).
DO NOT FILL YOUR BRAIN BACK UP WITH OTHER THINGS TO DO. The brain is a
wonderful thing, but it’s not good at remembering what you need to do.
Whenever a task comes your wayâ€”through e-mail, in conversation, in
the showerâ€”put it in your ~/organizer.org. Well, you probably don’t
want to drip all over the computer, so sometimes you’ll need to hang
on to an ideaâ€”but get it out of your head and into your organizer as
quickly as possible.
To collect tasks within Emacs as they come up, use Remember. With the
basic configuration you set up in the previous section, you can use
C-c r t (or M-x remember and “t” for the Tasks template) to pop up a
buffer where you can type in the task description and some notes.
## Filing location: Select interactively, default, or last used: ## C-u C-c C-c to select file and header location interactively. ## C-c C-c "~/notebook/personal/organizer.org" -> "* Tasks" ## C-u C-u C-c C-c "???" -> "* ???" ## To switch templates, use `M-x org-remember'. * TODO
And if you’re lucky, there will even be a hyperlink to the file or
e-mail you were looking at when you called C-c r t (remember, tasks).
If you brain-dump your tasks and use C-c r t to collect tasks as they
come up, you can free up your brain for other things, such as
contemplating the meaning of life.
Now that you’ve collected all those tasks into your inbox, you can
process them. Open your Org agenda file and go to your inbox.
For every item there, decide if it’s something that you need to act
on. Is it really just a note? If so, take out the TODO keyword and
organize it like you would store other notes. If it’s a true-blue
task, decide if it’s something you can do within the next two minutes,
delegate to someone else, or leave on your task list. Go through your
list systematically, delegating and eliminating whenever possible.
If you delegate the task, change it to WAITING by moving your cursor
to the headline with the TODO keyword and typing S-r (org-shiftright)
until it changes to WAITING. To keep track of who you delegated it to,
just edit the task description to reflect it. Your organizer file will
look like this:
** WAITING Buy milk - WJY
You have a list of tasks that _you_ need to act on. If you’ve
braindumped everything that people have asked you to do and that
you’ve thought of doing, this is probably a very long list.
Intimidatingly long. The next step in restoring sanity to your life is
to organize your list into next actions, projects, things you’re
waiting for, and someday/maybe tasks.
Review that task list. For each task, decide if it’s something you can
do immediately. Is it something you can do in one sitting, and do you
have everything you need in order to do it? If so, great! It’s a next
action. Leave it on your task list.
If you can’t immediately work on a task, it may be a project in
disguise, and it needs to be broken down into smaller, concrete next
actions. For example, the task:
** TODO Write a book about Emacs
would probably result in me getting complete writer’s block. If you’re
faced with a big task like this, move it out of your inbox and make it
a project. Then you can think of the very next action you need to do.
Your Org file could look something like this:
* Projects ** Emacs book *** TODO Write about basic Org and GTD * Inbox ** TODO ... lots of other things go here ... ** TODO ... lots of other things go here ... ** TODO ... lots of other things go here ...
A task might also be stuck because you need to wait for someone else.
For example, I’m currently working on renewing my visa, but I need to
wait for the embassy. Mark those stuck tasks as WAITING with S-right
Someday/maybe tasks are nice to think about once in a while, but you
don’t want to clutter your day-to-day tasks with them. A basic way to
deal with this is to move those tasks into a separate Organizer file
such as ~/someday.org . Another is to use tags, which we’ll cover in
the section on intermediate Org. For now, just move them to another
You’ve gone from a whole bunch of tasks in your brain and on pieces of
paper to one text file containing everything you need to do, with an
easy way to get to just the things you can do right now. To view all
your tasks, type C-c a t (org-agenda, tasks). You’ll get something
that looks like this:
Global list of TODO items of type: ALL Available with `N r': (0)ALL (1)TODO (2)STARTED (3)WAITING (4)DONE TODO Write about basic Org and GTD TODO Blog TODO Answer my mail TODO Alter slacks ...
Type “1 r” to show only the active tasks, and review what you’re
waiting for with “3 r”. Review this WAITING list every so often
to make sure that nothing falls through the cracks.
Type “f” to start follow mode, which displays the relevant lines from
your Org agenda file as you move around. This is helpful for quickly
reviewing your task list.
All of the above should take you less than fifteen minutes of planning
each day. The rest of the time, you can focus on doing the work,
undistracted by shiny new tasks that pop up because you can get them
out of your way with C-c r t.
To work, review your task list with either C-c a t (org-agenda, tasks)
or C-a a (org-agenda, agenda). From the agenda view, type “t”
(org-agenda-todo) to change the task status. I find it helpful to mark
a task as STARTED because it helps me remember what I was working on
in case I get distracted by something urgent, but you can also use C-u
t to jump to a status without cycling through the ones in between
(say, marking a task as DONE). You can also press ENTER to jump to the
task headline and edit it directly.
Going back to reviews: As you mark tasks done, you’ll also want to do
daily and weekly reviews. You can see those with C-c a a (org-agenda,
org-agenda-list), which opens an Org agenda view. To see completed
tasks in the Org agenda view, type l (org-agenda-log-mode). To switch
to the day view, type d (org-agenda-day-view). To switch to the week
view, type w (org-agenda-week-view). The basic configuration I’ve
suggested here will automatically include unfinished tasks at the
beginning of the agenda. Scroll up to review your tasks, and press
ENTER on a line to jump to it.
There’s a lot more you can do with Org to make it support GTD, but
here’s a basic configuration that can get you started on collecting,
processing, organizing, managing, and actually doing your tasks. Stay
tuned for the intermediate Org article for more tips on setting up
repeated tasks, clocking time, working with projects, and tagging
Random Emacs symbol: bbdb-edit-current-field – Command: Edit the contents of the Insidious Big Brother Database field displayed on
UPDATE: Thanks, Victor, for catching the bug! Changed org-install to org.
If you’re the kind of person who likes scribbling free-form tasks and
notes in your day planner, then Planner might be a good fit for you.
In this blog post, I’ll show you how to use Planner to organize the
things you need to do by the day you need to do them, check the things
you need to do, mark tasks complete, and review what you’ve finished.
I assume that you’ve already got GNU Emacs 22 installed and that
you’re comfortable with using Emacs as a text editor, although it
might not yet be your way of life. (Just you wait! Planner was the
thing that pushed me over the edge. ;) )
Here’s the bare minimum you need in order to use Planner to manage
your tasks day by day. You’ll need Planner, which is a separate
package that you can get from http://www.gna.org/projects/planner-el
. As of this writing, Planner is at version 3.41. You’ll also need
Muse, the markup engine that Planner is based on. You can get Muse
from https://gna.org/projects/muse-el . As of this writing, Muse is at
Download the latest versions of Planner and Muse, and unpack them. If
you don’t know where to unpack them, I suggest creating an ~/elisp
directory and extracting the archives to that directory. You should
end up with two new directories: ~/elisp/planner-3.41 and
Here’s how to configure Planner:
1. Create a directory such as ~/Plans . This is where your Planner pages will be.
2. Add the following to your .emacs:
;; Load paths - change as necessary (add-to-list 'load-path "~/elisp/planner-3.41") (add-to-list 'load-path "~/elisp/muse-3.11/lisp") ;; (1) ;; Basic configuration (require 'muse-project) (require 'planner-autoloads) (setq planner-project "WikiPlanner") ;; Adjust this if you already have other Muse projects (setq muse-project-alist '(("WikiPlanner" ("~/Plans" ;; (2) :default "TaskPool" ;; (3) :major-mode planner-mode :visit-link planner-visit-link))) ;; Some handy keyboard shortcuts (global-set-key (kbd "C-c d") 'planner-goto) ;; (4) (global-set-key (kbd "C-c t") 'planner-create-task-from-buffer) (global-set-key (kbd "<f9> d") 'planner-goto) ;; (5) (global-set-key (kbd "<f9> t") 'planner-create-task-from-buffer) (global-set-key (kbd "<f9> <f9>") 'planner-goto-today) ;; (6) (global-set-key (kbd "<f9> <f8>") 'planner-goto-yesterday) ;; (7) (global-set-key (kbd "<f9> <f10>") 'planner-goto-tomorrow) (plan) ;; (8)
Evaluate the code with M-x eval-buffer, or restart Emacs. Then you’re
ready to plan!
The first thing you need to learn is how to get to day pages
quickly. Planner needs to be at least as fast as opening a paper-based
day planner and finding the right page. Here are the two keybindings
from the previous section on setting up Planner:
|F9 d(ate) or C-c d||planner-goto||Jumps to any day’s page|
|F9 F9||planner-goto-today||Shows today’s page|
F9 d (planner-goto) is smart. You can click on a date in the calendar
that pops up, or navigate to a date and press RET. Typing in the date
is much faster. The date format is yyyy.mm.dd, and it understands
partial dates (mm.dd, or just dd).
For example, if the date today is December 28, 2007, here’s what
|30||2007.12.30||Which day in the current month|
|1.30||2007.01.30||Which day and month in the current year|
|2008.01.30||2008.01.30||The full date|
planner-goto also understands relative dates, and this is where things
get more interesting. If you are looking at a day page, dates are
calculated based on the day you’re currently looking at, or today if
you’re not looking at a day page. This allows you to use “+2fri” to
jump to successive paydays or use -1 to see the day before the one
you’re reading. Here are some examples that will show you what you can do:
(If you ever find yourself using a date shortcut like the one in (6),
please e-mail me, as I put that code in just for fun. =) )
Practice jumping around to different dates using F9 d or C-c d, the
two shortcuts we set up earlier. If one of those shortcuts feels more
natural to you, go ahead and use it. (Or bind it to something else, if
you want.) While you’re opening different day pages, write a few
reminders to yourself.
The basic configuration I suggested also has some handy shortcuts for
going to the previous and next days. Press F9 F8
(planner-goto-yesterday) to go to the day before the one that’s
currently displayed, and F9 F10 (planner-goto-tomorrow) to go to the
day after the one that’s displayed. You’ll find this handy when doing
your weekly planning. The standard shortcuts are C-c C-j C-y and C-c
C-j C-t. You may find those easier to type, but they were like a game
of Twister on my tiny keyboard. (This is also the reason why I’ve
remapped most of my keybindings. I simply can’t do the
So now you know how to open different day pages. You can stop here and
already have a decent, minimalist day planner, using it like a
collection of text files that just happen to have useful navigational
commands. However, with a little more structure and some handy
shortcuts, you can be even more effective at managing your tasks.
Two of the keyboard shortcuts in the sample configuration are C-c t
and F9 t, both bound to planner-create-task-from-buffer. This is an
incredibly useful function, and it gets even better as you set up more
parts of Planner. The key idea behind planner-create-task-from-buffer
is that you should be able to quickly jot down a task and GET BACK TO
WORK RIGHT AWAY. No need to fiddle around with other files or dig your
planner out of your backpack. No switching to another application (at
least, if you do most of your work within Emacs). And if you set it
up, you even get hyperlinks back to whatever you were looking at,
saving you time in searching for the file you wanted to work on or the
e-mail you wanted to answer.
Try it for yourself. Use C-c t, F9 t, or M-x
planner-create-task-from-buffer to create a task. Type in the task
description. For now, accept the default date and plan page. The task
will be created on today’s page. The task will also be copied to the
TaskPool page. To view today’s page, type F9 F9. You can use TAB
(muse-next-reference) to move the cursor to the next hyperlink, and
RET to visit the link.
planner-create-task-from-buffer understands all the date shortcuts
that planner-goto does, so you can easily schedule a task for this
Saturday (+sat) or three days from now (+3). If you create a task
that’s scheduled for some other day, you can either open the day page
with F9 d (planner-goto), or review it on the TaskPool.
Okay. You’ve got day pages. You’ve got tasks. You probably want to
find out how to mark tasks as done before your growing TODO list turns
into a monster and eats you.
When you finish a task, go to the day page or the plan page it’s on
and use C-c C-x (planner-task-done) to mark it as finished. Think of
it as marking completed tasks with a big X. In addition to the
satisfaction of seeing completed tasks grayed and crossed out, you’ll
also see the completed tasks drop to the bottom of your task list when
you save the file. This makes it easy to see what else you need to
do. Just pick the next item off your list and keep working.
Not quite done? You can mark it as pending with C-c C-p
(planner-task-pending). You can think of it as Pending or Postponed or
Realized that you didn’t need to do it after all? Either delete the
task with M-x planner-delete-task, or mark it as cancelled with C-c
M-C-x (planner-task-cancelled). Think of C-c M-C-x as similar to C-c
C-x (planner-task-done), but even better—you’ve gotten away without
doing something. C-c M-C-x doesn’t work on all terminals, so if your
computer gets confused and marks the task as done, call M-x
NOTE: If your task is on both a day page and a plan page, make sure
you use these Planner commands and M-x planner-edit-task-description
in order to change the task status or description, and M-x
planner-delete-task to delete the task. These commands update the
linked page as well. If not, your tasks could get out of sync.
Even with your newfound powers of Planner task management, you’ll
probably still be left with unfinished business at the end of the day.
Unfortunately, Planner does not have a M-x planner-dilate-time command,
so you’ll just have to reschedule the tasks for another day.
If you wrote your tasks into your calendar using a paper-based
planner, you’d have to copy unfinished tasks to the next day one by
one. This is a powerful incentive to trim your task list and keep it
short. Planner can automatically copy unfinished tasks from the
previous days onto today’s page, saving you a lot of scribbling. Do
not let this tempt you into procrastination.
If you go back to the basic configuration, you’ll notice that it ends
with one command:
This reviews the past few days of pages for unfinished tasks, carrying
them over to today’s page. By default, the past 3 days are checked,
which should be enough to get you through a blissful no-computer
weekend. If you’re in the habit of going for long spans of time
without opening Emacs (like 4 days! *gasp*), you may want to change
the line in your ~/.emacs to something like
(plan 5) ;; Check the last 5 days
(plan t) ;; Check all days. Can be slow!
You can also call this interactively with something like C-u 5 M-x
plan, which checks the last 5 days.
plan carries unfinished tasks from previous days to today. What if you
want to trim today’s task list to a manageable size by proactively and
intentionally procrastinating things that you don’t need to do today?
That’s where planner-copy-or-move-task comes in.
To reschedule a task, move your cursor to the task on the day or plan
page. Type C-c C-c (planner-copy-or-move-task) and specify the
date. Again, planner-copy-or-move-task understands all the Planner
date shortcuts. If you reschedule a task from a day page, remember
that relative dates will be calculated based on the day page. For
example, if you’re on 2008.08.12 and you want to reschedule a task, +1
means 2008.08.13. If you reschedule a task from a plan page, dates are
relative to today.
If you want to reschedule many tasks, you might find it more
convenient to use M-x planner-copy-or-move-region. Move to the
beginning of the first task you want to move, press C-SPC to mark the
beginning of the region, move to the end of the last task you want to
move, and call M-x planner-copy-or-move-region.
Ruthlessly reschedule until your task list for today looks
manageable. A large task list can be overwhelming. It feels better to
complete everything on your task list and then add some more, than to
end each day with many unfinished tasks.
You’ve got your day pages. You’ve added and scheduled tasks. You’ve
checked them off. At the end of the week, you’re wondering where all
the time went. Just hit F9 F9 (planner-goto-today) to jump to today’s
page, and then use F9 F8 (planner-goto-yesterday) and F9 F10
(planner-goto-tomorrow) to navigate around. (See, those keybindings
were there for a reason!)
But wait, there’s more! I’ll cover projects, timeclocking, and other
Planner goodies in an intermediate article on using Planner, so stay
Random Emacs symbol: gnus-various – Group: Other Gnus options.
It takes me about 3 1/2 hours to write 2000 words. That works out to roughly 10 words a minute. I type a lot faster than that on a regular basis. The bottleneck isn’t typing, it’s my brain. Part of it is getting a handle on what I want to say and how I want to say it. I work with an outline. It’s really helpful, but I find it difficult to work in the breadth-first matter suggested by other writers. I have a hard time going from the outline to a more detailed outline and to an even more detailed outline, and so on. I find it easier to think of things in terms of a conversation. I find it easier to write a blog post than to successively refine outlines. This explains the recent spate of 2000-word blog posts on my blog. I don’t normally write this much, but it’s the best way for me to get the information out of my head and into a form that I can read.
The Dragon NaturallySpeaking box arrived today, and I’ve installed it in my computer. I’m excited about trying it out, although it’s quite interesting getting used to dictation. I’m finding out that I can’t really talk off the cuff yet. I think it will be good training for me, as dictation encourages you to think things through before you start talking. Theoretically, as I read more to the computer, or dictate more to the computer, that is, it’ll get more used to how I say things. There’s still a long way to go before I can use it to transcribe recordings, though.
So my life for the past few days and the next few days — it’s just full of words. From working on a wiki in the morning to working on my book in the evening, I’m writing a heck of a lot and I really really love it. I enjoy thinking about what I’ve learned, thinking about the questions that I want to ask, trying to organize all that information in a way that makes sense to other people who might not be familiar with the topic. And by golly, I think I’m getting the hang of it. 2000 words is roughly the size of, say, a LinuxJournal article. And yet this is the second day straight that I’ve managed to turn out one of those. Granted, the posts are on material that I know and have written about before. This is where all the blog posts helped because even if I didn’t copy and paste what I’d written before, I’d had some practice in thinking things through. And I’ll get better and better as I keep talking, keep writing, keep figuring things out.
Speaking of getting the hang of writing, too, I spent some time earlier putting together a Perl script that downloaded all the posts from my company blog and formatted them into a something I could turn into a miniature book. I wanted to review all the blog posts in preparation for an upcoming interview. It was surprisingly easy to do. I loved being able to look at all my entries and see what I’d been thinking over the past year. I was surprised to find out that I had written almost 50,000 words through the year. 140 pages. 50,000 words is about the number of words that people strive for in the NaNoWriMo contest. NaNoWriMo is the National Novel Writing Month, when people try to write that novel that they’ve always been planning to write but never got to around to. 50,000 words. Of course, they try to do all of that in one month, which is a bit more of a timeframe than I’d want to commit to. Still, I’ve written that in the last year, just the casual stuff, just the stories, just me saying, okay this is what I’m working on, this is what I’m doing today, this is what I’m wondering about…
If I can do 2000 words in 3.5 hours, which is roughly all the writing time I have in one day, and then multiply that by 30 days… If I manage to write consistently for 30 days, then I’ll be like Stephen King, turning out a book in a month. Although maybe I won’t quit ebe there yet… I need to get this book out. One thing at a time…
The best way for me to dictate is without looking at the computer.Â Watching the speech recognition program convert my ramblings into words and get them wrong every single time… No.Â If I watch the computer try to recognize words and piece them together, I get this urge to jump in there and start correcting it .Â As you may remember from reports that you had to do in high school or essays that you needed to write in college, editing while you’re writing is a very bad idea.Â So instead of watching the words scroll across the screen, I close my eyes and dictate.Â I just trust that the computer will get it right.
Once I get the key idea out of my hand, then it’s time to go back and look at all the misspellings and the incorrect translations.Â And then I take my writing hat off to put my editing hat on.Â I’m not yet any faster than I would be if I were just typing.Â Part of it is due to some corrections I need to make, and I hope they’ll be fewer and fewer as the computer gets more used to how I say things.
Most of the advertising for speech recognition programs like Dragon NaturallySpeaking talks about the difference between the number of words per minute that you can speak and the number of words per minute that you can type. Although that speedup is interesting and I hope that I eventually get into it, that’s not what my first goal is.Â I know that I’m going to start out slower.Â I know that I’m going to spend time editing, I’m going to spend time correcting. I’m going to spend time just thinking what to say.Â I’ve got all these habits to unlearn.Â I’ve gotten used to typing.
The benefit that I’m really looking for here is increased immediacy.Â Intimacy.Â Conversation.Â When I write, I sometimes find myself falling into a writing voice.Â Granted, when I speak, I’m a little formal.Â But maybe if I switch to mainly talking things out, I’ll give my blog posts, my articles, this book that I’m writing, just that extra touch of making things personal.
Maybe I’ll also learned how to speak in a way that makes sense.Â Maybe I’ll learn how to structure the entire sentence before I start saying it, for one.Â Maybe I’ll find myself dropping all those “you knows”, “likes”, and other verbal crutches I sometimes use.
And who knows?Â Maybe this will be the thing that gets me to slow down when I’m speaking.Â Maybe if I become more comfortable with the idea of dictation, I’ll get used to it, and I’ll just be speaking at my regular excited rate and then I’ll be pouring 200 words a minute into it. That would be interesting . =)
But it all starts with baby steps.Â Training the recognizer to understand my words, training myself to think of sentences before I say them, learning how to say the punctuation, thinking of what I have to say…Â Well, I’ll give it a try.Â We’ll see what happens.Â And if it works, it’ll be an awesome tool in my kit.Â We’ll see.
So you want to use Org as day planner. I’ll show you the bare minimum that you need in order to use Org to manage your tasks day by day. I assume that you’ve set up Org and Remember according to the basic configuration suggested in “Setup.” If you haven’t done that yet, please review the section on “Setup”, then return here.
Here’s what you’ll learn how to do:
If you’re adding many tasks, you may find it easier to edit your Organizer file. Open ~/organizer.org in Emacs and go to the end of the file. Add headlines like this:
* Inbox ** TODO your task description here ** TODO another task...
Instead of typing ** TODO again and again, you can use C-M-RET to create another TODO heading at the same level as the previous one. Think of all the things you need to do over the next few days and add them to your Org agenda file.
More tasks will come up as you work on things. Instead of switching to your Org agenda file each time you need to add a task, you can use C-c r t (remember, Tasks template) to remember the task quickly. Try it now by typing C-c r t. Type in the task description and press C-c C-c (org-ctrl-c-ctrl-c) to add the task to the end of the ~/organizer.org file.
Now you have plenty of tasks on your list, but no idea when you need to do that. Here’s where scheduling and deadlines come in.
To schedule a task, move your cursor to the TODO headline and press C-c C-s (org-schedule). Org will prompt you for a date. It understands full, partial, and relative dates. For example, if today is December 29, 2007, then It understands any of the following:
|10:30||2007-12-30 10:30||Time today|
|3:30pm||2007-12-30 15:30||Time today|
|31||2007-12-31||Day in the current month|
|12-31||2007-12-31||Month and day in the current year|
|2008-01-01 12:30am||2008-01-01 00:30||Date and time (also works with partial dates)|
|+2||2008-12-31||Two days from now|
|-3||2007-12-26||Three days ago|
|Fri||2008-01-04||The nearest Friday (on or after today)|
|+2w||2008-01-12||Two weeks from today|
To set a deadline for a task, type C-c C-d (org-deadline). It accepts the same kinds of date that org-schedule does.
Try this out by scheduling all of your tasks over the next few days, adding deadlines where necessary.
Now that you’ve added date information to your tasks, you probably want to see those tasks organized by date instead of in the random way you entered them. Agenda views are going to become your new best friend.
Type C-c a a (org-agenda, org-agenda-list) to view your agenda. By default, Org shows a weekly view of your scheduled tasks and appointments. This is your Org agenda view.
Here are some useful navigational keys:
Get into the habit of typing C-c a a to check your task list. It may also help to add
to the bottom of your ~/.emacs. This opens your Org agenda view when you start up Emacs. Start your Emacs day with your Org agenda, check it every time you finish a task, and review it before you end the day. This will help you make sure that nothing falls through the cracks.
The easiest way to mark a task as done is to go to its line in your Org agenda view. Type C-c a a (org-agenda, org-agenda-list) to view your tasks for today, move your cursor to the task, and type t (org-agenda-todo) to cycle the task status until it’s marked DONE. You can also type C-u t (org-agenda-todo with a prefix argument) to jump to a specific task status. For example, you could type C-u t DONE to mark a task as done.
You can also mark tasks done from your ~/organizer.org file. Open the file and move your cursor to the item. Type C-c C-t (org-todo) to change the task status. Again, you can type C-u C-c C-t (org-todo) to jump to a specific task status.
I find it helpful to mark tasks as STARTED when I start working on them, WAITING if I need something else in order to continue working on the task, and DONE when I’m finished with it. That way, I can quickly see which task I was supposed to be working on before I got distracted by something bright and shiny, and I can also see what I’m waiting for. Get into the habit of doing that, and you’ll find it easier to get back on track after distractions.
Unfortunately, Org does not come with a M-x org-zap-distractions command. There will be days when you can’t do everything on your task list.
You don’t have to reschedule your tasks. Org will remind you of unfinished, scheduled tasks every single day. It will even helpfully tell you how many days you’ve procrastinated on that task. If you use C-c a a (org-agenda, org-agenda-list) when you have unfinished tasks on previous days, you’ll see task reminders like this:
Saturday 29 December 2007 organizer: Scheduled: TODO Respond to mail organizer: Sched. 6x: TODO Write notes from mentoring conversation organizer: Sched. 2x: WAITING Report time
You could let your unfinished tasks snowball on you in a big mass of procrastination. If you let your task list grow to an intimidating size, though, you may start stressing out about the things you aren’t doing. Let me show you how to procrastinate—I mean, reschedule your tasks effectively—so that you can work with a more manageable task list.
If tasks are starting to accumulate, it’s a good sign that you need to review those tasks. Do you really need to do them? If not, delete them by moving to the line in your Org agenda view and pressing C-k (org-agenda-kill). You can also edit your ~/organizer.org file and delete them, but org-agenda-kill is more convenient.
If you really need to do the tasks, but there’s no point in seeing it in today’s task list because you can’t do it today anyway, use C-c C-s (org-agenda-schedule) to reschedule the task. If you’re only moving it a couple of days ahead, use S-right (org-agenda-later) to move it forward, and S-left (org-agenda-earlier) if you overshoot.
Some tasks show up again and again on your task list, and you know you need to do them, but you don’t know where to getting started. “TODO Write a book” is not a good task, because it’s just too big to do in one sitting and it doesn’t tell you what to do right now. Big tasks are often projects in disguise. Break it down into smaller tasks, and schedule those instead. If you’re in the Org agenda view, press RET (org-agenda-switch-to) to jump to the task in your ~/organizer.org file. Break it down into smaller tasks by adding sub-headings and more TODOs, like this:
** Write a book *** TODO Make an outline of what to write *** TODO Read sample query letters *** TODO Write a query letter
… and so on.
Then you can use C-c C-s (org-schedule) to schedule those tasks.
Use these commands to keep your task list manageable. That way, you get the warm and fuzzy feeling of accomplishment when you finish what’s on your list and you look at everything you’ve done today.
If you’ve been good about keeping your tasks in your ~/organizer.org file, working with your Org agenda view, and marking tasks as DONE when you finish them, you’ll find it easy (and satisfying!) to review your accomplishments. Just open your daily or weekly Org agenda view with C-c a a (org-agenda, org-agenda-list). Type l (org-agenda-log-mode) to show completed tasks. Pat yourself on the back, then plan yourself another wonderful day tomorrow!
Random Emacs symbol: set-fill-column – Command: Set `fill-column’ to specified argument.
Oh no! I’m stuck in the doldrums.
My dad said that the difference between an amateur and a professional
is that a professional will deliver even when he doesn’t feel like it.
Or he’s good at making himself feel like it. Someday I’m going to
figure out how to be a professional writer.
Here are the five things I’m going to try to break this writer’s block:
See, that wasn’t so hard…
On Technorati: writing
Random Emacs symbol: make-char-table – Function: Return a newly created char-table, with purpose PURPOSE.
Okay, no more procrastinating.
I just spent the last couple of hours working on my finances. My ledger now shows all the details of my retirement funds. I can tell you how many units I have, at what price I bought them, their net gains since then, and what percentage they make of my portfolio. I’ve accounted for practically all the money in my savings account, and I divided that into envelopes that makes sense.
There isn’t much else to think about my finances. All I have to do now is keep earning.
The wonderful thing about procrastinating is that you get to do all these other things. I’m currently procrastinating working on a book about Emacs. There are several things I still need to describe in the chapter, such as tagging tasks, working with projects, and clocking time. But I wasn’t in the mood to write, and I gave myself permission to procrastinate the entire afternoon by learning the ins and outs of Ledger, a personal finance program with an Emacs interface. At the very least, I’ll have material for a future article.
And now back to task management.
I really want to share my code for reviewing Org timeclock entries for each date. However, it depends on functionality that’s only in the development version of Org. Do I tell people to change to that version? Do I try to make it work with the standard version that comes with Emacs? And the development version of Org comes with all sorts of nice goodies, too…
Okay, I figured out what to do. I’m going to include it, but I’ll use a distinctive background to show people that this is only available with a newer version of Org. That way, the bleeding edge geeks can still do all sorts of cool stuff.
Many professionals bill clients for their time. Even if you don’t, keeping track of the time you actually spend on tasks can help you improve your time estimates and check if you’re spending enough time on the things that are important to you. For example, keeping track of the time you spend on tasks might show you that you spend two and a half hours each day just responding to e-mail. If you can identify problem areas like that, then you can look for more effective ways to perform the tasks that take up a lot of your time.
I love Org’s timeclocking support, and I think you will too. Because it’s integrated with your task list, you don’t have to switch to separate application or reenter data. You can get more detailed time reports, too. All you have to do is remember to clock in before you start a task and clock out when you finish it.
You can clock in by moving your cursor to the task headline in either your organizer.org file or the org agenda view, and then pressing C-c C-x C-i (org-agenda-clock-in or org-clock-in, depending on context). This adds the time stamp to the task. If you are already clocked into another task in that organizer file, you’ll be clocked out of it to prevent you from accidentally double-billing.
To clock out of a task, type C-c C-x C-o from the task headline. Marking a task as done will also automatically stop the clock, if that was the task with the active clock.
Here’s some code to make this even easier. The following code clocks in whenever you market task is started, and clocks out when you market a task as WAITING. It also automatically market task is started if you clock in. This takes advantage of the Org configuration previously suggested in the Setup section. Add this to your ~/.emacs and evaluate it:
(eval-after-load 'org '(progn (defun wicked/org-clock-in-if-starting () "Clock in when the task is marked STARTED." (when (and (string= state "STARTED") (not (string= last-state state))) (org-clock-in))) (add-hook 'org-after-todo-state-change-hook 'wicked/org-clock-in-if-starting) (defadvice org-clock-in (after wicked activate) "Set this task's status to 'STARTED'." (org-todo "STARTED")) (defun wicked/org-clock-out-if-waiting () "Clock out when the task is marked WAITING." (when (and (string= state "WAITING") (equal (marker-buffer org-clock-marker) (current-buffer)) (< (point) org-clock-marker) (> (save-excursion (outline-next-heading) (point)) org-clock-marker) (not (string= last-state state))) (org-clock-out))) (add-hook 'org-after-todo-state-change-hook 'wicked/org-clock-out-if-waiting)))
What if you forgot to clock into a task when you started? No problem. Simply clock in and out of it, then edit the starting timestamp for the task in your ~/organizer.org file. To find a starting timestamp, move your cursor to the task headline. If the task has been collapsed to a single line, press TAB to expand it. Look for a line that starts with CLOCK:, or a collapsed segment that starts with :CLOCK:. If you see a collapsed segment, he expanded by moving a cursor to it and pressing tab. Find the clock entry you want to change, and if the timestamp, and press C-c C-y (org-evaluate-time-range) to update the time total.
To see how much time you’ve spent on a project or task, open your ~/organizer.org file and press C-c C-x C-d (org-clock-display). Total times will be added to each headline, summarizing the times for each subtree.
You can also use one of Org’s dynamic blocks. Open your ~/organizer.org file, move your cursor to where you want the report inserted, and type C-c C-x C-r (org-clock-report). By default, the reports will include all the second-level headings for all the days.
What if you want to limit the report to just the time you clocked last week?
To summarize it for a span of days, change the starting line from:
#+BEGIN: clocktable :maxlevel 2 :emphasize nil
to something like:
#+BEGIN: clocktable :maxlevel 2 :emphasize nil :tstart "<2007-12-25 Sun>" :tend "<2007-12-31 Mon>"
where tstart is the starting time/date and tend is the ending time/date. You can add the timestamps either manually or with C-c C-. (org-time-stamp). After you change the block definition, update the clock table by typing C-c C-x C-u (org-dblock-update).
You can also use a definition like:
#+BEGIN: clocktable :maxlevel 2 :emphasize nil :block today
to see today’s entries. Other block keywords are ‘yesterday’, ‘thisweek’, ‘lastweek’, ‘thismonth’, ‘lastmonth’, ‘thisyear’, or ‘lastyear’.
If you need more levels of headings, change the value of maxlevel. For example, to see a detailed clock table with up to 10 levels of headings, use
#+BEGIN: clocktable :maxlevel 10 :emphasize nil :block today
clocktable summarizes the reported time. What if you want the time broken down by day?
The following code creates a custom dynamic block that breaks the reported time by date. Add the following code to your ~/.emacs:
(defun org-dblock-write:rangereport (params) "Display day-by-day time reports." (let* ((ts (plist-get params :tstart)) (te (plist-get params :tend)) (start (time-to-seconds (apply 'encode-time (org-parse-time-string ts)))) (end (time-to-seconds (apply 'encode-time (org-parse-time-string te)))) day-numbers) (setq params (plist-put params :tstart nil)) (setq params (plist-put params :end nil)) (while (<= start end) (save-excursion (insert "\n\n" (format-time-string (car org-time-stamp-formats) (seconds-to-time start)) "----------------\n") (org-dblock-write:clocktable (plist-put (plist-put params :tstart (format-time-string (car org-time-stamp-formats) (seconds-to-time start))) :tend (format-time-string (car org-time-stamp-formats) (seconds-to-time end)))) (setq start (+ 86400 start))))))
After you load that code, you’ll be able to use a dynamic block of the form
#+BEGIN: rangereport :maxlevel 2 :tstart "<2007-12-25 Tue>" :tend "<2007-12-30 Sun>" ... #+END:
to see your time reported by date. Fill it in by moving your cursor within the block and typing C-c C-x C-u (org-dblock-update).
Org makes it easy to capture timeclock information by integrating the timeclock into your task list so that you don’t even have to think about it, and it can report this time by project or by date. You can use this information to bill clients, improve your time estimates, or reflect on the way you do things. All you have to do is clock in by marking a task as STARTED, and clock out by marking a task as WAITING or DONE. Don’t get discouraged if the time clock shows you do only a few hours of productive work each day. Use that to help you figure out how to do to things better!
Random Emacs symbol: term-previous-matching-input-string – Function: Return the string matching REGEXP ARG places along the input ring.
For the chapter on task management, I have 10,715 words or 38 pages of raw text that still need be edited. This probably means I’m going to miss my goal of December 31. I still need to write two more sections on using tags and projects, which will be roughly another 2,000 words. I’ll try to write another 1,000 words today. I’m planning to spend the evenings and all of January 1 working on this. I think I can finish it this week. I’ll e-mail my editor to adjust my goal one week forward.
The next chapter is the one on taking notes. It’s also 35 pages, and I’ve budgeted a month for it. If I push my current deadline forward one week, I might still be able to make it to my next deadline of January 31, 2008. The raw text should take me about six days of writing 2,000 words each. I’m planning to write about the one-file approach, Remember, Org, Planner, Howm, Records, and blogging from Emacs. Budget in maybe one weekend for editing, and that comes out to writing for three hours every other weekday and doing a little more work on it during weekends. This kind of schedule will help me avoid the mistake I did this month, which was focusing on work during weekday evenings and working on the book only during weekends.
I’m also happy to say that I’m getting the hang of dictating to Dragon NaturallySpeaking. I’ve trained it to recognize things like Emacs and C-c, and I’m getting used to working with a combination of typing and speaking. I carry a portable voice recorder with me, and I dictate into it after I’ve taken off my contact lenses and can’t work at the computer. I’ve been using it for blog posts, chapter drafts, and the occasional rant about Emacs versioning. I’m also getting the hang of not freaking out about the ungrammatical things that Dragon NaturallySpeaking thinks I’ve said.
And I like not having to type.
expertise and writing. It’s as true today as it was then, and my goal today is the same goal I had back then. I want to learn how to express my thoughts, and there’s no substitute for practice. Practice, practice, practice.It’s important to make room in your life for randomness. New ideas come from serendipitous juxtapositions. That’s why I have a Random Posts widget which picks some posts out of more than 4500 posts that I’ve written in the past five years. It gives me a reason to keep coming back to my own blog. For example, after I posted the entry on writer’s block today, I stumbled across an entry that I’d written over 2 years ago about
Practice means writing something even if I don’t feel like doing it. It’s funny, but once I start writing, things come a little more easily. Kirk is right. I don’t have to expect my first draft to feel right. I just have to get it out there, so that I can find out what I’m thinking, and I can edit it. Writing is mostly editing, anyway.
When I was writing my master’s thesis, I got stuck on chapters as well. What helped me then was the realization that it didn’t really matter what I put out was my first draft, because I was going to fix it. My supervisor was going to help me fix it. My thesis committee members were going to help me fix it. I just had to get the raw material out there, so that we all had something to play with. Once I got the raw material out there, putting together a full length draft that my supervisor could then read, things went so much faster.
I’m like that with this book as well. I need to get the chapters out of my head. It’s a little embarrassing posting all of these things and finding version dependencies, typos, bugs in my code, bugs in my writing… but the important thing is that it’s out there. I’m really lucky that people are reading it, commenting, correcting my errors, suggesting other things I can look into. I wouldn’t have that feedback if I didn’t write.
So I just have to get things out there. I need to throw some pots, because each pot will teach me something that will bring me closer to what I want to be able to do. I need to practice. I need to practice, practice, and practice. Even if it sometimes it doesn’t feel like I’m making much progress day by day, eventually I’ll get to the point where even I will be able to see the difference between how I’ll do things and how I used to do things before.
And hey, stuff like this gives me hope and something to stretch for. =)
Nope, neither; just writers. Writers who write for a living (ie they get paid to write in order to put food on the table and buy clothes for thier kids), write a lot and write a lot every day. For them, 10,000 words a day is just more of the same old same old, because theyâ€™d be writing 10,000 words per day even if they were not here on NaNo.