4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

EmacsでもPaste Imageしたい(クリップボードから画像を保存&Markdown or Orgに貼り付けしたい)

Last updated at Posted at 2023-07-28

VSCodeの拡張機能の中にPaste Imageがある。
Ctrl + Alt + vを入力するだけでクリップボードの画像を保存し、Markdown形式の記述を挿入してくれる。
Web会議が増えたのでスクショ+議事メモなMarkdownを書くのに非常に重宝している。

正直、VSCodeで十分なところではあるが、非常に便利なのでEmacsのOrg-modeでも使いたくなった。

MacOSの場合

この記事では、pngpasteを呼び出すことでクリップボードの画像を保存&文書への挿入を行っている。

Windowsの場合

Windowsには前述のpngpasteはない。pngpasteはないがPowershellはある。

この記事にクリップボードの画像をデスクトップに保存するPowershellスクリプトの記載があるのでこれをEmacsから呼び出せばよい。
とりあえず、保存場所はカレントディレクトリとし、ファイル名だけ引数にとればいっかと書き換えたスクリプトが以下。

Param ($FileName)

Add-Type -AssemblyName System.Windows.Forms

If ([Windows.Forms.Clipboard]::ContainsImage() -eq $True) {
  $Image = [Windows.Forms.Clipboard]::GetImage()
  $FilePath = "."
  $ImagePath = Join-Path $FilePath $FileName
  $Image.Save($ImagePath, [System.Drawing.Imaging.ImageFormat]::Png)
}

これをemacsから実行すれば良いので、.elへの記述は以下。ほぼMacOSの記事のパクリ。
スクリプトの置き場は$Env:HOME/.emacs.d/windows/paste_image.ps1としている。
// $Env:HOMEの中に半角スペースが入っていたのが今回一番のはまりポイント

;; paste image for Org mode
(with-eval-after-load "Org"
  (defun org-insert-clipboard-image ()
    "Generate png file from a clipboard image and insert a link to current buffer."
    (interactive)
    (let* ((filename (concat "./" (format-time-string "%Y-%m-%d-%H-%M-%S") ".png")))
      (message "Create File %s..." filename)
      (call-process "powershell" nil nil nil "powershell -ExecutionPolicy RemoteSigned -File \"$Env:HOME/.emacs.d/windows/paste_image.ps1\" -FileName " filename)
      (if (file-exists-p filename)
          (insert (concat "[[file:" filename "]]")))
      (org-display-inline-images)))
  (define-key org-mode-map (kbd "C-M-y") 'org-insert-clipboard-image))

markdown-modeでも使いたい場合は以下。

;; paste image for markdown mode
(with-eval-after-load "markdown-mode"
  (defun markdown-insert-clipboard-image ()
    "Generate png file from a clipboard image and insert a link to current buffer."
    (interactive)
    (let* ((filename (concat "./" (format-time-string "%Y-%m-%d-%H-%M-%S") ".png")))
      (message "Create File %s..." filename)
      (call-process "powershell" nil nil nil "powershell -ExecutionPolicy RemoteSigned -File \"$Env:HOME/.emacs.d/windows/paste_image.ps1\" -FileName " filename)
      (if (file-exists-p filename)
          (insert (concat "![](" filename ")")))
      ))
  (define-key markdown-mode-map (kbd "C-M-y") 'markdown-insert-clipboard-image))

もっとエレガントは方法あるぜとご存じな人は教えてください。

Reference

4
1
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
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?