usar como comandos emacs screenshot org-mode

como - Pegue una imagen en el portapapeles en el archivo del modo Org de Emacs sin guardarlo



comandos emacs terminal (7)

Como estoy utilizando el modo Org de Emacs como registro de investigación, en algún momento quiero hacer un seguimiento de algo a través de imágenes de captura de pantalla, y definitivamente no quiero guardarlos. Así que me pregunto si hay alguna forma de insertar esas figuras en mi archivo de modo org, como con la palabra que las resuelve desde el portapapeles.


La funcionalidad exacta que desea no está actualmente implementada, pero sería escéptico de guardar muchas imágenes en un registro de investigación si su opinión es que "definitivamente no desea guardarlas".

De todos modos, la funcionalidad que desea ha sido expresada en la lista de correo org-mode un par de veces en los últimos años - verifique

http://comments.gmane.org/gmane.emacs.orgmode/33770

http://www.mail-archive.com/[email protected]/msg50862.html

El primer enlace incluye un código para iniciar una utilidad de captura de pantalla (a través de ImageMagick) para guardar el archivo de manera única e insertar un enlace en línea en el búfer de modo orgánico.

Como se indica en ese hilo, el código se mejoró y se agregó a la página de hacks de modo orgánico, que tiene muchas gemas útiles:

http://orgmode.org/worg/org-hacks.html

(defun my-org-screenshot () "Take a screenshot into a time stamped unique-named file in the same directory as the org-buffer and insert a link to this file." (interactive) (setq filename (concat (make-temp-name (concat (buffer-file-name) "_" (format-time-string "%Y%m%d_%H%M%S_")) ) ".png")) (call-process "import" nil nil nil filename) (insert (concat "[[" filename "]]")) (org-display-inline-images))


(Si es de uso), utilicé el código de @assem (gracias v.much btw) y creé una versión que en su lugar crea una subcarpeta (si no existe) como: $ {filename} IMG / Then pone una imagen como img_date.png en esa carpeta y luego inserta una ruta relativa en el búfer como:
[[ ./${filename}IMG/img_2015...png ]]

Aquí está el código:

(defun my-org-screenshot () "Take a screenshot into a time stamped unique-named file in the sub-directory (%filenameIMG) as the org-buffer and insert a link to this file." (interactive) (setq foldername (concat (buffer-file-name) "IMG/")) (if (not (file-exists-p foldername)) (mkdir foldername)) (setq imgName (concat "img_" (format-time-string "%Y_%m_%d__%H_%M_%S") ".png")) (setq imgPath (concat (buffer-file-name) "IMG/" imgName)) (call-process "import" nil nil nil imgPath) (setq relativeFilename (concat "./" (buffer-name) "IMG/" imgName)) (insert (concat "[[" relativeFilename "]]")) (org-display-inline-images) )

[Editar 2015.04.09]

Mientras tanto, descubrí que lo anterior no funciona bien. Técnicamente funciona, pero genera una gran cantidad de nombres de carpetas que coinciden con los nombres de los archivos, por lo que es tedioso seleccionar archivos, ya que hay una carpeta que tiene un nombre similar.

En su lugar, me conformé con una solución en la que mantengo todos mis archivos org en la misma carpeta y tengo una subcarpeta ''img'' con todas mis imágenes.

Uso un código como este para capturar imágenes:

(defun my/img-maker () "Make folder if not exist, define image name based on time/date" (setq myvar/img-folder-path (concat default-directory "img/")) ; Make img folder if it doesn''t exist. (if (not (file-exists-p myvar/img-folder-path)) ;[ ] refactor thir and screenshot code. (mkdir myvar/img-folder-path)) (setq myvar/img-name (concat "img_" (format-time-string "%Y_%m_%d__%H_%M_%S") ".png")) (setq myvar/img-Abs-Path (concat myvar/img-folder-path myvar/img-name)) ;Relative to workspace. (setq myvar/relative-filename (concat "./img/" myvar/img-name)) (insert "[[" myvar/relative-filename "]]" "/n") ) (defun my/org-screenshot () "Take a screenshot into a time stamped unique-named file in the sub-directory (%filenameIMG) as the org-buffer and insert a link to this file." (interactive) (my/img-maker) ;(make-frame-invisible) (lower-frame) (call-process "import" nil nil nil myvar/img-Abs-Path) (raise-frame) ;(make-frame-visible) (org-display-inline-images) )

y un pequeño script bash en mi carpeta org / img para archivar imágenes sin referencia:

#!/bin/sh cd ~/git/LeoUfimtsev.github.io/org/img/ mkdir ~/git/LeoUfimtsev.github.io/org/img/archive FILES=~/git/LeoUfimtsev.github.io/org/img/*.png for f in $FILES do var_grep_out=$(grep --directories=skip $(basename $f) ../*) if [ -z "$var_grep_out" ]; then echo "Archiving: $f" mv $f archive/ fi done


Mi solución es para la plataforma de Windows. Muchas gracias a Assem por darme su solución en la que basé la mía.

