オンライン勉強会が増えてきた
コロナ禍でオンラインでの勉強会が増えてきました。
現在の職場が全面的にリモートワークに移行したこともあり、平日の定時後でも勉強会に参加しやすくなってきました。
登壇資料の画像を貼り付けたい
愛用のサクラエディタで勉強会のメモをとっているのですが、登壇資料などのスクリーンショットを保存するときにいつも手間取っていました。
- ペイントをいちいち開いて画像保存するか?
- Excelか何かを開いておいて、そこを画像置き場にするか?
- そもそも画像を貼り付けたいなら別のツールでメモを取る方がいいのでは?
など、試行錯誤していたのですがばっちりハマる解決策がなかなか見つからず。。。
VSCodeに乗り換えるか?
VSCodeの拡張の拡張機能として、編集中のMarkdownに画像(のリンク)を貼り付けられる「Paste Image」というものがあります。
Markdownビューアーもあるし、そろそろ本格的にVSCodeに乗り換えるべきかとも思いましたが、Paste Imageの基本機能は、
- Image will be saved in the folder that contains current editing file
- The relative path will be paste to current editing file
とのことで、これだったらサクラエディタのマクロとかプラグインでどうにかなるのでは、と思い探し始めました。
マクロで作ってみた
結局探しても見つからなかったので自分で作ります。
サクラエディタのマクロではVBScriptが使えるので、クリップボードや画像ファイルの操作は普通にできるだろうと思っていたのですが、クリップボードから画像を直接読み出す方法がないんですね。
結局、VBScriptからPowerShellを呼び出して無理くり処理する方法を採用することにしました。
Dim exec_script
Dim filename
filename = Replace(Replace(Replace(Now(), "/", ""), ":", ""), " ", "")
exec_script = "powershell.exe -sta -WindowStyle Hidden -Command Add-Type -Assembly System.Windows.Forms;" _
& " if (!([Windows.Forms.Clipboard]::ContainsImage())) {exit} ;" _
& " [System.Windows.Forms.Clipboard]::GetImage().Save('./" & filename & ".png');" _
& " Echo '![./" & filename & ".png](./" & filename & ".png)'"
Set exec = CreateObject("WScript.Shell").Exec(exec_script)
Editor.InsText(exec.StdOut.ReadAll)
[System.Windows.Forms.Clipboard]::GetImage()
で画像ファイルのオブジェクトが取れます。
CreateObject("WScript.Shell").Exec()
の引数にコマンド文字列を渡すとPowerShellで処理してくれます。
PowerShellを非表示にして実行するやり方がわからなかったので、実行するとPowerShellのウィンドウが開いてしまいますが、とりあえず目的は果たせたのでここまで。
※Exec()
の代わりにRun()
を使うなども見つけたのですが、Echo
の結果が取れなかったり、何かもうひと工夫が必要そうだったので断念しました。
上記のスクリプトをサクラエディタのマクロとして登録して実行すると、編集中のファイルに![./yyyyMMddhhss.png](./yyyyMMddhhss.png)
というリンクが挿入されます。
画像ファイルは同じフォルダに保存されます。
クリップボードに画像が格納されていない場合は何もしません。
GitHub
以下で公開しています。
ファイル名とか、保存先のフォルダとか、直した方がいいこともまだまだあるので、気が向いたら修正しようと思います。
投稿直前に気づいたけど、ファイル名の時刻部分がゼロ埋めできてないな。。。