Org-modeとは

プレーンテキストの記法の一つ.

オーグモードと読み, Org-modeと表記するのが正式. ただorg-modeの表記のほうが多くどちらでもいいものの, このメモでは表記ゆれを避けたいのでOrg-modeでいく.

個人的にはEmacsのキラーアプリ的存在. ほかのエディタにOrg-modeが実装されたら移行してもいいがそうでなければEmacsを離れられない.

📂Org-mode Index

📍Org-mode Issues

Org-modeのキモはツリー構造の作成にある.

その抽象を駆使することは💪戦略性に貢献する. 📐自分の強みを自覚したうえで独自の戦略を考え出すというDarkHorseの原則を実践したい.

🐥Org-mode基本用語

  • エントリ
    • アスタリスクで始まる項目全体.
  • 見出し(headline)
    • エントリのアスタリスク行
  • ツリー(tree)
    • 一つのエントリとその配下のエントリ全体.
  • サブツリー(subtree)
    • 一つのエントリにつながるエントリ.

エントリ移動関連

org-archive

M-x org-archive-location(C-c C-x C-a)でエントリをアーカイブできる.

アーカイブ先のファイルは今のファイル名に .org_archiveという名前で新規作成されて保存される.

org-refile

org-refile (C-c C-w) でorg-modeのエントリー(サブツリー)を他の場所へ移動できる.

デフォルトだとカレントバッファ内の第1レベルのエントリ内に移動できる. 移動先の候補は org-refile-targets 変数で変更できる.

