]> code.delx.au - gnu-emacs-elpa/blob - packages/gnorb/gnorb.org
Merging Gnorb commits up to 1.0.1
[gnu-emacs-elpa] / packages / gnorb / gnorb.org
1 #+TEXINFO_CLASS: info
2 #+TEXINFO_HEADER: @syncodeindex pg cp
3 #+TITLE: Gnorb Manual
4 #+SUBTITLE: for version 1, updated 3 October, 2014
5 #+TEXINFO_DIR_CATEGORY: Emacs
6 #+TEXINFO_DIR_TITLE: Gnorb: (gnorb)
7 #+TEXINFO_DIR_DESC: Glue code for Gnus, Org, and BBDB
8 #+OPTIONS: *:nil num:t toc:nil
9 * Introduction
10
11 Gnorb provides glue code between the Gnus, Org, and BBDB packages.
12 It's aimed at supporting email-based project management, and generally
13 making it easier to keep track of email communication.
14
15 Much of the code consists of single-use convenience functions, but
16 tracking email conversations with Org requires is more complicated,
17 and requires a bit of setup.
18
19 Gnorb can be used in a modular fashion, by selectively loading the
20 files "gnorb-org", "gnorb-gnus" or "gnorb-bbdb" instead of plain old
21 "gnorb". The package as a whole is rather Org-centric, though, and it
22 won't do much of interest without "gnorb-org".
23
24 This means that Gnorb doesn't have hard requirements to any of the
25 three base libraries. For the libraries you are using, however, you'll
26 get best results from using the most recent stable version (yes, that
27 means BBDB 3). Some of the features in Gnorb only work with
28 development versions of these libraries (those cases are noted below).
29 * Installation
30 Gnorb is best installed via the Elpa package manager -- look for it in
31 `list-packages'.
32
33 You can also clone the source code from
34 https://github.com/girzel/gnorb, and put the "gnorb" directory on your
35 load-path. The Github site is also a good place to report bugs and
36 other issues.
37 * Setup
38 Loading "gnorb" will make the basic functions available. Using Gnorb
39 for email tracking takes a bit more setup, however:
40
41 1. Email tracking is done via the Gnus registry, so that must be
42 activated with 'gnus-registry-initialize'.
43 2. It also requires the org-id package to be loaded, and
44 `org-id-track-globally' set to t (that's the default value, so
45 simply loading the package should be enough).
46 3. Add a nngnorb entry to your `gnus-secondary-select-methods'
47 variable. It will look like (nngnorb "Server name"). This does
48 nothing but provide a place to hang nnir searches.
49 4. Then put a call to `gnorb-tracking-initialize' in your init files,
50 at some point after the Gnus registry is initialized.
51 5. If you're not using a local archive method for saving your sent
52 messages (ie you're using IMAP), you'll also need to tell Gnorb
53 where to find your sent messages. Set the variable
54 `gnorb-gnus-sent-groups' to a list of strings; each string should
55 indicate a fully-qualified group name, eg "nnimap+SERVER:GROUP".
56
57 Lastly, Gnorb doesn't bind any keys by default; see the [[id:de1b2579-86c2-4bb1-b77e-3467a3d2b3c7][Suggested
58 Keybindings]] section below for possibilities.
59 * Email Tracking
60 The most interesting thing Gnorb does is using Org headings to track
61 email conversations. This can mean anything from reminding yourself to
62 write to your mother, to conducting delicate business negotiations
63 over email, to running an email-based bug tracker.
64
65 Gnorb assists in this process by using the Gnus registry to track
66 correspondences between emails and Org headings -- specifically,
67 message IDs are associated with Org heading ids. As a conversation
68 develops, messages are collected on a heading (and/or its children).
69 You can compose new messages directly from the Org heading, and Gnorb
70 will automatically associate your sent message with the conversation.
71 You can open temporary Gnus *Summary* buffers holding all the messages
72 associated with an Org subtree, and reply from there. When you receive
73 new messages relevant to a conversation, Gnorb will notice them and
74 prompt you to associate them with the appropriate Org heading.
75 Attachments on incoming messages can be automatically saved as
76 attachments on Org headings, using org-attach.
77
78 In general, the goal is to keep track of whole conversations, reduce
79 friction when moving between Gnus and Org, and keep you in the Org
80 agenda rather than in Gnus.
81 ** Email-Related Commands
82 Email tracking starts in one of three ways:
83
84 1. With an Org heading that represents an email TODO. Call
85 `gnorb-org-handle-mail' (see below) on the heading to compose a new
86 message, and start the tracking process.
87 2. By calling org-capture on a received message. Any heading captured
88 from a message will automatically be associated with that message.
89 3. By calling `gnorb-gnus-outgoing-do-todo' in a message composition
90 buffer -- see below.
91
92 There are three main email-related commands:
93
94 1. `gnorb-org-handle-mail' is called on an Org heading to compose a
95 new message. By default, this will begin a reply to the most recent
96 message in the conversation. If there are no associated messages to
97 reply to (or you call the function with a double prefix arg), Gnorb
98 will look for mailto: or bbdb: links in the heading, and compose a
99 new message to them.
100
101 The sent message will be associated with the Org heading, and
102 you'll be brought back to the heading and asked to trigger an
103 action on it.
104
105 `gnorb-email-subtree' is an alternative entry-point to
106 `gnorb-org-handle-mail'. It does the same thing as the latter, but
107 first exports the body of the subtree as either text or a file,
108 then inserts the text into the message body, or attaches the file
109 to the message, depending on what you've chosen.
110 2. `gnorb-gnus-incoming-do-todo' is called on a message in a Gnus
111 *Summary* buffer. You'll be prompted for an Org heading, taken to
112 that heading, and asked to trigger an action on it.
113 3. `gnorb-gnus-outgoing-do-todo' is called in message mode, while
114 composing a new message.
115
116 If called without a prefix arg, a new Org heading will be created
117 after the message is sent, and the sent message associated with it.
118 The new heading will be created as a capture heading, using the
119 template specified by the `gnorb-gnus-new-todo-capture-key' option.
120
121 If you call this function with a single prefix arg, you'll be
122 prompted to choose an existing Org heading instead. After the the
123 message is sent, you'll be taken to that heading and prompted to
124 trigger an action on it.
125
126 If you've called this function, and then realize you've associated
127 the message with the wrong TODO, call it again with a double prefix
128 to clear all associations.
129
130 It's also possible to call this function *after* a message is sent,
131 in case you forgot. Gnorb saves information about the most recently
132 sent message for this purpose.
133
134 Because these three commands all express a similar intent, but are
135 called in different modes, it can make sense to give each of them the
136 same keybinding in the keymaps for Org mode, Gnus summary mode, and
137 Message mode, respectively.
138 ** Trigger Actions
139 After calling `gnorb-gnus-incoming-do-todo' on a message, or after
140 sending a message associated with an Org heading, you'll be taken to
141 the heading and asked to "trigger an action" on it. At the moment
142 there are four different possibilities: triggering a TODO state-change
143 on the heading, taking a note on the heading (both these options will
144 associate the message with the heading), associating the message but
145 doing nothing else, and lastly, doing nothing at all.
146
147 More actions will be added in the future; it's also possible to
148 rearrange or delete existing actions, and add your own: see the
149 docstring of `gnorb-org-trigger-actions'.
150 ** Viewing Tracked Messages in *Summary* Buffers
151 :PROPERTIES:
152 :END:
153 Call `gnorb-org-view' on an Org heading to open an nnir *Summary*
154 buffer showing all the messages associated with that heading (this
155 requires that you've added an nngnorb server to your Gnus backends). A
156 minor mode will be in effect, ensuring that any replies you send to
157 messages in this buffer will automatically be associated with the
158 original Org heading. You can also invoke
159 `gnorb-summary-disassociate-message' ("C-c d") to disassociate the
160 message with the Org heading.
161
162 As a bonus, it's possible to go into Gnus' *Server* buffer, find the
163 line specifying your nngnorb server, and hit "G" (aka
164 `gnus-group-make-nnir-group'). At the query prompt, enter an Org-style
165 tags-todo Agenda query string (eg "+work-computer", or what have you).
166 Gnorb will find all headings matching this query, scan their subtrees
167 for gnus links, and then give you a Summary buffer containing all the
168 linked messages. This is dog-slow at the moment; it will get faster.
169
170 ** Hinting in Gnus
171 :PROPERTIES:
172 :END:
173 When you receive new mails that might be relevant to existing Org
174 TODOs, Gnorb can alert you to that fact. When
175 `gnorb-gnus-hint-relevant-article' is t (the default), Gnorb will
176 display a message in the minibuffer when opening potentially relevant
177 messages. You can then use `gnorb-gnus-incoming-to-todo' to trigger an
178 action on the relevant TODO.
179
180 This hinting can happen in the Gnus summary buffer as well. If you use
181 the escape indicated by `gnorb-gnus-summary-mark-format-letter" as
182 part of your `gnus-summary-line-format', articles that are relevant to
183 TODOs will be marked with a special character in the Summary buffer,
184 as determined by `gnorb-gnus-summary-mark'. By default, the format
185 letter is "g" (meaning it is used as "%ug" in the format line), and
186 the mark is "¡".
187 ** Message Attachments
188 :PROPERTIES:
189 :END:
190 Gnorb simplifies the handling of attachments that you receive in
191 emails. When you call `gnorb-gnus-incoming-do-todo' on a message,
192 you'll be prompted to re-attach the email's attachments onto the Org
193 heading, using the org-attach library.
194
195 You can also do this as part of the capture process. Set the
196 new :gnus-attachments key to "t" in a capture template that you use on
197 mail messages, and you'll be queried to re-attach the message's
198 attachments onto the newly-captured heading. Or set
199 `gnorb-gnus-capture-always-attach' to "t" to have Gnorb do this for
200 all capture templates.
201
202 You can also do this using the regular system of MIME commands,
203 without invoking the email tracking process. See [[id:de1b2579-86c2-4bb1-b77e-3467a3d2b3c7][Suggested
204 Keybindings]], below.
205
206 The same process works in reverse: when you send a message from an Org
207 heading using `gnorb-org-handle-mail', Gnorb will ask if you want to
208 attach the files in the heading's org-attach directory to the outgoing
209 message.
210 ** Likely Workflow
211 You receive an email from Jimmy, who wants to rent a room in your
212 house. "I'll respond to this later," you think.
213
214 You capture an Org TODO from the email, call it "Jimmy renting a
215 room", and give it a REPLY keyword. Gnorb quietly records the
216 correspondence between the email and the TODO, using the Gnus
217 registry.
218
219 The next day, looking at your Agenda, you see the TODO and decide to
220 respond to the email. You call `gnorb-org-handle-mail' on the heading,
221 and Gnorb opens Jimmy's email and starts a reply to it.
222
223 You tell Jimmy the room's available in March, and send the message.
224 Gnorb takes you back to the heading, and asks you to trigger an action
225 on it. You choose "todo state", and change the heading keyword to
226 WAIT.
227
228 Two days later, Jimmy replies to your message, saying that March is
229 perfect. When you open his response, Gnorb politely reminds you that
230 the message is relevant to an existing TODO. You call
231 `gnorb-gnus-incoming-do-todo' on the message, and are again taken to
232 the TODO and asked to trigger an action. Again you choose "todo
233 state", and change the heading keyword back to REPLY.
234
235 You get another email, from Samantha, warning you not to rent the room
236 to Jimmy. She even attaches a picture of a room in her house, as it
237 looked after Jimmy had stayed there for six months. It's bad. You call
238 `gnorb-gnus-incoming-do-todo' on her message, and pick the "Jimmy
239 renting a room" heading. This time, you choose "take note" as the
240 trigger action, and make a brief note about how bad that room looked.
241 Gnorb asks if you'd like to attach the picture to the Org heading. You
242 decide you will.
243
244 Now it's time to write to Jimmy and say something noncommittal.
245 Calling `gnorb-org-handle-mail' on the heading would respond to
246 Samantha's email, the most recent of the associated messages, which
247 isn't what you want. Instead you call `gnorb-org-view' on the heading,
248 which opens up a Gnus *Summary* buffer containing all four messages:
249 Jimmy's first, your response, his response to that, and Samantha's
250 message. You pick Jimmy's second email, and reply to it normally.
251 Gnorb asks if you'd like to send the picture of the room as an
252 attachment. You would not. When you send the reply Gnorb tracks that
253 as well, and does the "trigger an action" trick again.
254
255 In this way Gnorb helps you manage an entire conversation, possibly
256 with multiple threads and multiple participants. Mostly all you need
257 to do is call `gnorb-gnus-incoming-do-todo' on newly-received
258 messages, and `gnorb-org-handle-mail' on the heading when it's time to
259 compose a new reply.
260 * Restoring Window Layout
261 Many Gnorb functions alter the window layout and value of point. In
262 most of these cases, you can restore the previous layout using the
263 interactive function `gnorb-restore-layout'.
264
265 * Recent Mails From BBDB Contacts
266 :PROPERTIES:
267 :END:
268 If you're using a recent git version of BBDB (circa mid-May 2014 or
269 later), you can give your BBDB contacts a special field which will
270 collect links to recent emails from that contact. The default name of
271 the field is "messages", but you can customize that name using the
272 `gnorb-bbdb-messages-field' option.
273
274 Gnorb will not collect links by default: you need to call
275 `gnorb-bbdb-open-link' on a contact once to start the process.
276 Thereafter, opening mails from that contact will store a link to the
277 message.
278
279 Once some links are stored, `gnorb-bbdb-open-link' will open them: Use
280 a prefix arg to the function call to select particular messages to
281 open. There are several options controlling how all this works; see
282 the gnorb-bbdb user options section below for details.
283 * BBDB posting styles
284 :PROPERTIES:
285 :END:
286 Gnorb comes with a BBDB posting-style system, inspired by (copied
287 from) gnus-posting-styles. You can specify how messages are composed
288 to specific contacts, by matching on contact field values (the same
289 way gnus-posting-styles matches on group names). See the docstring of
290 `gnorb-bbdb-posting-styles' for details.
291
292 In order not to be too intrusive, Gnorb doesn't alter the behavior of
293 `bbdb-mail', the usual mail-composition function. Instead it provides
294 an alternate `gnorb-bbdb-mail', which does exactly the same thing, but
295 first processes the new mail according to `gnorb-bbdb-posting-styles'.
296 If you want to use this feature regularly, you can remap `bbdb-mail'
297 to `gnorb-bbdb-mail' in the `bbdb-mode-map'.
298 * BBDB Org tagging
299 BBDB contacts can be tagged with the same tags you use in your Org
300 files. This allows you to pop up a *BBDB* buffer alongside your Org
301 Agenda when searching for certain tags. This can happen automatically
302 for all Org tags-todo searches, if you set the option
303 `gnorb-org-agenda-popup-bbdb' to t. Or you can do it manually, by
304 calling the command of the same name. This command only shows TODOs by
305 default: use a prefix argument to show all tagged headings.
306
307 Tags are stored in an xfield named org-tags, by default. You can
308 customize the name of this field using `gnorb-bbdb-org-tag-field'.
309 * Misc BBDB
310 ** Searching for messages from BBDB contacts
311 :PROPERTIES:
312 :END:
313 Call `gnorb-bbdb-mail-search' to search for all mail messages from the
314 record(s) displayed. Currently supports the notmuch, mairix, and
315 namazu search backends; set `gnorb-gnus-mail-search-backend' to one of
316 those symbol values.
317 ** Citing BBDB contacts
318 :PROPERTIES:
319 :END:
320 Calling `gnorb-bbdb-cite-contact' will prompt for a BBDB record and
321 insert a string of the type "Bob Smith <bob@smith.com>".
322 ** User Options
323 - `gnorb-bbdb-org-tag-field :: The name of the BBDB xfield, as a
324 symbol, that holds Org-related tags. Specified as a string with
325 the ":" separator between tags, same as for Org headings.
326 Defaults to org-tag.
327 - `gnorb-bbdb-messages-field' :: The name of the BBDB xfield that
328 holds links to recently-received messages from this contact.
329 Defaults to 'messages.
330 - `gnorb-bbdb-collect-N-messages' :: Collect at most this many links
331 to messages from this contact. Defaults to 5.
332 - `gnorb-bbdb-define-recent' :: What does "recently-received" mean?
333 Possible values are the symbols seen and received. When set to
334 seen, the most recently-opened messages are collected. When set
335 to received, the most recently-received (by Date header) messages
336 are collected. Defaults to seen.
337 - `gnorb-bbdb-message-link-format-multi' :: How is a single message's
338 link formatted in the multi-line BBDB layout format? Defaults to
339 "%:count. %D: %:subject" (see the docstring for details).
340 - ` gnorb-bbdb-message-link-format-one' :: How is a single message's
341 link formatted in the one-line BBDB layout format? Defaults to
342 nil (see the docstring for details).
343 - `gnorb-bbdb-posting-styles' :: Styles to use for influencing the
344 format of mails composed to the BBDB record(s) under point (see
345 the docstring for details).
346 * Misc Org
347 ** Inserting BBDB links
348 :PROPERTIES:
349 :END:
350 Calling `gnorb-org-contact-link' will prompt for a BBDB record and
351 insert an Org link to that record at point.
352 ** User Options
353 - `gnorb-org-after-message-setup-hook' :: Hook run in a message buffer
354 after setting up the message, from `gnorb-org-handle-mail' or
355 `gnorb-org-email-subtree'.
356 - `gnorb-org-trigger-actions' :: List of potential actions that can be
357 taken on headings after a message is sent. See docstring for
358 details.
359 - `gnorb-org-mail-scan-scope' :: The number of paragraphs to scan for
360 mail-related links. This comes into play when calling
361 `gnorb-org-handle-mail' on a heading with no associated messages,
362 or when `gnorb-org-handle-mail' is called with a prefix arg.
363 - `gnorb-org-find-candidates-match' :: When searching all Org files
364 for headings to collect messages from, this option can limit
365 which headings are searched. It is used as the second argument to
366 a call to `org-map-entries', and has the same syntax as that used
367 in an agenda tags view.
368 - `gnorb-org-email-subtree-text-parameters' :: A plist of export
369 parameters corresponding to the EXT-PLIST argument to the export
370 functions, for use when exporting to text.
371 - `gnorb-org-email-subtree-file-parameters' :: A plist of export
372 parameters corresponding to the EXT-PLIST argument to the export
373 functions, for use when exporting to a file.
374 - `gnorb-org-email-subtree-text-options' :: A list of ts and nils
375 corresponding to Org's export options, to be used when exporting
376 to text. The options, in order, are async, subtreep,
377 visible-only, and body-only.
378 - `gnorb-org-email-subtree-file-options' :: A list of ts and nils
379 corresponding to Org's export options, to be used when exporting
380 to a file. The options, in order, are async, subtreep,
381 visible-only, and body-only.
382 - `gnorb-org-export-extensions' :: Correspondence between export
383 backends and their respective (usual) file extensions.
384 - `gnorb-org-capture-collect-link-p' :: When this is set to t, the
385 capture process will always store a link to the Gnus message or
386 BBDB record under point, even when the link isn't part of the
387 capture template. It can then be added to the captured heading
388 with org-insert-link, as usual.
389 - `gnorb-org-agenda-popup-bbdb' :: Set to "t" to automatically pop up
390 the BBDB buffer displaying records corresponding to the Org
391 Agenda tags search underway. If this is nil you can always do it
392 manually with the command of the same name.
393 - `gnorb-org-bbdb-popup-layout' :: Controls the layout of the
394 Agenda-related BBDB popup, takes the same values as
395 bbdb-pop-up-layout.
396 * Misc Gnus
397 ** Viewing Org headlines relevant to a message
398 :PROPERTIES:
399 :END:
400 Call `gnorb-gnus-view' on a message that is associated with an Org
401 heading to jump to that heading.
402 ** User Options
403 - `gnorb-gnus-mail-search-backend' :: Specifies the search backend
404 that you use for searching mails. Currently supports notmuch,
405 mairix, and namazu: set this option to one of those symbols.
406 - `gnorb-gnus-capture-always-attach' :: Treat all capture templates as
407 if they had the :gnus-attachments key set to "t". This only has
408 any effect if you're capturing from a Gnus summary or article
409 buffer.
410 - `gnorb-trigger-todo-default' :: Set to either 'note or 'todo to tell
411 `gnorb-gnus-incoming-do-todo' what to do by default. You can
412 reach the non-default behavior by calling that function with a
413 prefix argument. Alternately, set to 'prompt to always prompt for
414 the appropriate action.
415 - `gnorb-gnus-trigger-refile-targets' :: If you use
416 `gnorb-gnus-incoming-do-todo' on an incoming message, Gnorb will
417 try to locate a TODO heading that's relevant to that message. If
418 it can't, it will prompt you for one, using the refile interface.
419 This option will be used as the value of `org-refile-targets'
420 during that process: see the docstring of `org-refile-targets'
421 for the appropriate syntax.
422 - `gnorb-gnus-new-todo-capture-key' :: Set this to a single-character
423 string pointing at an Org capture template to use when creating
424 TODOs from outgoing messages. The template is a regular capture
425 template, with a few exceptions. If Gnus helps you archive
426 outgoing messages (ie you have `gnus-message-archive-group' set
427 to something, and your outgoing messages have a "Fcc" header), a
428 link to that message will be made, and you'll be able to use all
429 the escapes related to gnus messages. If you don't archive
430 outgoing messages, you'll still be able to use the %:subject,
431 %:to, %:toname, %:toaddress, and %:date escapes in the capture
432 template.
433 - `gnorb-gnus-hint-relevant-article' :: Set to "t" (the default) to
434 have Gnorb give you a hint in the minibuffer when opening
435 messages that might be relevant to existing Org TODOs.
436 - `gnorb-gnus-summary-mark-format-letter' :: The formatting letter to
437 use as part of your `gnus-summary-line-format', to indicate
438 messages which might be relevant to Org TODOs. Defaults to "g",
439 meaning it should be used as "%ug" in the format line.
440 - `gnorb-gnus-summary-mark' :: The mark used to indicate relevant
441 messages in the Summary buffer, when
442 `gnorb-gnus-summary-mark-format-letter' is present in the format
443 line. Defaults to "¡".
444 * Suggested Keybindings
445 :PROPERTIES:
446 :ID: de1b2579-86c2-4bb1-b77e-3467a3d2b3c7
447 :END:
448 #+BEGIN_SRC emacs-lisp
449 (eval-after-load "gnorb-bbdb"
450 '(progn
451 (define-key bbdb-mode-map (kbd "O") 'gnorb-bbdb-tag-agenda)
452 (define-key bbdb-mode-map (kbd "S") 'gnorb-bbdb-mail-search)
453 (define-key bbdb-mode-map [remap bbdb-mail] 'gnorb-bbdb-mail)
454 (define-key bbdb-mode-map (kbd "l") 'gnorb-bbdb-open-link)
455 (global-set-key (kbd "C-c C") 'gnorb-bbdb-cite-contact)))
456
457 (eval-after-load "gnorb-org"
458 '(progn
459 (org-defkey org-mode-map (kbd "C-c C") 'gnorb-org-contact-link)
460 (org-defkey org-mode-map (kbd "C-c t") 'gnorb-org-handle-mail)
461 (org-defkey org-mode-map (kbd "C-c e") 'gnorb-org-view)
462 (org-defkey org-mode-map (kbd "C-c E") 'gnorb-org-email-subtree)
463 (org-defkey org-mode-map (kbd "C-c V") 'gnorb-org-popup-bbdb)
464 (setq gnorb-org-agenda-popup-bbdb t)
465 (eval-after-load "org-agenda"
466 '(progn (org-defkey org-agenda-mode-map (kbd "H") 'gnorb-org-handle-mail)
467 (org-defkey org-agenda-mode-map (kbd "V") 'gnorb-org-popup-bbdb)))))
468
469 (eval-after-load "gnorb-gnus"
470 '(progn
471 (define-key gnus-summary-mime-map "a" 'gnorb-gnus-article-org-attach)
472 (define-key gnus-summary-mode-map (kbd "C-c t") 'gnorb-gnus-incoming-do-todo)
473 (push '("attach to org heading" . gnorb-gnus-mime-org-attach)
474 gnus-mime-action-alist)
475 ;; The only way to add mime button command keys is by redefining
476 ;; gnus-mime-button-map, possibly not ideal. Ideal would be a
477 ;; setter function in gnus itself.
478 (push '(gnorb-gnus-mime-org-attach "a" "Attach to Org heading")
479 gnus-mime-button-commands)
480 (setq gnus-mime-button-map
481 (let ((map (make-sparse-keymap)))
482 (define-key map gnus-mouse-2 'gnus-article-push-button)
483 (define-key map gnus-down-mouse-3 'gnus-mime-button-menu)
484 (dolist (c gnus-mime-button-commands)
485 (define-key map (cadr c) (car c)))
486 map))))
487
488 (eval-after-load "message"
489 '(progn
490 (define-key message-mode-map (kbd "C-c t") 'gnorb-gnus-outgoing-do-todo)))
491 #+END_SRC