- 文章を書くだけならmarkdown-modeで足りていましたが、思いつきを並べ替える段階になるとorg-modeのほうが手に馴染みました。
- 覚えるキーは実質6つです。見出しを作るM-RET、深さを変えるM-←/→、塊ごと動かすM-↑/↓があれば、アイデア整理は回ります。
- 見出しとその配下をまとめて扱うサブツリーという単位が、そのままアイデアの単位になります。
- 切り取って貼り付けた見出しが畳まれるのは、org-yank-folded-subtreesが既定でtだからです。nilにすると開いたまま入ります。
- プログラミング向けの補完機能はこの用途では邪魔になったので、init.elでorg-modeを除外しました。
1. markdown-modeで足りなかったのは並べ替え
Emacsで文章を書くとき、これまではmarkdown-modeを使っていました。 見出しに#を付けて、本文を書いて、コードブロックを挟む。
ただし、書く前の段階で、 頭の中にある断片を一度全部出して、あとから並べ替えたい。 markdownでも見出しは書けますが、「この項目を一つ下の階層にしたい」と思ったとき、行頭に#を一つ足す手作業になります。 項目の順番を入れ替えるときは、その見出しと下にぶら下がっている本文をまとめて選択して、カット、移動先でペースト。 一回ならどうということはありませんが、だんだん面倒になってきます。
2. 覚えるキーは6つで足りる
org-modeは、この操作がキー一つです。 .orgという拡張子でファイルを開けば、あとは特別な設定なしにOrg modeが立ち上がります1。 見出しの先頭は*で、星の数がそのまま階層の深さになります2。
Org modeには、タスク管理も日付管理も表計算も、公開用のエクスポートもあります。 ただ、アイデアプロセッサ(idea processor:思いつきを階層として編集する道具)として使うだけなら、ほとんど触りません。 使うのはこれだけ。
2.1. 見出しを作る、深さを変える、動かす
M-RETで、いま居る見出しと同じ階層に新しい見出しができます3。 Mは、MetaつまりAltかOptionのことです。 思いついたものをとにかくM-RETで並べていくと、こうなります。
* 課題
* 利用者
* 解決方法
* 懸念点
* 参考事例
ここでM-→を押すと、その見出しが一段深くなります。 M-←で一段浅くなる4。 「利用者」の下に「初心者」と「専門家」をぶら下げたいなら、M-RETで作ってからM-→を一回押すだけです。
M-↑とM-↓は、見出しを上下に移動します。 このとき動くのは見出しの行だけではありません。 その見出しの下にある本文も、子見出しも、まとめて付いてきます。 この「見出しと配下の一式」をサブツリー(subtree:階層の一部分をまるごと指す単位)と呼びます5。
アイデアをどんどん作って、塊のまま入れ替えられる。 これが気持ちいい。 子見出しごと階層を変えたいときはM-S-←とM-S-→で、Sを足すと配下も一緒に動きます6。
2.2. 折り畳みで全体と細部を行き来する
TABを押すと、カーソルのある見出しが折り畳まれます。 もう一度押すと直接の子見出しだけが出て、さらに押すと中身が全部開く。 S-TABは文書全体に対して同じことをして、概要、見出し一覧、全内容の順に切り替わります7。
この二つがあると、書き方が変わります。 最初は構造を考えず、思いついた順に同じ階層で並べる。 次に、関連するものをM-→で子にして、M-↑とM-↓で順番を直す。
* 利用者
** 初心者
** 専門家
* 解決方法
** 検索
** 自動整理
* 懸念点
** 費用
** 精度
最後にS-TABで全体を畳んで、いま考えたい見出しだけTABで開きます。 畳んでしまえば、開いていない部分は視界から消える。 考えたい一箇所だけを見ながら、全体の骨組みも失わずに済みます。
見出しの下では、-で始まる普通の箇条書きも使えます。 リストの上でもM-RETで次の項目が作れますし、M-↑やM-↓で入れ替えられます。 インデントで階層が決まるので、子項目を持つ項目もそのまま動きます8。
2.3. 貼り付けると勝手に畳まれる
M-↑やM-↓で足りない移動もあります。 離れた場所へ持っていきたいときは、C-wで切り取って移動先でC-y。 ところが貼り付けた見出しが、閉じた状態で現れました。 中身を確認したいのに、いちいちTABで開き直すことになる。
これはOrg側の「親切」でした。 Org modeのC-yはyankではなくorg-yankに割り当てられていて、切り取ったものが見出しから始まる一まとまりだと判断されると、貼り付けたあとに畳む処理が入ります9。 長いサブツリーを移動したときに画面が流れないための動きですが、アイデアを組み替えている最中は、開いたまま置きたい。
止めるには、init.elに一行足します。
(setq org-yank-folded-subtrees nil)
Code language: Lisp (lisp)
既定値がtで、これがサブツリーを畳む側の指示です10。 設定を変えずにその場だけ避けたいなら、C-u C-yでも構いません。 前置引数を付けるとorg-yankが特別扱いをやめて、素のyankがそのまま走ります。
ついでに気づいたのが、org-yank-adjusted-subtreesです11。 既定はnilなので、切り取ったときの星の数のまま貼り付きます。 tにすると、貼り付け先の見出しの深さに合わせて階層が調整されます。 第二階層から切り取って第三階層の下へ移す、といった組み替えを繰り返すなら、こちらも入れておくとM-→を押す回数が減ります。
3. 補完機能はアイデア出しの邪魔になる
ここまでは順調でしたが、実際に使いはじめると引っかかる場所がありました。 プログラミング用に入れていた補完系のマイナーモードが、org-modeでも走っていたのです。 コードを書くときには助かる機能が、見出しを並べているときには手を止めさせる。
3.1. smartparensを外す
smartparensは、括弧や引用符を自動で閉じてくれるパッケージです。 (と打てば)が付いてくる。 コードならありがたいのですが、日本語の見出しに括弧を書くと、閉じ括弧が勝手に増えて消す手間が生まれます。 それに、sp-use-paredit-bindingsで入るキーバインドがorg-modeの操作と競合していました。
smartparens-global-modeは全バッファで有効になるので、除外リストにorg-modeを追加します。
:init
(require 'smartparens-config)
;; Org modeではsmartparensを有効にしない
(add-to-list 'sp-ignore-modes-list 'org-mode)
(smartparens-global-mode t)
(sp-use-paredit-bindings)
Code language: Lisp (lisp)
sp-ignore-modes-listは、グローバルモードの自動有効化から外すメジャーモードの一覧です12。 すでに開いているOrgバッファには効かないので、設定を読み込み直したあとM-x normal-modeでモードに入り直します13。
3.2. company-modeを外す
company-modeは入力途中の単語から候補を出す補完機能です。 既定では3文字ほど打つと候補のポップアップが出ます14。 コードを書いているときは変数名を思い出さずに済んで助かりますが、見出しを打っているときは違いました。
アイデアを書き出している最中は、まだ言葉が定まっていません。 そこに過去に書いた単語の候補が出てくると、視線がそちらに引っ張られる。 しかも候補が出ている状態ではRETが候補の確定に取られることがあって、M-RETで次の見出しを作る流れが途切れます。
除外はcompany-global-modesのnot以下に書き足すだけです。
(use-package company
:ensure t
:hook (after-init . global-company-mode)
:config
(setq company-global-modes
'(not fundamental-mode
markdown-mode
org-mode))
(setq company-idle-delay 0.2)
(setq company-minimum-prefix-length 3)
:bind
(:map company-active-map
("C-n" . company-select-next)
("C-p" . company-select-previous)))
Code language: Lisp (lisp)
これでnotに並べたモードでは、グローバルなcompany-modeが立ち上がりません15。 開いたままのバッファでは、M-x company-modeを一度実行すると無効になります。
外してみると、org-modeのバッファはずいぶん静かになりました。 打った文字がそのまま出るだけ。 アイデアを出す場所には、これくらいが合っているようです。
4. 道具を減らすと考えやすくなる
org-modeの機能表を眺めると、できることの多さに圧倒されます。 それでも実際に毎日使っているのは、M-RETとM-の矢印キーだけです。 項目を作って、深さを変えて、順番を入れ替える。
補完を外したのも、機能が悪かったからではありません。 コードを書く場面で役に立つ動きが、考えを出す場面では逆に働いただけです。 同じEmacsの中でも、モードごとに求めるものが違う。
道具を足すより、使わない場所で止めるほうが効くことがあります。
- Orgマニュアルは、.org拡張子のファイルは既定でOrg modeを使うと記載しています。拡張子が違うファイルでOrg modeにしたい場合は、先頭行に「-– mode: org; –-」と書く方法が案内されています。 – Activation (The Org Manual)
- Org の見出しは行頭から1つ以上の星と半角スペースで始まります。星が多いほど深い階層になり、見出しには自動で番号は振られません。 – Headlines (The Org Manual)
- M-RETに割り当てられているのはorg-meta-returnです。行の途中で実行すると行が分割され、残りが新しい見出しになります。分割してほしくない場合はorg-M-RET-may-split-lineを設定します。 – Structure Editing (The Org Manual)
- M-LEFTがorg-do-promote、M-RIGHTがorg-do-demoteです。リージョンが有効なときは、範囲内のすべての見出しに対して昇格・降格が働きます。 – Structure Editing (The Org Manual)
- M-UPのorg-move-subtree-upとM-DOWNのorg-move-subtree-downは、見出し行だけでなくサブツリー全体を移動します。 – Structure Editing (The Org Manual)
- M-S-LEFTがorg-promote-subtree、M-S-RIGHTがorg-demote-subtreeで、現在のサブツリーを丸ごと1段階昇格または降格させます。 – Structure Editing (The Org Manual)
- TABのorg-cycleはFOLDED、CHILDREN、SUBTREEの順に循環し、S-TABのorg-global-cycleはOVERVIEW、CONTENTS、SHOW ALLの順に循環します。S-TABに数値の前置引数を渡すと、その階層までを表示できます。 – Global and local cycling (The Org Manual)
- Orgの箇条書きは、ハイフン、プラス、アスタリスクのいずれかで始め、同じリストの項目は先頭行のインデントを揃える必要があります。項目は、自分の記号より浅いインデントの行が現れた時点で終わります。 – Plain Lists (The Org Manual)
- org-yankは、キルしたものが単一のサブツリー、または兄弟と子だけで構成される複数のサブツリーかどうかを判定し、条件を満たす場合に特別な扱いをします。 – org.el
- org-yank-folded-subtreesのdocstringは「Non-nil means when yanking subtrees, fold them.」で、既定値はtです。ただし畳むことで後続のテキストが折り畳み範囲に巻き込まれる場合は、畳まれません。 – org.el
- org-yank-adjusted-subtreesを非nilにすると、貼り付け先の前後にある表示中の見出しのうち浅いほうに合わせて、サブツリーの階層が昇格または降格されます。既定値はnilです。 – org.el
- ソース上の定義は「Modes where smartparens mode is inactive if allowed globally.」で、既定値はminibuffer-modeとminibuffer-inactive-modeの2つだけです。グローバルモードを有効にする関数が、このリストに含まれるメジャーモードを飛ばします。 – smartparens.el
- normal-modeは、Emacsがそのファイルに対して本来選ぶはずのメジャーモードに戻すコマンドです。find-fileがモードを決めるときに呼ぶ関数と同じもので、ファイルを開いている場合は先頭の-*-行やファイルローカル変数も読み直します。 – Choosing File Modes (GNU Emacs Manual)
- company-minimum-prefix-lengthの既定値は3、company-idle-delayの既定値は0.2秒です。 – company.el
- company-global-modesは、tならすべてのメジャーモード、nilならどこでも無効、リストならそのモードのみで有効になります。リストの先頭がnotのときだけ意味が反転し、除外リストとして働きます。 – company.el