(setq org-refile-targets. '((org-agenda-files :maxlevel . 3)))

org-agendaの設定を書くのがよく見る例. 個別フォルダ配下のファイルを設定したいときは, .dir-locales.el を使う方法がある.

ref. 指定した任意のorgファイルへエントリー(サブツリー)を移動する方法

+org/refile with Doom Emacs

Doom Emacs だと +org/refile-xxx という関数でrefileが便利に拡張されている.

  • +org/refile-to-current-file: 現在ファイルのheadlineに移動(C-c l r .)

fileのコンテンツをすべて別のファイルのサブツリーに移動する

Doom Emacsの+org/refile-to-fileを利用する. まずファイルの先頭にbulletをいれることでファイルの中身すべてを一つのアイテムにする. そのあと+org/refile-to-fileを発動させればOk.

org-cut-subtree

エントリのサブツリーをカット. org-refileの代わりにこっちで手動カット&ペーストもあり. org-speed-commandではkで発動.

Org-tree

Orgツリーと見出しの操作.

  • OrgのDocumentにはorg-treeという単語はでてこないようだ.

org-tree Basics

ファイルオープンしたときの制御. 3つの状態がある.

  • SHOW ALL: すべての記述内容を表示
  • OVERVIEW: トップレベルの見出しを表示
  • CONTENT: 特定レベル以上の見出しを表示

nofold 全見せ(初期値) fold 最上位の見出しのみ content 見出しのみ全見せ(引き出し内側は隠す) show everything 全見せ(引き出しの内側も表示)


拡張もある.

org-cycle/org-shiftab(fold/unfold)

  • org-cycle(TAB: 順方向のサイクル)
  • org-shittab(Shift+TAB: 逆方向のサイクル)

org-speed-commandだとcで発動. 戻すとき(shittab)もCで.

org-narrow-to-subtree/widen

M-x org-narrow-to-subtreeで移動ではないがfileに移動したかのように subtreeだけを表示させる. 戻すときは M-x widen.

Doom Emacsだと C-x n sでnarrow/C-x n wでwiden. org-speed-commandだとsで発動. 戻すとき(widen)もsで.

narrowはファイル内検索で役に立つ. 大きなOrgファイルは検索で時間がかかる. treeに検索範囲を限定することで, サクサク動く.

ツリー表示

C-c C-k(outline-show-branch)で配下の見出しのみを表示するように切り替えられる.

C-c C-b(org-show-todo-tree)で, TODOのついたものだけを抜き出し.

✅現在のファイルのTODOをリスト表示するには?

✅Orgサブツリーごとの折りたたみ制御はPROPERTIESのVISIVILITYにfolded

Orgサブツリーごとの折りたたみをするには, org-propertyのVISIVILITYにfoldedを設定することで実現可能.

Fine-tuning subtree visibility in org-mode · Endless Parentheses

see also ✅ファイルを開いたときのデフォルトの見出し階層を設定するには?

✅org-sidebar: Org-modeの見出しをサイドバー表示する

url: https://github.com/alphapapa/org-sidebar

  • org-sidebar-toggle: TODOタスクとScheduleを別バッファに表示.
  • org-sidebar-tree-toggle: orgの見出しをサイドバーに表示.

便利なるのはtree-toggleのほうかな.

✅Org-modeのTODO拡張をハックする(org-todo-keywords)

Org-modeのitemごとにkeywordを冒頭につける.

  • org-todo-keywordsをつかう.
  • fileのヘッダに定義を宣言.

ref. Per-file keywords (The Org Manual)

もしくは複数キーワードのサイクルを定義.

ref. Multiple sets in one file (The Org Manual)

+org/refile-to-current-file

現在の見出しを別のツリーに移動.

org-capture

アイデアを素早くorg-modeのノートにメモするための機能.

howto: Google Chomeの閲覧内容をorg-captureするには?

org-protocolChrome ExtentionのOrg Capture を利用する.

仕組みとしては,Chromeにインストールした拡張機能がorg-protocolというMIME type(アプリケーションを識別する体系)を発行するので,それをemacsclientで受け取って処理をする.

具体的にはemacslicentのデスクトップアプリケーションを作成して,org-protocolを処理するデフォルトアプリケーションでそのアプリケーションを指定.

Manjaro Linuxの例(xfce)

~/.local/share/applications/emacsclient.desktop作成

[Desktop Entry] Name=Emacsclient Exec=emacsclient %u Icon=emacs Type=Application Terminal=false MimeType=x-scheme-handler/org-protocol

~/.config/mimeapps.listに x-scheme-handler/org-protocol=emacsclient.desktop を追記.

update-desktop-databbaseをコマンドラインから実行.

org-captureの設定例.

("p" "browser" entry (file "~/gtd/inbox/inbox.org")
 "* %^{Title}\nSource: %u, %c\n #+BEGIN_QUOTE\n%:initial\n#+END_QUOTE\n\n\n%?")
("L" "browser link" entry (file "~/gtd/inbox/inbox.org")
 "* %? [[%:link][%:description]] \nCaptured On: %U")

ポイントはorg-captureのトリガキーをpとLにすること.これはorg-capture-extensionなのでこれを守らないと動かない.もしくは自分でブックマークレットを作成する.

📝org-babel

org-mode内にコードを埋め込み実行する.

https://github.com/tkf/org-mode/blob/master/lisp/ob-clojure.el

🔖Literate Programming

Basics

  • M-x org-babel-execute-buffer: バッファを全て実行.
  • M-x org-babel-execute-subtree: サブツリー単位でコードを実行.

Howto

実行結果を表示させないためには?

  • “:results none” で 出力抑止.
  • “:results output silent” で minibufferのみに出力.

いろいろ忘れる場合はM-x org-babel-insert-header-argを活用.

画像を出力するには?

:results graphics, fileパスを指定. fileパスはorgファイルからの相対パスになる.

#+begin_src clojure :results graphics file link :file ./../../tmp/line.png
 
#+end_src

コードブロック内にコードブロックをいれる

, #+xxxのところに , を入れる.

ob-restclient

org-modeのファイル上でREST clientをインタラクティブに操作できる.

ある意味最強のREST Client.

うかつに実行したら戻ってきたらが大量のデータた場合にEmacsがハングする.

  • “:results none” で 出力抑止.
  • “:results output silent” で minibufferのみに出力.

🔗References

References

🔧org-export

org-fileを様々なフォーマットにexportする機能. org-exportが省略されてよくoxと表現される.

org-exportにテーマを当てる

手段としては, in-bufferへの#+SETUPFILEのオプションでテーマを指定するか, org-html-headを指定する.

(setq org-html-validation-link nil            ;; Don't show validation link
      org-html-head-include-scripts nil       ;; Use our own scripts
      org-html-head-include-default-style nil ;; Use our own styles
      org-html-head "<link rel=\"stylesheet\" href=\"https://cdn.simplecss.org/simple.min.css\" />")

どうも #+SETUPFILEに対応するようなグローバル変数はないようなので, ファイルを修正せずに一括でオプションを適用したい場合は.dir-locales.elにhook関数を定義する.

((org-mode . ((org-export-before-parsing-functions .
  ((lambda (bach-end)
     (goto-char (point-max))
     (insert "\n#+SETUPFILE: https://fniessen.github.io/org-html-themes/org/theme-readtheorg.setup\n")))))))

org-exportでのbabel無効化

通常は :tangle yes/noでbabelを制御するものの, 以下で無効化する.

(setq org-export-babel-evaluate nil)

org-export時のhook

  • org-export-before-processing-functions
    • 処理の開始時のhook
  • org-export-before-parsing-functions
    • babel 実行後のhook

xxx-hookという関数は非推奨で xxs-functionsを使えとのこと.

org-export-html時のheadのカスタム

HTML_HEAD/HEML_HEAD_EXTRAを設定する. なぜ2つあるのかわからないが, html-headとは別の追加設定を個別に設定したい場合かな?

#+HTML_HEAD: <meta name=”robots” content=”noindex”>

ref. https://orgmode.org/manual/HTML-specific-export-settings.html

Markdownへのexport時にtimestampがHTMLになるのを避ける

Markdownへのexport時にtimestampがHTMLになるのを避けたい

org-publish

org-publish(ox-publish)でサイトを公開. 仕組みとしては, org-exportの拡張で, ディレクトリ配下に再帰的にexport関数をあてていく.

🔧org-speed-command

Org-modeの操作を高速化するOrg-mode(隠し標準?)機能.

なれるまではM-x org-speed-command-helpで使い方確認. ?でヘルプバッファがでる.

ref. org-mode のキーバインド、その先 - Qiita

移動系

  • n: 下のアウトライン. サブ階層があれば内部へ.
  • p: 上のアウトライン
  • f: 下のアウトライン. サブ階層があっても同一階層.
  • b: 上のアウトライン
  • u: 上位のアウトライン.

表示系

  • c: org-cycle見出しのopen/close
    • Cで逆方向.
  • s: narrowing/widening
    • これはいつも忘れる.

🔧org-table

Orgテーブルをcsv出力する

標準関数の org-table-exportをつかう. カーソル位置のテーブルをファイルに出力できる.

org-table-export-default-format のデフォルト値は orgtbl-to-tsv なのでorgtbl-to-csvを設定.

itemのプロパティに設定できる.

\* Section with table

:TABLE_EXPORT_FILE: data/observations.csv :TABLE_EXPORT_FORMAT: orgtbl-to-csv

dayobservation
<2019-11-14 Thu>cold
<2019-11-14 Thu>warm

org-tableで日本語ズレる問題

毎回いい解決策を探しつつ, 結局わかってない.

以下はたまたまTwitterでみつけた解決策. 完全ではないが, 一部直った.

;; https://twitter.com/TomokiYamashit3/status/1539810786612514816
(set-face-attribute 'fixed-pitch nil :font "ricty-20")

org-modeにおけるinternal/external linkについて.

📝Org-roamはorg-linkを超絶便利にするツール.

org-idをつかってinternal linksをする方法.

[[id:hogehoge][xxxx]]

org-linkのorg-modeにおける表示をparse前の素の表示でみせてくれる.

org-mode helper packages

Org-modeを便利にする補助パッケージ.

Org-mode function Tips

いろいろ関数があるものの, 知るとああこれほしかったやつだって関数をメモしていく.

Org-mode Tips

org-modeはなんでもできるので,けっこうヘルプに該当する設定を探すのもタイヘンなのでここに逆引きヘルプをメモしていく.

✅Org-modeのヘルプをEmacsから引くには?

後で調べる.

✅Org-modeの表示がなんかへんなのを1発で直す方法

たまにバグるのかツリー構造のパースができてないのか表示がおかしくなる.

M-x org-mode-restartでorg-modeを当て直すと一発で直る.

もしくは謎のmajor-modeでorg-modeが効いてない場合もあるのでM-x org-modeでモードをあて直す.

✅ファイルを開いたときのデフォルトの見出し階層を設定するには?

変数で全体的な設定をするほうほうとファイル先頭に個別に設定する方法がある.

org-startup-folded変数にパラメータを設定する.

(setq org-startup-folded nil)

nofold 全見せ(初期値) fold 最上位の見出しのみ content 見出しのみ全見せ(引き出し内側は隠す) show everything 全見せ(引き出しの内側も表示)

もしくはfileのメタデータに #+STARTUP: を書く.

showallだとbulletのpropertiesは隠れるが, showeverythingだとpropertiesが開く.


✅Org-mode形式をlive previewするには?

org-exportでHTMLにエクスポートしてWebブラウザで見る.

これを自動化するpackageとしてjakebox/org-preview-htmlがある.


しかし, そもそもOrg-mode自体がlive previewを必要としないような表示になっていてそこはMarkdownに対する有意な点なので必要ないならばlive previewは不要かな?

✅テキストの装飾(Formatting)をかんたんにするには?

M-x org-emphasize(C-c C-x C-f) で選択できる.

  • test Bold
  • test Itaric
  • test Underline
  • test Delete
  • text Code
  • text Smale

✅Org-modeで使用できる言語を増やすには?

org-babel-do-load-languages を使って追加.

(org-babel-do-load-languages
 'org-babel-load-languages
 '((lisp . t)
   (shell . t)
   (clojure . t)))

✅Org-modeの起動時間を短縮するには?

この記事によると, org-babel-load-languages の読み込みに時間がかかっているのでこの改善がビッグイシュー.


と思ったけど, 現状 org-babel-load-languages を覗くとdefaultのemacs-lispと, それ以外のシェルとClojureくらいの4種類しかなかったし遅いと感じてもいなかったのだった…扱う言語が増えたら調整.

(org-babel-do-load-languages
 'org-babel-load-languages
 '((lisp . t)
   (shell . t)
   (clojure . t)))

