Paste image from clipboard directly into org-mode document
Personally I really like using org-mode files for creating documentation and presentations.
When working with screenshots my normal workflows always has been.
- Capture screenshot to clipboard
- Save the screenshot to a relative
./images
folder and give it a descriptive name.
- Manually create link to the screenshot
This works ok but after a while you get the feel that the whole process can be automated.
The following function can help in automating the whole process.
- Capture screenshot
- In your org-document paste using C-M-y (or call
my/insert-clipboard-image
) and automatically add the screenshot to an =./images- directory and insert the link to the image.
;; Overview
;; --------
;; Inserts an image from the clipboard by prompting the user for a filename.
;; Default extension for the pasted filename is .png
;; A ./images directory will be created relative to the current Org-mode document to store the images.
;; The default name format of the pasted image is:
;; filename: <yyyymmdd>_<hhmmss>_-_<image-filename>.png
;; Important
;; --------
;; This function depends on 'pngpaste' to paste the clipboard image
;; -> $ brew install pngpaste
;; Basic Customization
;; -------------------
;; Include the current Org-mode header as part of the image name.
;; (setq my/insert-clipboard-image-use-headername t)
;; filename: <yyyymmdd>_<hhmmss>_-_<headername>_-_<image-filename>.png
;; Include the buffername as part of the image name.
;; (setq my/insert-clipboard-image-use-buffername t)
;; filename: <yyyymmdd>_<hhmmss>_-_<buffername>_-_<image-filename>.png
;; Full name format
;; filename: <yyyymmdd>_<hhmmss>_-_<buffername>_-_<headername>_-_<image-filename>.png
(defun my/insert-clipboard-image (filename)
"Inserts an image from the clipboard"
(interactive "sFilename to paste: ")
(let ((file
(concat
(file-name-directory buffer-file-name)
"images/"
(format-time-string "%Y%m%d_%H%M%S_-_")
(if (bound-and-true-p my/insert-clipboard-image-use-buffername)
(concat (s-replace "-" "_"
(downcase (file-name-sans-extension (buffer-name)))) "_-_")
"")
(if (bound-and-true-p my/insert-clipboard-image-use-headername)
(concat (s-replace " " "_" (downcase (nth 4 (org-heading-components)))) "_-_")
"")
filename ".png")))
;; create images directory
(unless (file-exists-p (file-name-directory file))
(make-directory (file-name-directory file)))
;; paste file from clipboard
(shell-command (concat "pngpaste " file))
(insert (concat "[[./images/" (file-name-nondirectory file) "]]"))))
(map! :desc "Insert clipboard image"
:n "C-M-y" 'my/insert-clipboard-image)
A nice setting in org-mode that also helps when viewing large screenshots is the following:
This display the taken screenshot in a acceptable format in your org-mode file.
(after! org
(setq org-image-actual-width (/ (display-pixel-width) 2)))