【Org-mode】クリップボードの画像をお手軽にインライン表示する #Emacs

Org-mode は Emacs のメジャーモードの 1つです。

強力なアウトライナーで、タスク管理や、表計算も可能です。 各種形式(html, md, pdf, …) へのエクスポート、文芸的プログラミングなども … 一言でいうと 何でもできるツール です。

今回は クリップボード保存した画像を Org文書に貼り付け + インライン表示する 機能を実装してみます。

▲スクショを取って、さくっと Org文書に貼り付け表示

目次

  1. 実行環境
  2. 背景
  3. 手順
    1. pngpaste のインストール
    2. init.el 追記 (関数)
    3. init.el 追記 (キーバインド)
  4. おわりに

実行環境

  • OS: macOS Mojave
  • Emacs: version 26.2
  • Org-mode: version 9.1.9

背景

本題に入る前に少し語ります。

普段私は 案件推進を Org-mode で行っています(もちろんブログ執筆も) 。 Org-modeの強力なアウトライン機能で、案件の全ての情報を 1buffer/1画面 に収めることができます。

  • 構成図
  • パラメータシート
  • 構築作業の手順書
  • Backlogなど 各プロジェクト/課題へのリンク
  • 他 参考ドキュメントへのリンク

…などを 1buffer に集約します。

▲ 100行以上の情報を集約。とても捗る

さて、上の構成図にあるとおり、 Org-mode は 画像のインライン表示 が可能です。

インライン表示の方法 (スクリーンショットの場合) は下記の通り。

  1. スクリーンショットを取って保存する: sample.png
  2. 画像のフルパスを知る: /Users/SAMPLE/sample.png
  3. Org-文書内に 角括弧 × 2 でフルパスを囲う: [[/Users/SAMPLE/sample.png]]
  4. コマンドを実行する: org-toggle-inline-images(C-c C-x C-v) もしくは org-display-inline-images
  5. 画像表示!

しかしこの手順、 面倒くさい です。

macOSのコマンド( command + shift + crtl + 4 ) や他 Monosnap といったツールは スクリーンショットをクリップボードに保存できます。 Slack やTwitterなどの投稿欄でそれをペーストすると画像投稿できます。これ、便利ですよね。

Org-modeでこれを実現したい!、というのがモチベーションです。

  1. スクリーンショットを取る
  2. コマンド実行する: xxx
  3. 画像表示!

手順

調べるとすでに同じような内容の実装が出てきます。

UNIXの import コマンドを使ってスクリーンショットを取得、 その後 org-buffer と同じディレクトリに自動生成された名前で画像を保存し、インライン表示処理を行う … といった内容です。

この情報をベースにして、macOS版実装 + 微修正 を行っていきます。

pngpaste のインストール

pngpaste という便利なツールがあったので、これを import コマンドの代替として使います。 クリップボードに画像が保存されている状態で pngpaste hoge.png といった感じで画像保存できます。

Homebrew でインストールします。

brew install pngpaste

init.el 追記 (関数)

関数を書きます。 8行目の文字列には 画像を保存したいディレクトリパスを指定します。

(defun my-org-screenshot ()
  "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 "/Users/kawahara.masahiro/org/img/"
                  (buffer-name)
                  "_"
                  (format-time-string "%Y%m%d_%H%M%S_")) ) ".png"))
  (call-process "pngpaste" nil nil nil filename)
  (insert (concat "[[" filename "]]"))
  (org-display-inline-images))

init.el 追記 (キーバインド)

関数 my-org-screenshot のキーバインド設定を書きます。 各々 好きなキーバインドにしましょう。

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

おわりに

  1. スクリーンショットを取得 (クリップボードにコピー)
  2. 貼り付けたい場所で関数実行
  3. 画像表示!

ができるようになりました。

▲再掲

画像は指定したディレクトリにどんどん溜まっていきます。適宜整理整頓しましょう。

快適な Org-mode 生活を!