diff options
author | Eric Schulte <schulte.eric@gmail.com> | 2009-11-19 15:47:49 -0700 |
---|---|---|
committer | Eric Schulte <schulte.eric@gmail.com> | 2009-11-20 10:43:14 -0700 |
commit | 222f5c23e8ee61b1005484354d7a8b4a97d74275 (patch) | |
tree | b7b1b1e3980eb1356e65209216434d6d8e67bb45 | |
parent | 45cce0240235e5c524c5ce49f07bf94aae3bed18 (diff) | |
download | org-mode-222f5c23e8ee61b1005484354d7a8b4a97d74275.tar.gz |
org-babel: results are now foldable
pressing tab while on the front of a results line will fold the
results in the same manner as tabbing on the front of a block will
fold the block. To automatically hide all blocks when entering a
new file add the `org-babel-result-hide-all' function to your
`org-mode-hook'
-rw-r--r-- | contrib/babel/lisp/org-babel.el | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/contrib/babel/lisp/org-babel.el b/contrib/babel/lisp/org-babel.el index 3548bc0..88b6b01 100644 --- a/contrib/babel/lisp/org-babel.el +++ b/contrib/babel/lisp/org-babel.el @@ -399,6 +399,82 @@ with C-c C-c." (when hash (kill-new hash) (message hash)))) (add-hook 'org-ctrl-c-ctrl-c-hook 'org-babel-hash-at-point) +(defun org-babel-result-hide-spec () + (org-add-to-invisibility-spec '(org-babel-hide-result . t))) +(add-hook 'org-mode-hook 'org-babel-result-hide-spec) + +(defvar org-babel-hide-result-overlays nil + "Overlays hiding results.") + +(defun org-babel-result-hide-all () + "Fold all results in the current buffer." + (interactive) + (org-babel-show-result-all) + (save-excursion + (while (re-search-forward org-babel-result-regexp nil t) + (save-excursion (goto-char (match-beginning 0)) + (org-babel-hide-result-toggle-maybe))))) + +(defun org-babel-show-result-all () + "Unfold all results in the current buffer." + (mapc 'org-delete-overlay org-babel-hide-result-overlays) + (setq org-babel-hide-result-overlays nil)) + +(defun org-babel-hide-result-toggle-maybe () + "Toggle visibility of result at point." + (interactive) + (let ((case-fold-search t)) + (if (save-excursion + (beginning-of-line 1) + (looking-at org-babel-result-regexp)) + (progn (org-babel-hide-result-toggle) + t) ;; to signal that we took action + nil))) ;; to signal that we did not + +(defun org-babel-hide-result-toggle (&optional force) + "Toggle the visibility of the current result." + (interactive) + (save-excursion + (beginning-of-line) + (if (re-search-forward org-babel-result-regexp nil t) + (let ((start (progn (beginning-of-line 2) (- (point) 1))) + (end (progn (goto-char (- (org-babel-result-end) 1)) (point))) + ov) + (if (memq t (mapcar (lambda (overlay) + (eq (org-overlay-get overlay 'invisible) + 'org-babel-hide-result)) + (org-overlays-at start))) + (if (or (not force) (eq force 'off)) + (mapc (lambda (ov) + (when (member ov org-babel-hide-result-overlays) + (setq org-babel-hide-result-overlays + (delq ov org-babel-hide-result-overlays))) + (when (eq (org-overlay-get ov 'invisible) + 'org-babel-hide-result) + (org-delete-overlay ov))) + (org-overlays-at start))) + (setq ov (org-make-overlay start end)) + (org-overlay-put ov 'invisible 'org-babel-hide-result) + ;; make the block accessible to isearch + (org-overlay-put + ov 'isearch-open-invisible + (lambda (ov) + (when (member ov org-babel-hide-result-overlays) + (setq org-babel-hide-result-overlays + (delq ov org-babel-hide-result-overlays))) + (when (eq (org-overlay-get ov 'invisible) + 'org-babel-hide-result) + (org-delete-overlay ov)))) + (push ov org-babel-hide-result-overlays))) + (error "Not looking at a result line")))) + +;; org-tab-after-check-for-cycling-hook +(add-hook 'org-tab-first-hook 'org-babel-hide-result-toggle-maybe) +;; Remove overlays when changing major mode +(add-hook 'org-mode-hook + (lambda () (org-add-hook 'change-major-mode-hook + 'org-babel-show-result-all 'append 'local))) + (defmacro org-babel-map-source-blocks (file &rest body) "Evaluate BODY forms on each source-block in FILE." (declare (indent 1)) |