Is there an inverse of org-babel-tangle-jump-to-org
allowing one to jump from a source block to the corresponding place in the tangled file?
2 Answers
I am not aware of a function shipped with org that jumps to the tangled file.
Furthermore, there is no separate function that generates the file name(s) for the tangled file(s) in org-babel-tangle
. That makes the job a bit cumbersome.
The function org-babel-tangle-jump
calls org-babel-tangle
with write-region
temporarily modified such that it does not write the region contents to a file but just delivers the file name that is passed to it in a variable file
locally bound in org-babel-tangle-jump
. Finally, org-babel-tangle-jump
opens the file with that name if it already exists.
(defun org-babel-tangle-jump ()
"Jump to tangle file for the source block at point."
(interactive)
(let (file org-babel-pre-tangle-hook org-babel-post-tangle-hook)
(cl-letf (((symbol-function 'write-region) (lambda (start end filename &rest _ignore)
(setq file filename)))
((symbol-function 'delete-file) #'ignore))
(org-babel-tangle '(4)))
(when file
(setq file (expand-file-name file))
(if (file-readable-p file)
(find-file file)
(error "Cannot open tangle file %S" file)))))
Here is a solution if you use :comments link
in your code blocks header and if tangle multiple blocks into a single file. With cursor at code block it will jump to a point where this block was tangled using these comment links.
;; this is optional but might look better than defaults
(setq org-babel-tangle-comment-format-beg "-------->> [[%link][%source-name]]")
(setq org-babel-tangle-comment-format-end "--------<< %source-name ends here\n\n")
(defun sv-org-babel-tangle-jump-to-src ()
"The opposite of `org-babel-tangle-jump-to-org'. Jumps at tangled code from org src block."
(interactive)
(if (org-in-src-block-p)
(let* ((header (car (org-babel-tangle-single-block 1 'only-this-block)))
(tangle (car header))
(lang (caadr header))
(buffer (nth 2 (cadr header)))
(org-id (nth 3 (cadr header)))
(source-name (nth 4 (cadr header)))
(search-comment (org-fill-template
org-babel-tangle-comment-format-beg
`(("link" . ,org-id) ("source-name" . ,source-name))))
(file (expand-file-name
(org-babel-effective-tangled-filename buffer lang tangle))))
(if (not (file-exists-p file))
(message "File does not exist. 'org-babel-tangle' first to create file.")
(find-file file)
(beginning-of-buffer)
(search-forward search-comment)))
(message "Cannot jump to tangled file because point is not at org src block.")))