Escribí una aplicación de consola C # CbImage2File que escribe la imagen en el portapapeles (si hay una) en una ruta dada como argumento de línea de comando. Necesitará una referencia al ensamblado System.Windows.Forms .

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CbImage2File { class Program { private static int FAILURE = 1; private static void Failure(string description) { Console.Error.WriteLine("Clipboard does not contain image data"); Environment.Exit(FAILURE); } [STAThread] static void Main(string[] args) { var image = System.Windows.Forms.Clipboard.GetImage(); if (image == null) { Failure("Clipboard does not contain image data"); } if (args.Length == 0) { Failure("You have not specified an output path for the image"); } if (args.Length > 1) { Failure("You must only specify a file path (1 argument)"); } var filePath = args[0]; var folderInfo = new System.IO.FileInfo(filePath).Directory; if (!folderInfo.Exists) { System.IO.Directory.CreateDirectory(folderInfo.FullName); } image.Save(filePath); } } }

Uso Greenshot para tomar la captura de pantalla, que (a través de su configuración) copia automáticamente la captura de pantalla en el portapapeles.

A continuación, utilizo un acceso directo CSv para pegar la imagen en el búfer de modo org con la función org-insert-image-from-clipboard :

(defun org-insert-image-from-clipboard () (interactive) (let* ((the-dir (file-name-directory buffer-file-name)) (attachments-dir (concat the-dir "attachments")) (png-file-name (format-time-string "%a%d%b%Y_%H%M%S.png")) (png-path (concat attachments-dir "/" png-file-name)) (temp-buffer-name "CbImage2File-buffer")) (call-process "C:/_code/CbImage2File/CbImage2File/bin/Debug/CbImage2File.exe" nil temp-buffer-name nil png-path) (let ((result (with-current-buffer temp-buffer-name (buffer-string)))) (progn (kill-buffer temp-buffer-name) (if (string= result "") (progn (insert (concat "[[./attachments/" png-file-name "]]")) (org-display-inline-images)) (insert result)))))) (define-key org-mode-map (kbd "C-S-v") ''org-insert-image-from-clipboard)

Esta función resolverá una ruta de archivo, luego invocará la aplicación C # para crear el archivo png , luego agregará la etiqueta de la imagen y luego llamará a org-display-inline-images para mostrar la imagen. Si no hay imagen en el portapapeles, pegará en la respuesta de la aplicación C #.



Me gustan las imágenes y otro material que pertenece junto con un archivo org para ubicarlo en un directorio claramente asociado. Estoy usando el mecanismo de vinculación de organizaciones para esto y escribí hace unos años un paquete org-attachment-screenshot que también está disponible en MELPA. Permite proporcionar una función para definir el nombre del directorio (por ejemplo, nombre del documento + algún postfijo) para los archivos adjuntos, y también admite las funcionalidades de conexión estándar, por ejemplo, si desea definir archivos adjuntos basados ​​en entradas y heredar dentro de las entradas. También proporciona una variable personalizable para que se ejecute el comando de instantánea. Por favor échale un vistazo.


Para usuarios de OS X. Lo siguiente complementa la respuesta de Assem.

El comando de import no funcionaba para mí, así que lo screencapture a screencapture de screencapture con un argumento -i . También me parece más conveniente utilizar una ruta relativa para el enlace en lugar de la absoluta.

(defun my-org-screenshot () "Take a screenshot into a time stamped unique-named file in the same directory as the org-buffer and insert a link to this file." (interactive) (setq filename (concat (make-temp-name (concat (file-name-nondirectory (buffer-file-name)) "_" (format-time-string "%Y%m%d_%H%M%S_")) ) ".png")) (call-process "screencapture" nil nil nil "-i" filename) (insert (concat "[[./" filename "]]")) (org-display-inline-images))

Actualización: Mejoras

Recientemente, he mejorado un poco el guión. Ahora coloca capturas de pantalla en un subdirectorio, crea el directorio si es necesario y solo inserta el enlace en emacs si la imagen fue realmente creada (es decir, no hace nada si presionas ESC). También funciona en Ubuntu y OS X.

(defun my-org-screenshot () "Take a screenshot into a time stamped unique-named file in the same directory as the org-buffer and insert a link to this file." (interactive) (org-display-inline-images) (setq filename (concat (make-temp-name (concat (file-name-nondirectory (buffer-file-name)) "_imgs/" (format-time-string "%Y%m%d_%H%M%S_")) ) ".png")) (unless (file-exists-p (file-name-directory filename)) (make-directory (file-name-directory filename))) ; take screenshot (if (eq system-type ''darwin) (call-process "screencapture" nil nil nil "-i" filename)) (if (eq system-type ''gnu/linux) (call-process "import" nil nil nil filename)) ; insert into file if correctly taken (if (file-exists-p filename) (insert (concat "[[file:" filename "]]"))))


Las respuestas aquí se enfocan en iniciar el proceso dentro de emacs. Una alternativa, en macos, es colocar una imagen de captura de pantalla en el portapapeles del sistema usando cmd-ctl-shift-4, y luego volver a Emacs y usar emacs lisp para llamar a pngpaste para escribir la imagen desde el portapapeles al archivo, y hacer lo que sea lo necesita con el archivo de imagen (insertar en org, LaTeX, o como una imagen en línea nativa de Emacs, etc.).

Por ejemplo, para insertar en org:

(defun org-insert-clipboard-image (&optional file) (interactive "F") (shell-command (concat "pngpaste " file)) (insert (concat "[[" file "]]")) (org-display-inline-images))