モーレツ! Org mode 教室 その5: TODOを管理する

もくじ

TODOの管理

Org modeには、強力なTODO管理機能が備わっている。

なんでアウトライン・プロセッサにTODO管理機能が付いてんだ、という疑問は当然あると思うが、確かにやるべきことというのは大体書き仕事をしているときに思いつくもので、そういう意味では文章執筆支援が本業のOrg modeにTODO機能があるというのはそんなにおかしくはない。実際、非常に便利である。

TODOを書くのは簡単で、とにかく見出しに続けて TODO と内容を書けばよい。

* TODO ゴミを出す

手でTODOと書いてもよいが、見出しの上で C-c C-t と打つと自動的に挿入される。さらに、何度か C-c C-t と打つとTODOとDONE(済み)、そしてただの見出しという風に切り替わるはずである。 S-右/左矢印 も基本的に同じ。

さらに S-上/下矢印 を押すと [#B] のような文字列が挿入される。これはTODOの優先度で、標準がBというわけである。もう一度押すとAやCに切り替わる。例によって S-M-RET で次行にTODO見出しが追加され、 M-上/下矢印 で行の順番が入れ替えられる。

# TODO [#A] 便所を掃除する
# TODO [#B] ゴミを出す

キーワードの追加

TODOの状態が、TODOとDONEだけなのが寂しいという人もいるかもしれない。例えばGTDの信奉者だと、Someday/MaybeやWaiting Forに相当する状態が欲しいという人もいるだろうが、そうした場合は

(setq org-todo-keywords
  '((sequence "TODO" "SOMEDAY" "WAITING" "|" "DONE")))

などと org-todo-keywords にキーワードを指定することで増やすことができる。 で、 C-c C-t を打つごとに次々と状態が切り替わる…のは良いのだが、キーワードが増えるといちいち一つずつ切り替えるのもめんどくさい。その場合は、

(setq org-todo-keywords
  '((sequence "TODO(t)" "SOMEDAY(s)" "WAITING(w)" "|" "DONE(d)")))

などと、キーワードの後に半角丸かっことショートカット文字を追加してやると、 C-c C-t と打てば、メニューが出てきてその文字を打つだけでキーワードが指定できるようになる。文字は好きに選べるので、例えばDONEに d ではなく x を当ててもいいわけだ。 | は装飾で、縦棒の右と左で色が変わる。好きなところに入れればよい。

私は装飾だと思っていたのだが、実は縦棒には実質的な意味があった!あとでまた触れる。

TODOの追加

さらに、メモの要領で思いついたTODOをすぐ保存できると便利である。その1で取り上げたOrg-captureを用いて、

; Org-captureのテンプレート(メニュー)の設定
(setq org-capture-templates
      '(("t" "Todo" entry (file+headline "~/ownCloud/Org/gtd.org" "INBOX")
     "* TODO %?\n %i\n %a")
    ("n" "Note" entry (file+headline "~/ownCloud/Org/notes.org" "Notes")
     "* %?\nEntered on %U\n %i\n %a")
    ))

のように書けば、 いつでもどこでも C-c c を押せばメニューが出現し、t を押せばTODO見出しが出てくる。で、書いたら C-c C-c ですぐ保存、やめたければ C-c C-k で破棄されるのである。

このセッティングだと、gtd.orgというファイルの * INBOX という見出しの下に ** TODO 借金を返す と言った感じで保存される。私はTODOはgtd.org、メモはnotes.orgと分けているが(refileできるのでファイルというかサブツリー間の移動はどのみち簡単)、別に分けなくてもよい。また、gtd.orgとかINBOXというのは私がGTDごっこをしているからで、名前はなんでもよい。

プロジェクト管理

プロジェクト管理というか、複数の小仕事からなる大仕事というのもあるが、Org modeはこれもうまくハンドルできる。

* TODO 世界を制服する [33%]
** DONE 日本を制服する
** TODO アメリカを制服する
** TODO 中国を制服する

といった具合に、TODOを入れ子にすることが出来るのである。 その3で出てきたチェックボックス同様、最上位のTODO見出し、これが実質的にプロジェクト名になるわけだが、ここに [/][%] と書いておけば、完了したTODOの数やパーセントも計算してくれる。

基本的にはこれで十分だと思うが、こだわるならばもう少し細かくコントロールすることもできる。

例えば、

* TODO 世界を制服する [0%]
** TODO 志を高く持つ
** TODO 世界各地を制服する
*** DONE 日本を制服する
*** TODO アメリカを制服する
*** TODO 中国を制服する

のように、子TODO(この場合、世界各地を制服する)の下にさらに孫TODO(例えば、日本を制服する)がある場合、デフォルトでは孫TODOを一つ潰しても全体の達成数や達成率にカウントされないのだが(だからこの例の場合0%)、

* TODO 世界を制服する [20%]
:PROPERTIES:
:COOKIE_DATA: todo recursive
:END:
** TODO 志を高く持つ
** TODO 世界各地を制服する
*** DONE 日本を制服する
*** TODO アメリカを制服する
*** TODO 中国を制服する

のように指定すると、子TODOが一つも終わっていないので0%、ではなく、子も孫もひっくるめて全部で5つのTODOのうち1つ終わったから20%終了、となる。

Org modeには見出しツリーの挙動を細かく変えられるプロパティという仕組みがあり、 :PROPERTIES::END: で囲った中でいろいろ指定できるのだが(詳しくは The Org Manual: Properties and columnsを参照)、 :COOKIE_DATA: というプロパティに todo recursive と指定してやると、孫TODOもカウントしてくれるようになるのである。

* TODO 世界を制服する [33%]
** DONE 日本を制服する
** TODO アメリカを制服する
** TODO 中国を制服する

最初の例に戻って、この場合デフォルトでは、日本以外を制服しなくてもとりあえず世界制服をDONEにすることが出来てしまうのだが、~/.emacs.d/init.el に

(setq org-enforce-todo-dependencies t)

と書いておけば、子TODOを全部クリアしないと親TODOをDONEに変えられなくなる。どうしても変えたい場合は C-u C-u C-u C-c C-t とすれば変えられる。好みにもよるだろうが、有効にしておくと良い機能である。

また、上から順にTODOをこなすことを強制したいのであれば、

* TODO 世界を制服する [20%]
:PROPERTIES:
:ORDERED: t
:END:   
** DONE 志を高く持つ
** TODO 超兵器を開発する
** TODO 日本を制服する
** TODO アメリカを制服する
** TODO 中国を制服する

などと指定してやると、超兵器を開発しない限り日本の制服以下をDONEにできないようになる。プロパティの :ORDERED: を t にすると、上から順にこなしていかなければならなくなるわけだ。

タイムスタンプの基本

Org modeでは、 C-c . を打つと簡単にタイムスタンプを挿入して時間を記録することができる。 今日の日付ならそのままEnterだし、カレンダーが出てくるので、他の日付を入れたければ S-矢印 で移動して好きな日付でEnterを打てば、<2018-08-27 月> といった感じに挿入される。タイムスタンプの上で C-c . を打つと編集できるし、うっかり編集しておかしくなった場合は、 C-c C-c を打てば自動的に修正される。

期日や締切、あるいは習慣のような繰り返されるTODOなど、タイムスタンプ機能は時間の流れを考慮に入れたスケジュール管理で最も活躍するのだが、そのあたりに関してはOrg-agendaの紹介をする際に譲り、今回の話に必要なものに絞ると、重要なのはTODOの終了日時の記録法である、~/.emacs.d/init.elに

(setq org-log-done 'time)

と指定すると、TODOをDONEにした際に、

* DONE ゴミを出す
  CLOSED: [2018-08-27 月 00:18]

などと終わった時刻が自動的に記録される。

で、実はこれとさっきの縦棒が絡んでくるのである。たとえば

(setq org-todo-keywords
  '((sequence "TODO(t)" "SOMEDAY(s)" "WAITING(w)" "|" "DONE(d)" "CANCELED(c@)")))

のようにすると、TODO、SOMEDAY、WAITINGはただキーワードが切り替わるというだけだが、DONEとCANCELEDは、DONE扱いといいますか、これらのキーワードに切り替えるとCLOSEDのタイムスタンプが自動的に挿入されるのである。すなわち、TODOには大別してOPEN状態とCLOSE状態があり、縦棒は、左がOPEN状態とみなされるキーワード、右がCLOSE状態とみなされるキーワードを分けていたのだった。

なお、CANCELEDのショートカットが (c@)になっているが、このように@をつけると、メモと同じ要領でそのキーワードにした理由を書くことができるようになる。

GTDぽい運用

GTDというのはGetting Things Doneの略で、まあ仕事術のようなものです(15分で分かるGTD – 仕事を成し遂げる技術の実用的ガイド)。Org modeが好きな人にはGTDが好きな人も多いようで、「Org mode GTD」などで検索すると佃煮にするほど多くのページが出てくる。

私の運用はGTDごっこというか、ごくシンプルなもので、

  1. TODOを思いついたらとりあえず C-c c t で記録する。Orgディレクトリのgtd.orgの * INBOX という見出しの下に保存される。

  2. 一日の終わりにでもgtd.orgを見返し、 複数のTODOをまとめてプロジェクトにしたり、C-c C-t で、他人のアクションを待っているTODOはWAITINGに、当面やるつもりはないがそのうちやりたいことはSOMEDAYに変えておく。

  3. あらかじめ gtd.orgに* Projects* Waiting* Someday という見出しを作っておき、それぞれrefileする。 一つずつ C-c C-w でrefileしてもよいし、TODOやらWAITINGやらSOMEDAYやら大量の見出しが入り混じっているのであれば、M-x org-sort でtodo[o]rderのoを選ぶと、たぶんキーワードごとに並べ替えられるので、あとはカット&ペーストで一度に移してやればよいと思う。

といった具合である。こうするとgtd.orgは、おそらく


* Inbox
** DONE ゴミを出す
   CLOSED: [2018-08-27 月 00:15]
** TODO 花に水をやる

* Projects
** TODO 本を書く [33%]
*** DONE 第1章を書く 
*** TODO 第2章を書く 
*** TODO 第3章を書く 

* Waiting
** WAITING 原稿の件を佐藤さんに連絡 ←これは佐藤さんからの返事を待っているということ
   <2018-08-27 月> ←こちらから連絡した日時をタイムスタンプで記録しておくと便利

* Someday
** SOMEDAY 世界を制服する
*** TODO 超兵器を開発する
*** TODO 日本を制服する
*** TODO その他を制服する

こんな感じになるんじゃないでしょうかねえ。

 

モーレツ! Org mode 教室 その4: 画像を手軽に貼る

番外編というか、本当は先に別のことを書こうと思っていたのだが、人に聞かれた(そして私自身も知らなかった)ので、画像の貼り方について。

ウェブブラウザ等からドラッグ&ドロップでOrgファイルに画像を貼れると便利だが、どうしたらいいのかよく分からなかった。少し調べてみたところ、どうやらorg-downloadを使うとできそうだということが分かった。

例によってorg-downloadもMELPAにあるので、~/.emacs.d/init.el に

; melpa
(require 'package)
(add-to-list 'package-archives
        '("melpa" . "https://melpa.org/packages/"))
(package-initialize)

などと書き、 M-x list-packages で一覧から選んでi xを押すか、 M-x package-install で直接org-downloadを指定してインストールすればよい。

で、org-download自体の設定としては

; Org-download
(require 'org-download)
(setq-default org-download-image-dir "~/ownCloud/Org/pictures")

を追加する。MELPAからインストールした場合requireは要らないことが多いのだが、私の環境(Debian GNU/Linux)では必要だった。 org-download-image-dir で画像ファイルの保存先ディレクトリを指定する。

あとは適当な画像をEmacs内にドラッグ&ドロップするだけで、

#+DOWNLOADED: https://www.gnu.org/software/emacs/images/teaser.png @ 2018-08-23 21:56:20
[[file:Dropbox/Org/pictures/teaser_2018-08-23_21-56-20.png]]

などとコメントとリンクが挿入され、場合によっては画像がインライン表示される。画像ファイルは org-download-image-dir に保存される。Debian sidとWindows 10の両方で、Firefoxから貼れることを確認した。

画像がインライン表示されるかどうかはEmacsのビルド次第で、最近だとJPG形式やPNG形式なら基本的にはサポートされるはずである。Windows では、なぜかどんな画像もBMP形式で保存されてしまうようで、まあそれは別に構わないのだが、EmacsはImageMagickサポートを組み込まないとBMP形式を表示できないので注意が必要。

他にも org-download にはいくつか機能があり、例えばキルバッファに画像ファイル名やURLを入れた上で、 M-x org-download-yank を実行すると、ドラッグ&ドロップしたときと同様に画像が挿入される。何の役に立つんだという人もいるだろうが、実は Dired で画像ファイルの上で 0 w と打つとそのファイルの場所がキルバッファに入るので、すでにローカルにある画像を簡単に挿入することが出来るのである。また、M-x org-download-screenshotを実行し、適当なウィンドウ上でクリックすると、そのウィンドウのスクリーンショットが挿入される。

 

モーレツ! Org mode 教室 その3: 文章の見た目を修飾する


もくじ

Org modeは、文字や文章の修飾機能も豊富である。Emacs上での見た目にもそれなりに反映されるが、特に威力を発揮するのは、HTMLなど他の形式へのエクスポート(変換)においてだろう。

ちなみにいきなり余談だが、見出しの文字を大きくしたりしてOrg modeのEmacs上での見た目を多少改善する、 org-beautify-theme というEmacs テーマがある。現在、Emacsの拡張機能はMELPAというレポジトリに多く集まっていて、このorg-beautify-theme もそこにあるので、~/.emacs.d/init.el に

(require 'package)
(add-to-list 'package-archives
         '("melpa" . "https://melpa.org/packages/"))
(package-initialize)

を入れて前々回出てきたpackage-elのパッケージ取得先にMELPAを追加し、Emacsを再起動するか init.el を開いて M-x eval-buffer した上で、 M-x package-install でorg-beautify-themeを指定すれば簡単にインストールすることができる(もちろんM-x list-packagesから選んでインストールすることも可能)。その上で、 M-x load-theme org-beautify で試してみるとよい。なお、 * などのブレット文字をUTF-8の記号に置き換える org-bullets という拡張もある。

エクスポート

ということで、先にOrg 形式から他フォーマットへのエクスポートのやり方を説明しておくと、ようは C-c C-e である。これを打つとメニューが表示されるので、それを見ながら、例えばHTMLなら h, Markdownなら m と打ち、さらにもう一度同じ文字を打って出力先を選ぶと変換される。これら以外の形式を指定するやり方や、変換範囲の設定などもメニューに書いてある。またはThe Org Manual: Exportingを読むとよい。また、ドキュメント変換ツール Pandocを使う手もある。

Markdownとの比較

Orgの記法(Org Syntaxと呼ばれる)もいわゆる軽量マークアップ言語の一つだが、今どき軽量マークアップ言語と言えばやはりMarkdownだと思う。ということで、Markdownとの対照表を作ってみた。

修飾内容 Orgの記法 Markdownの記法
見出し * 見出し # 見出し
コメント # コメント <!– コメント –>
強調(太字) **強調(太字)** **強調(太字)**
斜体(イタリック) /斜体(イタリック)/ *斜体(イタリック)*
下線 _下線_ <u>下線</u>
打ち消し +打ち消し+ ~~打ち消し~~
インラインコード ~インラインコード~ `インラインコード`
見た目そのまま(文字は等幅) =そのまま= `そのまま`

コメントにするとエクスポートで出力されなくなる。

なお、段落は前後の空行で分けられる。強制的に改行したければ文末に2つ半角スペースを入れる。このへんもMarkdownと同じである。水平線はダッシュを最低5つ、 すなわち ----- である。3つ以上で良いMarkdownとは若干違う。


また、 = のようなマークアップに使われる文字の前後には、半角スペースを一つ入れないとうまく解釈されないことがある。Emacs上で色が変わっているか確認すると良い。全角カンマやピリオドの後などが要注意である。

リスト

Org modeのリスト(箇条書き)の扱いはなかなか優秀だ。文中の好きなところで、とにかく行頭から始めるかインデントを合わせ、 -+ といったいかにもブレットになりそうな文字を書き並べてそれっぽくすれば、箇条書きとして扱ってくれる。

- 項目1
  - 子項目1
  - 子項目2
- 項目2
  1) その1
  2) その2
- 項目3
  • 項目1
    • 子項目1
    • 子項目2
  • 項目2
    1. その1
    2. その2
  • 項目3

といった具合で、 1.1) から始めれば、順序のある箇条書きとなる。インデントを下げれば入れ子も可能。箇条書きの行のどれかの上で C-c - を押すと箇条書きのブレットが次々と変わるのでやってみるとよい。また、箇条書きの上で C-c を打つと、番号が振り直されるので便利である。

見出しと定義、というタイプのリストは、 :: で分ける。

- ラーメン :: 醤油、塩、味噌など
- カレー :: アルー・ゴビー、バラック・サブジ、ラジマなど
  • ラーメン: 醤油、塩、味噌など
  • カレー: アルー・ゴビー、バラック・サブジ、ラジマなど

といった具合。

また、箇条書きの行の上で M-RET を押せば下に新しい行が挿入される。 M-上矢印M-下矢印 で項目の順序を入れ替えることもできる。大体順番を入れ替えるのはこのコマンドである。ちなみに普通は見出しとして使われる * も、行頭にせず適当にインデントすればブレットとして扱われる(が、混乱するのでやめたほうが無難)。

さらに、箇条書きの行の上で M-S-RET を押すとチェックボックスが挿入される。

- 人としてやるべきこと [/]
  - [X] 盆栽に水をやる
  - [ ] 子孫に美田を残す
  - [ ] 借金を返す 
  • 人としてやるべきこと [1/3]
    • [X] 盆栽に水をやる
    • [ ] 子孫に美田を残す
    • [ ] 借金を返す

チェックボックス行の上で C-c を押すとチェックされ、もう一度押すと元に戻る。

また、見れば大体見当が付くだろうが、 [/] を書いて C-c を打つと、その下の箇条書きのチェックボックスの数を数えて表示してくれる。 [%] と書くとパーセント表示になる。

他にも細かな操作が可能なので、The Org Manual: Plain listsを読むとよい。

リンク

厳密には見栄えの問題ではないが、Org modeではリンクも簡単に張ることができる。そもそも https://www.mhatta.org/wp/ といった具合で、ただURLを書けばすぐにリンクになる。最初は面食らうかもしれない。

説明をつけたければ C-c C-l である。まずリンクを入力し、次いで説明を入力する。するとリンクが挿入される。私のブログ といった具合である。リンク上でもう一度 C-c C-l を打つと編集できる。また、リンク上で C-c C-o を押すとWWWのURLならブラウザ、PDFファイルならPDFビューワといった具合で、適切な手段で開いてくれる。

もちろんOrg modeなので、すべてはプレーンテキストで表現されている。

[[https://www.mhatta.org/wp/]]
または
[[https://www.mhatta.org/wp/][私のブログ]]

といった具合に書かれているわけで、これを手で書いても構わない。Markdownとはリンクと説明の順序が逆ですね。

実はウェブのリンク以外にも、ファイルやメール、学術論文のdoiへのリンクなども簡単に張ることができる。 C-c C-l の補完内容をチェックしてみてほしい。また、何かのファイルを開いて C-c l を打つと、行番号など位置情報も含めて適切なリンクを勝手に考えて保存してくれるので、それを C-c C-l で挿入できる。こんな具合でリンクも実は奥が深いというか泥沼なのだが、より詳しくは The Org Manual: Hyperlinks を見るとよい。

上付き文字、下付き文字、LaTeX

Org modeの愛用者には科学者が多いせいか、数式を記述するのに便利な機能も多い。いわゆる上付き文字、下付き文字はネイティヴにサポートされていて、たとえば x^{上付き}y_{下付き} といった具合に記述できる。科学で多用されるギリシャ文字も、 \alpha\beta のように記述できる。Emacs上ではただのプレーンテキストだが、HTML等にエクスポートすればそれなりの見た目になる。なおEmacs上でも、運が良ければ C-c C-x \ (最後は円マーク)を押すとがんばってレンダリングされるかもしれない。

もう少し複雑な数式となると、 \begin{}\end{} で囲ったり、 $ でくくったりすればLaTeXの記法がそのまま使える。例えば $y=\sqrt{x}$ といった具合である。例えばHTMLエクスポートだと、デフォルトではMathJaxでレンダリングされるので、LaTeX一式は必要ない。もちろんLaTeXにレンダリングを任せることもできる。

表のサポートはOrg mode最大のダークサイドで、といっても出来が悪いのではなくむしろ意味不明に高機能であって、表計算やプロット、果ては高度な科学計算まで出来て頭がおかしい感じなのだが、機会があれば別途もう少し詳しく説明したい。そんなわけで、ここでは最低限に留めるが、より詳しくは The Org Manual: Tables を見てもらいたい。

といっても書き方自体としてはあまり説明することはなく、ASCII文字を駆使して表っぽく書けば表として扱ってくれるのである。基本としては、 | で区切ってデータを入力していけばよい。また、行の最初で |- などと入力して TAB を打つと、グラフの横幅まで横線が引かれる(一番下の横線は、 C-c - で引ける)。例によって表の要素は M-矢印 で移動できる。

とにかくわからなくなったら TABC-c を押せば適当に整形してくれるはずである。Org mode上での見た目はしょぼいが、HTML等にエクスポートすればそれなりに見栄えのする表にしてくれる。

|--------+------+------+------+------|
| 氏名   | 数学 | 英語 | 国語 | 合計 |
|--------+------+------+------+------|
| 野比   |    5 |   20 |   50 |      |
|--------+------+------+------+------|
| 出来杉 |   80 |   80 |   80 |      |
|--------+------+------+------+------|
氏名 数学 英語 国語 合計
野比 5 20 50  
出来杉 80 80 80  

さらに、野比の合計欄(2行目・5列目)で C-c = を打つと、 Column formula for $5 と聞いてくるので、 vsum($2..$4) などと入力してやると、野比の合計が計算される。また、下に追加される #+TBLFM の行の上で C-c を打つと表全体が再計算され、出来杉の合計も計算される。いわゆる表計算が出来るのである。

|--------+------+------+------+------|
| 氏名   | 数学 | 英語 | 国語 | 合計 |
|--------+------+------+------+------|
| 野比   |    5 |   20 |   50 |   75 |
|--------+------+------+------+------|
| 出来杉 |   80 |   80 |   80 |  240 |
|--------+------+------+------+------|
#+TBLFM: $5=vsum($2..$4)
氏名 数学 英語 国語 合計
野比 5 20 50 75
出来杉 80 80 80 240

すでにお察しの通り、行が @ 、列が $ で表現されていて、ピリオド2つで範囲を指定する。 vsum() はEmacsの知られざる黒魔術の一つである Emacs Calc (名前は Calc だが実際の機能は Mathematica 並み)の関数だ。ということで、ここから先は魅惑の泥沼が広がっている。

なお、あらかじめヨコ5×タテ2などとサイズが決まっている場合は、 C-c | を打ってそう指定すればそのサイズの表を用意してくれる。さらに、CSVで

氏名,数学,英語,国語,合計
野比,5,20,50,75
出来杉,80,80,80,240

などと書いて、リージョンとして選択した上で C-c | を押すと、表にしてくれたりもするのである。 M-x org-table-import を使うとファイルからインポートすることもできる。

引用やコード等の挿入

まず、行頭に : を書くと、マークアップを無視してそのまま表示される。Markdownで言うところの4文字スペースインデントに相当。

: いわゆる verbatim 表示。
: **強調** などのマークアップが無視される。
: 改行は無視されない。
いわゆる verbatim 表示。
**強調** などのマークアップが無視される。
改行は無視されない。

また、Org にはブロックという概念があり、 #+BEGIN_ブロックの種類#+END_ブロックの種類 で囲うと、そこがひとまとまりとして扱われる。例えば引用は、

#+BEGIN_QUOTE
鳴かぬなら殺してしまえホトトギス -- 織田信長
#+END_QUOTE

鳴かぬなら殺してしまえホトトギス – 織田信長

といった具合で、左と右にマージンが設定される。Markdownで言えば>である。

シャープ、プラス、ビギンなどといちいち入力するのは面倒だという人もいるだろうが、実は Easy Templates という機能のおかげで <q と入力して TAB を押すと補完入力されるので、そうでもない。QUOTEのqですね。

例は #+BEGIN_EXAMPLE から #+END_EXAMPLE である。これも、 <e と入力して TAB で補完される。EXAMPLEのeですね。

#+BEGIN_EXAMPLE
例の例の例。**お元気**ですか。
#+END_EXAMPLE
例の例の例。**お元気**ですか。

これは実質的には verbatim 表示と同じで、ブロック内のマークアップが無効となる。

ソースコードを引用したければ、 #+BEGIN_SRC から #+END_SRC である。これも、 <s と入力して TAB で補完される。SRCのsである。さらに、 #+BEGIN_SRC のうしろに言語名を書くと、言語の文法に従って適切にハイライト表示されるし、エクスポートでも考慮される。このあたりもMarkdownの ``` と同じだ。

#+BEGIN_SRC emacs-lisp
(defun xor (a b)
     "Exclusive or."
     (if a (not b) b))
#+END_SRC
(defun xor (a b)
     "Exclusive or."
     (if a (not b) b))

ちなみに、 #+BEGIN_SRC の後ろで C-M-i を押すと、Org modeが対応している言語の一覧が出てくるので簡単に指定できる。

さらに、Org modeには Org-babel という機能があり、コードブロック内のコードをOrg modeの中から実行できるのだが(PythonやらC++やらGNU Rはもとより、シェルスクリプトも書けるし、SSH経由で遠隔操作できたりもする)、それはまたそのうち。

 

モーレツ! Org mode 教室 その2: まとまった文章を書く


もくじ

前回も書いたように、Org modeは機能が増えすぎて今やなんだか訳のわからないものになっているが、本業はあくまでアウトライン・プロセッサ(英語圏ではアウトライナーと言うらしい)であって、アウトラインで構造化された文章を書くための道具として開発されたのである。

アウトラインとは、大ざっぱに言ってしまえば見出しのことで、大見出しで大まかな話、中見出しで少し細かい話、小見出しで詳細…という具合に、見出しの階層と内容の細かさを対応させて整理された文章を書く、というのがアウトライン・ライティングの狙いであった。Org modeには、このための支援機能が大量に備わっている。

追加の設定

Org modeは、.orgというという拡張子のついたファイルを開くと自動的に有効になる。まあ、M-x org-modeを実行すればどのバッファでも有効になるので、どうでもいいとも言えるが。

好みによるのかもしれないが、Org modeで長い文章を書く場合、~/.emacs.d/init.el

(setq org-startup-truncated nil)

を入れたほうがよいのではないかと思う。これは行の折返し(line wrapping)の設定で、Org modeはデフォルトでは行を折り返さないのである。手で適当に改行して一行を短くするか、適宜M-qで段落を詰め込めばよいのだろうが、私の場合だらだら改行を入れずに書いていくことが多く、カーソルがどんどん右に移動して文章の最初のほうが見えなくなると不便なので、ウィンドウの幅で折り返してくれたほうがありがたい。ただ、表の編集で問題が出る可能性はある。

アウトラインの操作

さて、前回書いたメモを保存したnotes.orgファイルを(Emacs以外のエディタで)覗いてみれば分かるが、.orgファイルというのは実のところ単なるテキストファイルで、*が見出しの印になっている。*の数が増えれば増えるほど階層が下になる。

* 大見出し

かくかくしかじか

** 中見出し1

あれやこれや

*** 小見出し1

うんぬんかんぬん

** 中見出し2

foo

*** 小見出し2

bar

上の例の場合、大見出しの下に中見出し、中見出しの下に小見出しがあり、各見出しの下に本文がある。階層に制限はなく、いくらでも*を増やすことができる。そして、*のある行でTABを押すと、その見出しよりも下の階層が折り畳まれて見えなくなる。折り畳まれていることは見出し末尾の...の有無でわかる。上位の見出し上でTABを何度か押すと折り畳み具合が変わる。言葉で書くとややこしいが、やってみればすぐ分かるだろう。

まっさらな状態でM-RET(RETはReturn/Enterキー)を打つと、*が挿入される。その時点で最上位の階層の見出しが入力できるようになるわけだ(もちろん、*の下であれば**が挿入される)。すでにある行を見出しにする(ようするに行頭に*を挿入)には、C-c *である。これはトグルになっているので、もう一度押すと元に戻る。別に、手でアスタリスクを書いたり消したりしてもいいのだが…。

行頭に一つでも*があれば、M-矢印キーで階層を動かすことができる。M-右矢印で階層が下に(*が一つ増える、例えば大見出しが中見出しになる)、M-左矢印で階層が上に(*が一つ減る)ということになる。また、SHIFTキーも押してM-S-矢印にすると、その見出し以下の階層すべてが動く。これも言葉で書くとピンとこないかもしれないが、やってみればすぐ分かる。

もう一つ重要なのが、サブツリー(見出しツリー)単位でのカット&ペーストだ。サブツリーというのは、ようするにある見出しからその下の階層すべて、ということだが、カットがC-c C-x C-w、ペーストがC-c C-x C-yである。上の例だと、中見出し1の上でC-c C-x C-wを叩くと、中見出し1と小見出し1がセットで切り取られる。これにより、見出しの組み換えや、後で出てくるメモの切り貼りが簡単にできるようになる。三連続の打鍵てなんだよ、覚えられねえよという向きもあるだろうが、多用するのですぐ覚えるだろう。

あとは、C-c C-nnextなので前進)とC-c C-p(previousなので後退)で見出しから見出しへジャンプできることを覚えておくとよい。段落から段落へはC-上矢印またはC-下矢印でジャンプできる。

他にも様々なキーバインドがあって、それはThe Org Manual: Structure editingを読めば分かるが、当面必要なのはこれくらいだと思う。

Org-refileの設定

前回説明したOrg-captureによるメモ取りをアウトライン・プロセッシングと組み合わせるには、Org-refileの設定をしておくと便利である。refileというのは、あるファイルの一部を、見出しツリー単位で他のファイルの見出しの下にリファイル(移動)するという機能で、これを使えばnotes.orgに記録したメモを簡単に他のファイルへ移すことができる。

最低限必要な~/.emacs.d/init.elの設定は

(setq org-agenda-files '("~/ownCloud/Org"))
(setq org-refile-targets '((org-agenda-files :maxlevel . 3)))

である。org-agenda-filesという変数名に変な感じがするかもしれないが、これは、後で説明するOrg-agendaという機能と共用しようと思っているからで、ようするにOrgディレクトリの中のファイルすべてを対象にする、ということだ。重要なのはその次のorg-refile-targetsで、Orgディレクトリ以下の.orgファイルに関し、maxlevelが3階層目、すなわち***の見出しまでを移動先として選べるようにするという指定である。

このように設定し、Orgディレクトリに.orgファイルを入れておけば、見出しの上でC-wを押すと、Refile subtree "指定した見出し" to (default 他のファイルの見出し(other.org)):みたいなメッセージがミニバッファに出ると思う。ここで他のファイルの中の見出しを指定してやれば、そこの下へ今C-wを叩いたサブツリーが一発で移動するのである。このように、Org-refileをうまく使うとファイル間で見出し項目の移動が素早くできるようになる。

ちなみに、すでにいじらないことがほぼ確定している.orgファイルがあると移動先として見えてしまってうざったいので、そういう場合はOrgディレクトリから消すか他へ移動するか、あるいはC-c $でアーカイヴ化するとよい。アーカイヴ化というと大層に聞こえるが、基本的には拡張子を.orgから.org_archiveに変えているだけである。

また、私自身は使っていないが、別に.orgファイルをOrgディレクトリ以下に置かなくても、org-refile-targets周りに少し手を加えて

; cf. https://www.emacswiki.org/emacs/OrgMode#toc21
(defun mhatta/org-buffer-files ()
  "Return list of opened Org mode buffer files"
  (mapcar (function buffer-file-name)
      (org-buffer-list 'files)))
(setq org-refile-targets
      (quote ((nil :maxlevel . 3)
          (mhatta/org-buffer-files :maxlevel . 1)
          (org-agenda-files :maxlevel . 3))))

などとすれば、現在バッファで開いている.orgファイルであれば、Orgディレクトリ下になくともリファイル先に指定できるようになる。

Org-refileについて更に細かく知りたい人は、The Org Manual: Refile and copyを読むと良いだろう。

具体的なワークフロー

以上のような設定をしておくと、次のようなワークフローで文章を書くことができるようになる。日本語のアウトライン・プロセッシングの解説書は、読んで見るとなんだかやたらややこしいというか、そういう機能があることは分かったが具体的にどう使ったらいいか分からないというか、しまいには人生訓みたいな話になって困惑することもあるのだが、これは比較的実用的だと思う。

  1. 原稿の.orgファイルをOrgディレクトリ以下に用意する。そうすればOrg-refileの対象になる。

  2. とりあえずM-RETを打って見出しを一つ用意し、文章のタイトルでも書く。* 文章のタイトルといった具合。一応文章全体が一つの見出しの下にあったほうが管理がしやすいと思う。実質的な見出しは**からということですね。

  3. 見出しのことなどはあまり考えず、とにかく思いつくことを、一行ずつ空けて単語や文章でがーっと列挙する。だらだらやっても限界があるので、5分とか時間を切ってやるとよい。

  4. あとは、C-c *等を使ってこれはというものを見出しにし、階層を変えたり順序を組み替えたりして、仮の目次というかアウトラインをでっちあげる。最初のアウトラインにこだわってもしょうがないというか、どうせ書いている最中に大きく変わるに決まっているので、あまり時間をかけるべきではない。3のアイデア出しも含めて、1ポモドーロ(25分)を超えると長すぎると思いますね。ちなみにこのブログ記事のアウトラインは、元は
    * アウトライン・プロセッサとしてのOrg mode
    
    ** キーバインド
    
    ** メモとの連携
    
    ** Org refile
    
    ** まとめ
    
    * 未整理
    

    みたいな感じだった。

    ポイントは、「未整理」という項目を用意することである。別に名前は「未整理」でなく、「メモ」でも「雑」でもなんでもよいのだが、本来の目次とは無関係な、一時バッファ的なものを末尾に置くわけです。notes.orgに保存したメモよりも上の階層の見出し(上の例では**ではなく*)が良い。

  5. あとは、書けるところから書く。途中で何か思いついたら、前回紹介したOrg-captureでメモをとる。文章を書いていると全然関係ないことを思いつくというか、むしろとりあえず書き始めないと何も思いつかないというところがあるので、とにかく書いてどんどんnotes.orgに保存していく。

  6. 行き詰まったらC-M-^でメモを呼び出して眺める。これは、というものがあったらOrg-refileで原稿の.orgファイルの「未整理」以下にリファイルする。

  7. 見出し「未整理」の内容を検討し、本文に移したり、見出しを組み替えたり、あるいはやっぱり無関係なので未整理から追い出してnotes.orgに戻したり、といった検討作業を行う。トップダウンででっちあげたアウトラインを、ボトムアップで集めたメモで補ったり変更したりして煮詰めていくわけだ。

  8. ある程度アウトラインが定まったら、本格的に書いて、まとめて、仕上げて終わり。もちろんこの段階で構成を組み替えたって一向に構わない。

こんな具合でOrg modeを、アウトライン・プロセッサとして活用してやれば、Org modeも以て瞑すべし、ということになるんじゃないでしょうかねえ。

 

モーレツ! Org mode 教室 その1: 素早くメモを取る


もくじ

Org modeとは

わたくしは元々EmacsVimも、Visual Studio Codeすらも使う(GNU/Linux上でも案外ちゃんと動くので)いい加減な人間なのだが、最近ではEmacsを使う頻度が上がっている。というか、最近はEmacsしか使っていない。それは主にOrg modeのせいである。

Org modeというのは、もともとアウトラインプロセッサを提供するEmacsの拡張機能のようなものとして開発されたらしいのだが、その後建て増しに建て増しを重ねた違法建築みたいなことになっていて、本業のアウトラインプロセッシングはもとより、メモ取りも日記もTODO管理もスケジュール管理も進捗管理も時間管理もプレゼンスライド作りも表計算も図の作成も貼ったコードの実行もできるようになり、さらにOrg modeを拡張する拡張機能というのも大量に開発されているので、途方もない代物になっている。今やEmacsはテキストエディタではなく、Org modeのフロントエンドと考えたほうが良いのではないか。

とはいえ、何でもできるというのは、何をやらせたらよいのかわからないというのと同義であって、私自身も10年くらい前に一度試して挫折したのだが、とっかかりとしてOrg modeを用いたメモ取りから始めるとスムーズに使い始められるように思う。最近Org modeについて人に説明する機会があったので、とりあえずメモ取りのやり方から書いてみよう。

Emacsのインストール

その前に、Emacsのインストール方法を手短に。

GNU/Linuxの場合、大概のディストリビューションにはEmacsが入っていると思うので、それをインストールすればよい。

Windowsの場合、公式ビルドは最新のEmacs 26.1でも普通にIME経由で日本語入力できないので(最低限のパッチをupstreamへ入れてもらったので次のリリースで直る予定)、いわゆる日本語IMEパッチを当てたビルドを探して入れるとよい。私が用意しているものもある。

Macについては良く知らないが、HomebrewやMacPortsからインストールできるようだし、Emacs For Mac OS Xというのもあるようだ。

Androidの場合、端末エミュレータのTermuxを入れてその上でEmacsをインストールするのが一番簡単だと思う。以前書いたAndroid上でEmacsをまともに使うにはを参照してやってください。

すでにEmacsがインストールされている場合、バージョンがやたら古い場合があるので、最低でもEmacs 25以上が入っていることを確認すると良い。EmacsのバージョンはM-x versionで調べられる。なおM-xというのはMetaキーを押しながらxを押す(と「ミニバッファ」という下のバッファにカーソルが移ってコマンドが入力できるようになる)ということで、GNU/LinuxやWindowsではMetaキーはふつうAltキーだが、MacではOptionキーなんですかね?ちなみに、C-xというのはCtrlキーを押しながらxを押すという意味である。なお、Org mode自体のバージョンはM-x org-versionで調べられる。

GNU/Linuxの場合は気にしなくて良いが、Windowsの場合、ホームディレクトリをWindowsの環境変数HOMEで指定しておくと何かと便利である。C-x C-fを押してミニバッファに~/と書き、タブキーを2回押す(文章で書くとなんだかやたら複雑なことをやっているようだが、ホームディレクトリ(~/)にあるファイルを開くべくファイラのDiredを実行しているだけ)と、現時点でのホームディレクトリがどこか見当がつくので、そこが気に食わない場合は自分でHOMEに指定するとよい。ここの下に設定ファイル(~/.emacs.d/init.el)を置くことになる。Windowsのユーザディレクトリに合わせるのが無難なので、おすすめはC:\Users\ユーザ名とかでしょうか。

Emacsの本当に最低限の設定

Emacsの設定は、凝り始めると際限なく出来て泥沼にはまるので、この段階では極力最低限に留めたい。そういう意味では、日本語をUTF-8で使うための最低限の設定として、~/.emacs.d/init.el(あなたがたのような老害は~/.emacsとか~/.emacs.elに設定を書いていると思うが、最近のナウいヤングはこちららしい)に

;; 日本語環境の設定

(set-language-environment "Japanese")
(prefer-coding-system 'utf-8)
(set-default 'buffer-file-coding-system 'utf-8)

あたりを入れておけばよろしいのではないでしょうか。なお;はEmacs Lispにおけるコメント行の指定である。

もう一つ頭が痛いのがフォントの設定で、正直未だによく分からないのだが、とりあえず英数字はConsolasフォントが気に入っているので、Windowsでは

;; Windowsにおけるフォントの設定(Consolasとメイリオ)
(when (eq system-type 'windows-nt)
  (set-face-attribute 'default nil :family "Consolas" :height 110)
  (set-fontset-font 'nil 'japanese-jisx0208
                    (font-spec :family "メイリオ"))
  (add-to-list 'face-font-rescale-alist
               '(".*メイリオ.*" . 1.1))
  )

GNU/Linuxでは

;; GNU/Linuxにおけるフォントの設定(IncosolataとIPA exGothic)
(set-frame-font "Inconsolata-14")
(set-fontset-font t 'japanese-jisx0208 (font-spec :family "IPAExGothic"))

にしている。WindowsのConsolasとメイリオは標準でインストールされているが、GNU/LinuxではConsolasのぱちもんのInconsolataIPA exフォントを自分でインストールする必要がある。たぶん今では大概のディストロでパッケージ化されていると思うが…。ちなみにDebian/Ubuntuならfonts-inconsolatafonts-ipaexfontをインストールすればよい。

なお、Androidは何も指定せずTermuxのデフォルト任せである。Macは想像もつきません。

Org modeのアップデート

Org modeは今やEmacsに標準添付なので、Emacsを入れれば自動的に付いてくるのだが、バージョンがやや古く、Org modeへの拡張機能が動かなかったりすることもある(例えばOrg-journalはOrg 9じゃないと動かないみたい)。なので、手でアップデートしておくと良い。現在の最新は9.1.13で、まあ9.xならだいたい大丈夫じゃないでしょうか。

最近のEmacsはpackage-elという拡張パッケージ管理機能を標準で持っているので、M-x list-packagesから一覧形式でorgを探してその上でi、次いでxを押してインストールするか、M-x package-install orgで直接インストールすると良い(最新安定版のorgは標準のgnuレポジトリにあるので、とりあえずこの時点ではMELPA等を自分で指定しなくても大丈夫なはず)。

ちなみに、最近だとEmacsのelispパッケージ管理は、私も含めてたぶんCask(とPallet)を使っている人が多いと思うのだが、Pythonを入れなければならなかったり、説明がめんどくさいので、興味がある人は自分で調べてください。package-elはGNU/LinuxだろうがWindowsだろうがMacだろうがAndroidだろうが動作するはずで、このマルチプラットフォーム性も今どきのEmacsのメリットの一つである。package-elで入れたパッケージを、後からCaskの管理下に移すこともできる。

Org modeの本当に最低限の設定

Org modeの設定もまた泥沼になりがちで、とにかく極力最低限にしたい。どうしても指定しなければならないのはOrgファイルのありかで、

;; Org modeの設定

; ファイルの場所
(setq org-directory "~/ownCloud/Org")
;(setq org-directory "~/Dropbox/Org")
(setq org-default-notes-file "notes.org")

とか指定する。DropboxやownCloudのようなクラウドストレージにOrgディレクトリを作って指定するのがおすすめで、これにより複数環境で簡単にメモを同期できるようになる。Android上のTermuxの場合、Androidのバージョンや外部SDカードの有無、Dropbox等アプリのバージョンによってファイルが置かれる場所が違うらしく一概には言えないようだが、オフラインでもアクセスできるよう設定すればどこかにはあると思うので、そのパスを指定してやればよい。私の以前の記事のようにtermux-setup-storageを実行していれば、~/storage/shared/Android/data/com.dropbox.android/files/なんとか/かんとか/Orgとかでアクセスできるのではないかと思う(ただ、リアルタイムで同期されず不便なので、私自身は使っていない。何かうまい手はないかねえ)。

メモを取る

いよいよ本題である。わたくしは頭が弱いので、何かを思いつくとすぐ忘れてしまう。なので、思いついたらとにかくすぐに書き留めなければならない。そこで手元に紙とペン(というか鉛筆)が欠かせなかったのだが、Org modeのおかげで、とりあえずコンピュータの前にいるときだけは、ようやく紙のメモとおさらばできたのである。

で、そのOrg modeのメモ取り機能がOrg-captureだ。先述の通り、現在のOrg modeには意味不明なくらいに様々な機能が盛り込まれているのだが、別に機能があるからといって使わなくてもいいので、私などは多分Org modeの使用時間の80%くらいはOrg-captureだと思う。

Org-captureの設定だが、とりあえずは

; Org-captureの設定

; Org-captureを呼び出すキーシーケンス
(define-key global-map "\C-cc" 'org-capture)
; Org-captureのテンプレート(メニュー)の設定
(setq org-capture-templates
      '(("n" "Note" entry (file+headline "~/ownCloud/Org/notes.org" "Notes")
         "* %?\nEntered on %U\n %i\n %a")
        ))

とかでよろしいのではないかと思う。最初はOrg-captureを呼び出すキーシーケンスの設定で、ようするにC-c c(Ctrlを押しながらc、その後Ctrlを押さずにc)である。C-cプラスなんとかはユーザが設定できるよう予約されているので、好みでc以外に変えても良いが、まあこれが一番素早く打てるシーケンスじゃないでしょうか。

で、このように設定すると、とにかくEmacsの中にいれば、C-c cを押すといつでもメニューが出てくる。ここで、nを押してやると~/Dropbox/Org/notes.orgにメモが書け、C-c C-cを押すと保存されて元のバッファに戻る(保存せずに捨てたければC-c C-k)という寸法になっている。nというキーやメモを保存するファイル名がどこで指定されているかは見ればだいたい見当がつくと思うが、file+headlineだの%?だのに関しては後回しにしましょう。

メモを見る

書いたメモはさっとすぐに見たいのである。

; メモをC-M-^一発で見るための設定
; https://qiita.com/takaxp/items/0b717ad1d0488b74429d から拝借
(defun show-org-buffer (file)
  "Show an org-file FILE on the current buffer."
  (interactive)
  (if (get-buffer file)
      (let ((buffer (get-buffer file)))
        (switch-to-buffer buffer)
        (message "%s" file))
    (find-file (concat "~/ownCloud/Org/" file))))
(global-set-key (kbd "C-M-^") '(lambda () (interactive)
                                 (show-org-buffer "notes.org")))

とか~/.emacs.d/init.elに書いておくと、Ctrl-Meta-^を同時に押せばすぐに~/ownCloud/Org/notes.orgを開くようにできる。* Notes...のように...が付いている見出しは、その行でTABキーを押すと開閉されてその下の内容が見えたり見えなくなったりするようになる。見終わったらC-x 左矢印で元いたバッファに戻れるはず。

notes.orgの中を覗いて見ればだいたい分かると思うが、Orgが管理するファイル(拡張子が.org)は実体はテキストファイルで、*の数で階層付けがされている。先ほどの(file+headline "ファイル名" "Notes")というのは、ファイルの中の* Notesという項目のひとつ階層下に** メモのタイトルという感じで追記しろ、という指定であった。これも実は好きに変えられるので、もっと知りたい人はThe Org Manual: Template elementsを見るとよい。

%?だの%UだのはThe Org Manual: Template expansionに詳しい説明があるが、ようするに\nは改行、%?はOrg-captureのバッファを開いたときのカーソルの位置、%Uはタイムスタンプ、%iC-c cを叩いたときに選択されていたリージョンの内容、%aC-c cを叩いたときに開いていたファイルへのリンク(本当はorg-store-linkで保存されたリンクだが)で、リンクの上でC-c C-oを押すとリンク先のファイルを開くことができる。まあ%iとか%aはオプション的なので指定しなくても良いし、全て自由に変えて構わない。例えば、メモなのでタイムスタンプだけでいちいちタイトルをつけなくて良い、という場合は、%?の位置を変えて* %U\n%?とかにしてやればよいのである。

まとめ

というわけで、以上のようにあれやこれやと設定すると、

  1. とにかく何か思いついたらC-c cn→何か書く→C-c C-cで保存
  2. C-M-^でメモを見る

でいつでもメモを取ったり見たりできるようになる。C-c c nは手に馴染むので、そのうち何も考えずにメモが取れるようになるだろう。これだけでもOrg modeが使えてよかったという気になりませんか。ならないか。ひとまずおわり。

 

NAGAE+ collinetteはモバイル踏み竹として最適

NAGAE+ ナガエプリュス リラクセーションツール collinette コリネット

オッサンなので自宅にいるときは毎日青竹踏みを欠かさないのですが、さすがに旅行にまで青竹を持っていく気にはなれないので、なにか代わりになるものはないかと物色していたのである。

これは本来足踏み用ではないような気がしなくもないのだが、凸がないほうを上にすれば足裏にフィットするし、凸があるほうを上にすればかなり痛い刺激にもなるといった具合で、片足ごとに踏まなければならないことを除けば特に不満がない。デザインも気が効いている。おすすめ。

ちなみに同じシリーズで違うデザインのものもあるのだが、この円形のやつが一番持ち運びしやすいと思う。やや傷が付きやすいのが難点ですかねえ。