✅Org-tableの内容をグラフ化するには?(org-plot)

外部プログラムをorg-babelと連携させる方法もあるが, ここではEmacsから直接gnuplotを呼び出す方法をまとめる. org-plotをつかう.

M-x org-plot/gnuplotをorg-table上で呼び出すとwindowが立ち上がってグラフが表示される. #+plotでメタデータを付与することができる.

#+PLOT: set:"xlabel 'Name'" set:"ylabel 'Name'"

https://orgmode.org/worg/org-tutorials/org-plot.html

fileを指定すると, ファイル出力することができる.

#+plot: title:"test" file:"test.png"


なお, gnuplot-modeはgnuplotのREPLにエディタからコードを送信するような使い方なのでちょっと違う.

✅今日の日付を元にしたファイル名を作成するには?

(defun my/create-weekly-org-file (path)
  (expand-file-name (format "%s.org" (format-time-string "%Y-w%W")) path))
(defun my/create-daily-org-file (path)
  (expand-file-name (format "%s.org" (format-time-string "%Y-%m-%d")) path))

Topics

🆎Org-modeで健康管理

itemをrowとして扱ってそのプロパティにデータを入力して, 表とそのexport, gnuplotによる可視化までを自動化.

今まで, 🔧org-tableにデータ入力をするのが面倒だなと思っていたがitemで一日分のデータを管理するのは目からウロコだった.

🏗DailyBuild

🔗References

Insights

✨Org-modeはテキストデータを扱うことには秀でるがテーブルデータがつらい

Org-modeはテキストを扱うことには秀でるが, テーブルデータを扱うのが辛い. csvのようなDBがとてもつらい. Notionにはここでは絶対に勝てない.

もちろん, org-tableという悪魔秘術は秘術はあるものの, それでも辛い.

up: 📁Emacs