A better return in org-mode
Posted April 09, 2017 at 10:56 AM | categories: orgmode, emacs | tags:
Updated April 20, 2017 at 09:19 AM
Table of Contents
Over on Stackoverflow someone wanted a better return in org-mode. They wanted return to add items in a list (instead of M-Ret). Someone posted a partial solution, and here I improve on it to add new items to lists, new headings after a heading, and new rows to tables. In each case, a double return on an empty item, headline or table row will delete that line, and terminate the list, headlines or table. You can still use M-Ret, and this function falls through to org-return like it did before. You can use a prefix arg to get a regular return if you want one (e.g. you want to press enter on a headline to push it down).
Here is the function. Give it a try. It is a small but helpful addition I think. I have not used it for long, so if you come across issues leave a comment!
(require 'org-inlinetask) (defun scimax/org-return (&optional ignore) "Add new list item, heading or table row with RET. A double return on an empty element deletes it. Use a prefix arg to get regular RET. " (interactive "P") (if ignore (org-return) (cond ((eq 'line-break (car (org-element-context))) (org-return-indent)) ;; Open links like usual, unless point is at the end of a line. ;; and if at beginning of line, just press enter. ((or (and (eq 'link (car (org-element-context))) (not (eolp))) (bolp)) (org-return)) ;; It doesn't make sense to add headings in inline tasks. Thanks Anders ;; Johansson! ((org-inlinetask-in-task-p) (org-return)) ;; checkboxes too ((org-at-item-checkbox-p) (org-insert-todo-heading nil)) ;; lists end with two blank lines, so we need to make sure we are also not ;; at the beginning of a line to avoid a loop where a new entry gets ;; created with only one blank line. ((org-in-item-p) (if (save-excursion (beginning-of-line) (org-element-property :contents-begin (org-element-context))) (org-insert-heading) (beginning-of-line) (delete-region (line-beginning-position) (line-end-position)) (org-return))) ;; org-heading ((org-at-heading-p) (if (not (string= "" (org-element-property :title (org-element-context)))) (progn (org-end-of-meta-data) (org-insert-heading-respect-content) (outline-show-entry)) (beginning-of-line) (setf (buffer-substring (line-beginning-position) (line-end-position)) ""))) ;; tables ((org-at-table-p) (if (-any? (lambda (x) (not (string= "" x))) (nth (- (org-table-current-dline) 1) (org-table-to-lisp))) (org-return) ;; empty row (beginning-of-line) (setf (buffer-substring (line-beginning-position) (line-end-position)) "") (org-return))) ;; fall-through case (t (org-return))))) (define-key org-mode-map (kbd "RET") 'scimax/org-return)
Here are a few tests:
- numbered item
- second item
- nested number
- second number
- unordered 1
- unordered 2
- nested
- nested 2
- nested with link: http://emacs.stackexchange.com
[ ]
check 1[ ]
check 2[ ]
check 3
With some content
1 a subheading
2 another Subheading
Copyright (C) 2017 by John Kitchin. See the License for information about copying.
Org-mode version = 9.0.5