* Bug: [Feature request] generate source blocks from filename [9.0.8 (9.0.8-elpaplus @ /Users/andreagiugliano/.emacs.d/elpa/org-plus-contrib-20170606/)]
@ 2017-06-19 18:44 Andrea
0 siblings, 0 replies; only message in thread
From: Andrea @ 2017-06-19 18:44 UTC (permalink / raw)
To: emacs-orgmode
Hello everyone,
Thanks immensely for your effort in developing/maintaining org mode. I
learned to use it during my Ph.D. and now that I am working is even more
useful (and fun :).
I like literate programming, and I find really useful to work by using
source blocks (as I can swap between org mode bindings and the code mode
bindings with the easy C-c ').
So to simplify my source imports I developed this simple function in
elisp:
#+BEGIN_SRC elisp
;; in this function there is a map from file extensions to org babel identifiers
(defun org-src-from-filename (filepath)
"Convert filename at point to org src block."
(interactive)
(let* (
(ext2babelIds '(("clj" . "clojure")
("dot" . "dot")
;(gnuplot . t)
;(calc . t)
("hs" . "haskell")
("java" . "java")
("ml" . "ocaml")
("org" . "org")
;(plantuml . t)
("py" . "python")
("rb" . "ruby")
("scala" . "scala")
("sbt" . "scala")
("sh" . "sh")
("txt" . "text")
("html" . "html")
("xml" . "html")
("xhtml" . "xhtml")
("tex" . "latex")
("el" . "emacs-lisp")
("json" . "javascript")
("js" . "javascript")
("css" . "css")
("sql" . "sql")
("" . "text")
))
(bounds (bounds-of-thing-at-point 'filename))
(contents (with-temp-buffer
(insert-file-contents filepath)
(buffer-string)))
(extension (file-name-extension filepath))
(babel-id (cdr (assoc extension ext2babelIds)))
(org-contents (concat "#+BEGIN_SRC " (if babel-id babel-id extension) " :tangle " filepath "\n" contents "#+END_SRC"))
)
(save-excursion (when (and bounds filepath)
(delete-region (car bounds) (cdr bounds))
(insert org-contents)))))
#+END_SRC
It basically, given a filename, generates a source block with the
correct extension and the tangle path.
The cool thing is that I can use it to substitute a path at point:
#+BEGIN_SRC emacs-lisp :tangle yes
(defun org-src-from-filename-at-point ()
(interactive)
(org-src-from-filename (thing-at-point 'filename)))
(bind-key "C-c s" 'org-src-from-filename-at-point)
#+END_SRC
And even integrate it with helm, by using the kill-ring list:
#+BEGIN_SRC emacs-lisp :tangle yes
(defun org-src-from-helm-kill-ring ()
(interactive)
(helm-show-kill-ring)
(org-src-from-filename-at-point))
(bind-key "C-c y" 'org-src-from-helm-kill-ring)
#+END_SRC
Which becomes so cool having a function that adds the current buffer
filename to the kill-ring:
#+BEGIN_SRC emacs-lisp :tangle yes
(defun copy-buffer-filename ()
(interactive)
(let ((path (buffer-file-name)))
(when path (kill-new path)))
)
(global-set-key (kbd "C-c b") 'copy-buffer-filename)
#+END_SRC
Do you think it would make sense to add such a functionality to
org-mode? Or maybe it is already there and I missed it?
However, just thanks for your amazing work!
Best regards,
Andrea
Emacs : GNU Emacs 25.1.2 (x86_64-apple-darwin16.0.0, Carbon Version 157 AppKit 1504)
of 2017-04-04
Package: Org mode version 9.0.8 (9.0.8-elpaplus @ /Users/andreagiugliano/.emacs.d/elpa/org-plus-contrib-20170606/)
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2017-06-19 18:44 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-06-19 18:44 Bug: [Feature request] generate source blocks from filename [9.0.8 (9.0.8-elpaplus @ /Users/andreagiugliano/.emacs.d/elpa/org-plus-contrib-20170606/)] Andrea
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).