You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

281 lines
9.0 KiB

# Emacs Org-mode
It's hard to introduce [org-mode]. Most emacs users are familiar with it
or have, at least, used it at some point or another. I personally have
only been using it for about six months, but it has taken a pivotal role
in my daily workflows. I will describe how I use it and how I have
configured it. As always, feel free to tweak it to fit your needs.
=> https://orgmode.org org-mode
# My use cases
## Logbook/TODO-list
This is a little bit special. I use `org-mode' as a project
tracker. Yes, we use JIRA and I actually integrate it [with Emacs],
but pure org-mode for my personal notes and logbook is a better fit
for me.
[Image-placeholder]
As you can see, I keep track of my tasks using `org-mode', but also
add notes to the tasks if necessary. For development purposes, I also
keep a log of problems that I have encountered and resolutions for
these problems. That way I can go back to these notes in the future if
needed. I keep this data saved as `todo.gpg' that gets encrypted and
decrypted when opening and saving.
=> https://www.emacswiki.org/emacs/OrgJiraMode with Emacs
## Agenda
`org-mode' also works well when you want to combine your to-do list
with your calendar. If, like me, you have your calendar on Google
Calendar, you should check out [org-gcal]. For the most part, I always
have a terminal tab with the agenda up and refresh it periodically to
have the latest appointments and task schedules and deadlines.
=> https://github.com/myuhe/org-gcal.el org-gcal
## Journal
Great practice and excellent substitute for therapy. Store thoughts,
experiences and ideas. Highly recommended. I use the wonderful
[org-journal] package for this.
=> https://github.com/bastibe/org-journal org-journal
## Blogging
I write this blog using `org-mode' :) (thanks [org2blog]). I can't
imagine writing it in any other way.
=> https://github.com/org2blog/org2blog org2blog
## RSS List
I just replaced my RSS reader of choice with [elfeed]. It's a simple
emacs-based RSS reader. Fast, no frills and straightforward. To keep a
list of my RSS feeds, I imported an OPML into [elfeed-org] and now
keep all my RSS feeds in one beautiful org-file that I can easily
manage and sync.
There's plenty of reasons to use `org-mode'. I have used it for email,
but honestly, I have been unable to find a suitable workflow for
it. Longform writing is something I would like to spend more time
doing, and `org-mode' seems like a great platform to get started with
to do it.
=> https://github.com/skeeto/elfeed elfeed
=> https://github.com/remyhonig/elfeed-org elfeed-org
# My configuration
```
(setenv "GPG_AGENT_INFO" nil)
(setq epg-gpg-program "/usr/local/bin/gpg2")
(require 'epa-file)
(require 'password-cache)
(setq password-cache-expiry (* 15 60))
(setq epa-file-cache-passphrase-for-symmetric-encryption t)
```
First of all, I load GPG for encryption/decryption of gpg files. I set
a generous expiration because this is my work desktop and I always
keep it locked.
```
(require 'org-install)
(package-initialize)
(global-set-key "\C-cl" 'org-store-link)
(global-set-key "\C-cc" 'org-capture)
(global-set-key "\C-ca" 'org-agenda)
(global-set-key "\C-cr" 'org-gcal-sync)
```
I load `org-mode' and set the shortcuts to store links (it's easier
this way for me 😊), capture (for agenda, work TODO, etc) and pull up
the agenda.
```
(setq org-directory "~/Documents/org/")
(setq org-default-notes-file "~/Documents/org/scrapbook.gpg")
(setq org-agenda-files (list "~/Documents/org/todo.gpg" "~/Documents/org/work_cal.org" "~/Documents/org/personal_cal.org"))
```
Here I'm setting the directory structure. `org-directory' sets the
default `org-mode' directory for file storage. Notes are created with
`org-default-notes-file', and `org-agenda-files' lists all the files
loaded by default in the Agenda.
```
(add-hook 'org-mode-hook #'(lambda ()
(visual-line-mode)
(org-indent-mode)))
(add-hook 'org-mode-hook #'toggle-word-wrap)
(defun my/org-mode-hook ()
"My `org-mode' hook"
(set-face-attribute 'org-document-info-keyword nil :foreground "yellow")
(set-face-attribute 'org-document-info nil :foreground "cornflower blue")
(set-face-attribute 'org-document-title nil :foreground "cornflower blue"))
(add-hook 'org-mode-hook 'my/org-mode-hook)
```
Some color tweaks and line-wrapping. `org-mode' doesn't wrap lines by
default, but that has an easy fix.
```
(setq org-todo-keywords
'((sequence "TODO(t)" "PENDING(p!)" "WAIT(w@)" "VERIFY(v)" "|" "DONE(d!)" "CANCELED(c@)")
(sequence "REPORT(r@)" "BUG(b@)" "KNOWNCAUSE(k@)" "|" "FIXED(f!)")))
(global-set-key (kbd "C-c s")
(lambda () (interactive) (find-file "~/Documents/org/scrapbook.gpg")))
(global-set-key (kbd "C-c w")
(lambda () (interactive) (find-file "~/Documents/org/todo.gpg")))
(setq org-log-done 'time)
(setq org-list-allow-alphabetical t)
```
Define files for notes and for the to-do list. Here we also define the
to-do sequences and indicate whether I want them timestamped (!) or
timestamped and with a comment (@).
```
(setq org-capture-templates
'(("n" "Personal Note" entry (file "~/Documents/org/scrapbook.gpg")
"* PERSONAL NOTE %?\n%U\n" :empty-lines 1)
("w" "Work Note" entry (file "~/Documents/org/scrapbook.gpg")
"* WORK NOTE %?\n%U\n" :empty-lines 1)
("j" "Journal" entry
(file+datetree "~/Documents/org/journal.gpg")
"**** %U%?\n%a" :tree-type week))
)
```
Define the capture modes. I only have personal and work notes and
journal capture.
```
(eval-after-load "org"
'(require 'ox-md nil t))
```
Markdown export. We use markdown at work a lot. It makes my life
easier if I have direct conversion to markdown.
```
(setq org-agenda-span 4)
```
`org-agenda' will only load the next 4 days. I don't need any more
than that.
```
(require 'org2blog-autoloads)
(require 'netrc)
(require 'auth-source)
(let (credentials)
(add-to-list 'auth-sources "~/.authinfo")
(setq credentials (auth-source-user-and-password "arenzana.org"))
(setq org2blog/wp-blog-alist
`(("arenzanaorg"
:url "https://arenzana.org/xmlrpc.php"
:username ,(car credentials)
:password ,(cadr credentials)
:default-title "Hello World"
:default-categories ("emacs")
:tags-as-categories nil))))
(setq org2blog/wp-use-sourcecode-shortcode nil)
;; removed light="true"
(setq org2blog/wp-sourcecode-default-params nil)
;; target language needs to be in here
(setq org2blog/wp-sourcecode-langs
'("actionscript3" "bash" "coldfusion" "cpp" "csharp" "css" "delphi"
"erlang" "fsharp" "diff" "groovy" "javascript" "java" "javafx" "matlab"
"objc" "perl" "php" "text" "powershell" "python" "ruby" "scala" "sql"
"vb" "xml" "go" "sh" "emacs-lisp" "lisp" "lua"))
;; this will use emacs syntax higlighting in your #+BEGIN_SRC
;; <language> <your-code> #+END_SRC code blocks.
(setq org-src-fontify-natively t)
```
For `org-2blog' We begin by loading it and `.netrc'. In my case, I'm
using `.authinfo' that I keep encrypted as well. It stores my blog
credentials. Since I only have one blog, I just add it as
`arenzanaorg' to the wordpress blog list, set some defaults, and then
set some source code defaults. I got most of this configuration from
[here]. Great resource!
```
(require 'org-gcal)
(load-library "~/.gcal.el.gpg")
(setq org-gcal-file-alist '(("iarenzana@gmail.com" . "~/Documents/org/personal_cal.org")
("iarenzana@indigital.net" . "~/Documents/org/work_cal.org")))
```
[Image Placeholder]
`org-gcal' is the package I use to pull [Google Calendar] data into
Emacs and, ultimately, `org-agenda'. Earlier in the set up I created a
shortcut for `org-gcal-sync' to update the calendars on demand. After
that, I just press `r' in `org-agenda' to refresh the buffer and the
new events show up . In order to not publish API keys to any
repository, I keep this information in a `.gcal.el.gpg' file stored in
my home directory. This is what the structure of that file looks like:
```
;; -*- epa-file-encrypt-to: ("user@example.com") -*-
(setq org-gcal-client-id "clientid"
org-gcal-client-secret "secretkey")
```
Make sure you substitute the email address with your PGP key's email
and both `clientid' and `secretid' with the ones generated at [Google
Cloud] for your calendar. To do this, create a new oauth key pair.
=> http://blog.binchen.org/posts/how-to-use-org2blog-effectively-as-a-programmer.html here
=> https://calendar.google.com Google Calendar
=> https://cloud.google.com/ Google Cloud
# Caveats
There's a few things that still bother me that I want to tackle. First
of them is the `yellow' output of my blog's HTML code source. I'm
disabling colors by not specifying `emacs-lisp' as the language, but
this is a bad work around. I have been unable to correctly format the
HTML template for this, so I will need to keep researching.
Also, every time I open emacs I'm prompted for `.gcal.el.gpg''s
password. I'd like to delay this until I call `org-gcal'.
# Summary
I know I've flown over my `org-mode' set up, but going in depth would
take a lot more posts (which I may write). For now this is a short
introduction to how I use the package and some of the possibilities
that might bring ideas on how to improve your workflows.