5
4

More than 3 years have passed since last update.

org-modeでスクリーンショットをペーストする方法(Win10/Mac両対応)の完成形

Posted at

をまとめました。
markdownで疲弊しているみなさまこんにちは。論文執筆もプレゼンテーションもタスク管理も時間計測もできるorg-modeを使ったほうがよいですね。しらんけどおれはorg-mode使うので。
org-modeのよいところはmarkdownは文書をつくることしかできないのにたいしてorg-modeは思考をすすめることができる点がよい。プレビューみながらmarkdownとかで本当に思考できますかね。見た目確認しながら作業してない?しらんけど。

私は~/orgにorgファイルをもっていて、orgを適宜テーマごとにディレクトリ切ってバリバリかいてます。で、インラインのイメージどうするの問題。win/macで絶対パス違うので相対パスにしないと無理。

よくあるやつはルートからのパス打ち込んでるだけなのでwin-macで相互運用できない。
わたしはGoogleDriveにorgおいてシンボリックリンク/ジャーナルリンク?して~/orgにorgファイルがあるところまでは設定してる

画像は~/org/imgに物理的に貯まる

で、冒頭のstackoverflowの色んな人の意見を悪魔合体しました。久々のelisp
うごいているから良いと思う!

(defun get-basename-from-fullpath (fullpath)
  "フルパスから最後のスラッシュまで削除した部分を返します。"
  (let ((parts (split-string fullpath "/")))
    (car (last parts))))

(defun my-org-screenshot-win ()
  "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 (expand-file-name "~/org/img/")
                (get-basename-from-fullpath
                 (concat
                  (make-temp-name
                   (concat (buffer-file-name)
                           "_"
                           (format-time-string "%Y%m%d_%H%M%S_")) ) ".png"))))
  (shell-command "snippingtool /clip")
  (shell-command (concat "powershell -command \"Add-Type -AssemblyName System.Windows.Forms;if ($([System.Windows.Forms.Clipboard]::ContainsImage())) {$image = [System.Windows.Forms.Clipboard]::GetImage();[System.Drawing.Bitmap]$image.Save('" filename "',[System.Drawing.Imaging.ImageFormat]::Png); Write-Output 'clipboard content saved as file'} else {Write-Output 'clipboard does not contain image data'}\""))
  (setq pastepath
        (concat "~/org/img/" (get-basename-from-fullpath filename)))
  (insert (concat "[[" pastepath "]]"))
  (org-display-inline-images))

(defun my-org-screenshot-darwin ()
  "Save a clipboard's screenshot into a time stamped unique-named file
   in a specified directory and insert a link to this file."
  (interactive)
  (setq filename
        (concat
         (make-temp-name
          (concat (buffer-name)
                  "_"
                  (format-time-string "%Y%m%d_%H%M%S_")) ) ".png"))
  (call-process "pngpaste" nil nil nil (concat (expand-file-name "~/org/img/") filename))
  (setq pastepath
        (concat "~/org/img/" filename))
  (insert (concat "[[" pastepath "]]"))
  (org-display-inline-images))

(defun my-org-screenshot ()
  (interactive)
  (if (eq system-type 'darwin)
      (my-org-screenshot-darwin)
    (my-org-screenshot-win)
    )
  )

(global-set-key (kbd "C-^") 'my-org-screenshot)

リファクタの余地は大いにあると思うので適当にいじってみてください。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4