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))
もっとエレガントは方法あるぜとご存じな人は教えてください。