Emacs org-modeをマインドマップ風に使う

tok@org-mode駆け出しです。こんばんは。

今回はEmacsをマインドマップ風に使うために工夫したことを投稿します。
あくまでも~風ですので「こんなのマインドマップじゃない!」というお叱りもあると思いますが、
こういうのもあるということでご容赦ください。

Emacsの画面

こんな人向け

  • なんでもEmacsでやりたい
  • キーボード操作のみで完結したい
  • ターミナルモードでも使いたい
  • 他人のサーバに情報を置きたくない

調べたこと

  • Emacsでノードをセンターにおいて、というマインドマップっぽいのはGUI版じゃないと難しい。emacs-eaf/eaf-mindmap
  • Emacsから離れて、JavaScriptで動くものも探したけどライセンスの問題だったり、UIがイマイチ。mindmaps/jsMind
  • クラウドのサービス、MindMeisterはあるけど基本有償だし、データの取扱が心配。

必要な操作

  • 子ノードを作る
  • 兄弟ノードを作る
  • 任意のノードに移動する
    • 一番上のノードに移動
    • 親ノードに移動
    • 子ノードに移動
    • 兄弟ノードに移動
  •   <li>
        ノードを子ごと他のノードへ移動する
      </li>
    </ul>
    

デフォルトのorg-mode操作抜粋

    <th class="org-left" scope="col">
      キーバインド
    </th>
    
    <th class="org-left" scope="col">
      org-mode関数名
    </th>
    
    <th class="org-left" scope="col">
      speed
    </th>
  </tr>
  
  <tr>
    <td class="org-left">
      見出しを作る
    </td>
    
    <td class="org-left">
      M-RET,ESC <return>,C-c C-x m
    </td>
    
    <td class="org-left">
      org-meta-return -> org-insert-heading
    </td>
    
    <td class="org-left">
      &nbsp;
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      &nbsp;
    </td>
    
    <td class="org-left">
      C-c RET
    </td>
    
    <td class="org-left">
      org-ctrl-c-ret -> org-insert-heading
    </td>
    
    <td class="org-left">
      &nbsp;
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      同じレベルの前の見出しに移動
    </td>
    
    <td class="org-left">
      C-c C-b
    </td>
    
    <td class="org-left">
      org-backward-heading-same-level
    </td>
    
    <td class="org-left">
      b
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      同じレベルの後ろの見出しに移動
    </td>
    
    <td class="org-left">
      C-c C-f
    </td>
    
    <td class="org-left">
      org-forward-heading-same-level
    </td>
    
    <td class="org-left">
      f
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      レベル関係無し 次の見出しに移動
    </td>
    
    <td class="org-left">
      C-c C-n
    </td>
    
    <td class="org-left">
      outline-next-visible-heading
    </td>
    
    <td class="org-left">
      n
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      レベル関係無し 前の見出しに移動
    </td>
    
    <td class="org-left">
      C-c C-p
    </td>
    
    <td class="org-left">
      outline-previous-visible-heading
    </td>
    
    <td class="org-left">
      p
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      上のレベルの見出しに移動
    </td>
    
    <td class="org-left">
      C-c C-u
    </td>
    
    <td class="org-left">
      outline-up-heading
    </td>
    
    <td class="org-left">
      u
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      <階層変更>
    </td>
    
    <td class="org-left">
      &nbsp;
    </td>
    
    <td class="org-left">
      &nbsp;
    </td>
    
    <td class="org-left">
      &nbsp;
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      レベルを上げる
    </td>
    
    <td class="org-left">
      <M-left>
    </td>
    
    <td class="org-left">
      org-metaleft
    </td>
    
    <td class="org-left">
      l
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      レベルを下げる
    </td>
    
    <td class="org-left">
      <M-right>
    </td>
    
    <td class="org-left">
      org-metaright
    </td>
    
    <td class="org-left">
      r
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      子ごと上げる
    </td>
    
    <td class="org-left">
      <M-S-left>
    </td>
    
    <td class="org-left">
      org-shiftmetaleft
    </td>
    
    <td class="org-left">
      L
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      子ごと下げる
    </td>
    
    <td class="org-left">
      <M-S-right>
    </td>
    
    <td class="org-left">
      org-shiftmetaright
    </td>
    
    <td class="org-left">
      R
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      <移動>
    </td>
    
    <td class="org-left">
      &nbsp;
    </td>
    
    <td class="org-left">
      &nbsp;
    </td>
    
    <td class="org-left">
      &nbsp;
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      子ごと下に移動
    </td>
    
    <td class="org-left">
      <M-down>
    </td>
    
    <td class="org-left">
      org-metadown
    </td>
    
    <td class="org-left">
      D
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      子ごと上に移動
    </td>
    
    <td class="org-left">
      <M-up>
    </td>
    
    <td class="org-left">
      org-metaup
    </td>
    
    <td class="org-left">
      U
    </td>
  </tr>
