I was recently managing a set of interviews and I had my notes on all of the candidates in a single org file, with each candidate under their own top-level headline:
* J Kepler
- Nice work on orbits
* I Newton
- Hard to work with
* C Sagan
- Good communication skills
However, I wanted to generate a separate pdf file for each candidate that I could circulate to interviewers (since each interviewer was only interviewing a subset of applicants).
I came across this stackexchange answer that demonstrated how to build a function to export top level headlines to separate files. There are a few variations on that page, and I put together the slightly tweaked version below. All of the credit goes to stackexchange user
itsjeyd for a very detailed answer. In my version I hard code it to export to pdf, save the file first, and apply the export options from the parent file to each of the new files that are created. The new files have a name taken from the headline, with spaces replaced by underscores, unless the
:EXPORT_FILE_NAME: property is set for a headline.
;; export headlines to separate files
(defun org-export-headlines-to-pdf ()
"Export all subtrees that are *not* tagged with :noexport: to
Subtrees that do not have the :EXPORT_FILE_NAME: property set
are exported to a filename derived from the headline text."
(let ((modifiedp (buffer-modified-p)))
(goto-char (re-search-forward "^*"))
(let ((export-file (org-entry-get (point) "EXPORT_FILE_NAME")))
(replace-regexp-in-string " " "_" (nth 4 (org-heading-components)))))
(org-latex-export-to-pdf nil t)
(unless export-file (org-delete-property "EXPORT_FILE_NAME"))
To add or remove a tag from multiple headlines in an org-mode file, select a region containing multiple headlines and then run
M-x org-change-tag-in-region. You’ll be prompted for a tag and asked if you want to add or remove it from the selected headlines.
As I have mentioned before in my tutorial about todo lists and scheduled tasks in org-mode, my preferred way to view my agenda is to use
C-c a n to view a list of my scheduled tasks with unscheduled tasks below that.
I wanted to make a shorter keybinding for this view and I found this advice on how to achieve this. We just need to define a simple helper function like so
;;keybinding for favourite agenda view
(defun org-agenda-show-agenda-and-todo (&optional arg)
(org-agenda arg "n"))
I then add this to my personal key map
(define-key bjm-map (kbd "a") 'org-agenda-show-agenda-and-todo)
and I can pull up my agenda with
C-1 a. You might not want to use the same keybinding as me, but maybe you’ll find the idea helpful.
You can quickly sort tables in
org-mode by using
C-c ^ with the point inside a table. You’ll be prompted for a sorting type, where you can choose e.g.
a for alphabetic or
n for numeric. You can use capital letter versions of these options to reverse the sort.
The table is sorted based on the column that the point is in, and from the documentation:
The range of lines is the range between the nearest horizontal separator lines, or the entire table of no such lines exist.
I love the way that org-mode allows you to add simple clean structures to your text, with lists and tables. You can get some of that functionality in other modes by using
orgtbl-mode, which are part of
Enable these minor modes in any major mode for one-off use with
M-x orgstruct++-mode or
M-x orgtbl-mode and you can use the normal
org-mode commands to create lists and tables. I find this especially useful in emails, so I use this code in my emacs config file to automatically enable these for
;; use org structures and tables in message mode
(add-hook 'message-mode-hook 'turn-on-orgtbl)
(add-hook 'message-mode-hook 'turn-on-orgstruct++)
I recently needed to transpose a table in org-mode and spent a few minutes trying to come up with a keyboard macro to do it before it occurred to me that there might be a command to do this already. And of course there was:
M-x org-table-transpose-table-at-point. Here it is in action:
It’s great when there’s a command that does exactly what you want!
I (all too) often find myself failing to complete all the tasks I schedule for a particular day and so need to reschedule them in my org agenda. To do this (and other operations) on multiple items, mark the items in your agenda view using
m then hit
B to bring up the bulk action list and then
s to reschedule. This will set the new scheduled date to all marked items.
This trick is in the org-mode manual but it’s worth a quick mention in its own right. If you want to start a numbered list in org-mode from a number other than 1, then put
[@N] at the start of the first item, where
N is the number you want to start with. So for example,
1) item 1
2) item 2
This text would interrupt the list and the next item would be 1) on a
3) [@3] This will be item 3 thanks to [@3]
4) and this will be item 4
These days I write almost everything (e.g. research papers, lecture notes and slides) in org-mode, and then export to pdf (see my posts on org-mode here). This is a really pleasant and efficient way to create documents, but when working on a long document, it can take several seconds for emacs to compile the exported latex to pdf. During that time, emacs is hung up waiting for the compilation to finish, which is annoying.
I thought I’d share my workflow for streamlining this process. The key ingredient is not part of emacs. I use latexmk which is a perl script that watches a latex file and compiles it if it changes (or any file that it depends on changes). It will repeat the compilation (including calling bibtex) as many times as needed to resolve all references.
So, if I am working on a file, say
document.org, I will run
latexmk on the corresponding
tex file using
latexmk -pvc -pdf -view=none document.tex
-pcv option means to keep watching the file for changes and recompile as needed; the
-pdf option means build a pdf from the latex using
latexmk not to open a pdf viewer to show the resulting pdf.
I then open the resulting
document.pdf in skim, an excellent pdf viewer for the Mac (unfortunately hosted on sourceforge). The killer feature of
skim compared to the built-in OS X
preview app, is that it will automatically redisplay a pdf if the file changes (I believe
okular on linux do the same).
Putting the pieces together, I have latexmk running in a terminal, and an emacs window and skim window side by side. I then export my org file to latex with e.g.
C-c C-e l l which happens almost instantly and gives me control back of emacs. The latex is compiled in the background by
latexmk and then a few seconds later the pdf updates in
skim and I can see my changes.
In this post we’ll build on the simple todo list that we put together previously and add schedules and deadlines to our tasks to build a powerful agenda.
When adding a task (with
C-c c t) you can add a scheduled date to it with
C-c C-s or a deadline date with
C-c C-d, or both. These will pop up a calendar which you can navigate using shift and the arrow keys.
I prefer to schedule all new tasks to today’s date as a default, so I update the
org-capture-templates variable to
'(("t" "todo" entry (file+headline "~/todo.org" "Tasks")
"* TODO [#A] %?\nSCHEDULED: %(org-insert-time-stamp (org-read-date nil t \"+0d\"))\n")))
Now when you add a task, you will see a scheduled field like this
** TODO [#A]
SCHEDULED: <2015-12-08 Tue>
You can edit the date by putting the cursor in it and using shift + arrow keys.
Now instead of using
C-c a t to view your list of tasks, we will use
C-c a n to display a list of your scheduled tasks and then any unscheduled tasks below it.
I have several configuration options that I recommend. Add the following to your emacs config file if you like the look of them:
;; org-mode agenda options ;;
;;open agenda in current window
(setq org-agenda-window-setup (quote current-window))
;;warn me of any deadlines in next 7 days
(setq org-deadline-warning-days 7)
;;show me tasks scheduled or due in next fortnight
(setq org-agenda-span (quote fortnight))
;;don't show tasks as scheduled if they are already shown as a deadline
(setq org-agenda-skip-scheduled-if-deadline-is-shown t)
;;don't give awarning colour to tasks with impending deadlines
;;if they are scheduled to be done
(setq org-agenda-skip-deadline-prewarning-if-scheduled (quote pre-scheduled))
;;don't show tasks that are scheduled or have deadlines in the
;;normal todo list
(setq org-agenda-todo-ignore-deadlines (quote all))
(setq org-agenda-todo-ignore-scheduled (quote all))
;;sort tasks in order of when they are due and then by priority
((agenda deadline-up priority-down)
(todo priority-down category-keep)
(tags priority-down category-keep)
With these options we get a really useful view of our tasks when using
C-c a n. For example, here is a
todo.org file with a mixture of tasks with and without schedules and deadlines
** TODO [#A] do this today
SCHEDULED: <2015-12-08 Tue>
** TODO [#A] do this tomorrow
SCHEDULED: <2015-12-09 Wed>
** TODO [#A] this task is not scheduled
** TODO [#B] scheduled for today, priority B
SCHEDULED: <2015-12-08 Tue>
** TODO [#A] scheduled today and deadline in 2 days
DEADLINE: <2015-12-10 Thu> SCHEDULED: <2015-12-08 Tue>
** TODO [#A] deadline in 2 days and not scheduled
DEADLINE: <2015-12-10 Thu>
** TODO [#A] scheduled for monday
SCHEDULED: <2015-12-14 Mon>
** TODO [#C] do this today if I get time
SCHEDULED: <2015-12-08 Tue>
** TODO [#B] neither is this one
** TODO [#C] or this one
** TODO [#A] deadline in 10 days and not scheduled
DEADLINE: <2015-12-18 Fri>
When I view the agenda associated with this file I see this