</table>

<p>
  (speed は speed command有効時。カーソルが見出しの*部分にあるときだけ有効。IME有効だと機能しない。)
</p>

speed commandsを有効にする方法

  • とりあえず試してみるなら
<pre> M-x customize-set-value<br />  org-use-speed-commands<br />  At beginning of headline stars</pre>
  • 恒久的に使うなら
    設定ファイルに以下追記
;;org-mode
(setq org-use-speed-commands t)

必要な操作

操作
    <th class="org-left" scope="col">
      キー操作
    </th>
  </tr>
  
  <tr>
    <td class="org-left">
      子ノードを作る
    </td>
    
    <td class="org-left">
      C-ck(マクロを登録して利用)
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      兄弟ノードを作る
    </td>
    
    <td class="org-left">
      C-c RET
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      任意のノードに移動する
    </td>
    
    <td class="org-left">
      C-sで検索 or 下の移動系
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      一番上のノードに移動
    </td>
    
    <td class="org-left">
      C-c C-u or u を繰り返し
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      親ノードに移動
    </td>
    
    <td class="org-left">
      C-c C-u or u
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      子ノードに移動
    </td>
    
    <td class="org-left">
      n
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      兄弟ノードに移動
    </td>
    
    <td class="org-left">
      f or b
    </td>
  </tr>
  
  <tr>
    <td class="org-left">
      ノードを子ごと他のノードへ移動する
    </td>
    
    <td class="org-left">
      U or D or 範囲選択してカトペ
    </td>
  </tr>
</table>

<p>
  子ノード作る用のマクロ。設定ファイルに追加。<br />やってることは<br /> C-e (文末に移動)、<br /> M-RET(見出し追加)、<br /> TAB (見出しを1レベル下げる)。
</p>
(fset 'org-insert-heading-children
(lambda (&optional arg) "Keyboard macro." (interactive "p") (kmacro-exec-ring-item (quote ("^E^[^M " 0 "%d")) arg)))
(global-set-key "\C-ck" 'org-insert-heading-children)

多くの情報を一画面に

マインドマップでは用紙(画面)の真ん中にメインテーマがあり、そこから放射状に木構造で表示されているため、全体を俯瞰しながら考えることができます。
一方org-modeだけでは縦長の木構造となり、モニターの表示領域を有効活用できません。
普通に使っていれば画面の右半分はほとんど空欄になるでしょう。

<p>
  そこでEmacsのfollow-modeを使ってカバーします。
</p>

<pre>C-x 3</pre>


で画面分割した後に

M-x follow-mode

することで縦長の情報を段組のように表示することができ、全体が俯瞰できるようになります。
マインドマップとは見た目が異なりますが、同じレベルのものは同じ色になっているので、慣れれば同じように使えると考えています。

おわりに

Emacsのorg-modeを活用することでマインドマップ風に使う方法でした。
セルフブレーンストーミングでのアイデア出しや情報の整理に活用してみたいと思います。

操作