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のついたものだけを抜き出し.
✅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-protocol と Chrome 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
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
- 🔗Web操作手順書を自動生成!Emacs org-babelで実現するRun Book Automation(RBA) | Futurismo
- 🔗org-babel と R の組み合わせがとても心地よい件 | Futurismo
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")))))))
- Build Your Website with Org Mode - System Crafters
- Org-modeでhtml exportの際のthemeについて | A perfect autumn day
- https://github.com/fniessen/org-html-themes
- Generating a site from org-mode files - Kraken of Thought
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関数をあてていく.
- Publishing (The Org Manual) - org-mode公式
- Org-roam User Manual - org-roam公式
- How I publish my wiki with org-publish
- Publishing Org-mode files to HTML
🔧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
day observation <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-link
org-modeにおけるinternal/external linkについて.
📝Org-roamはorg-linkを超絶便利にするツール.
org-idによるinternal links
org-idをつかってinternal linksをする方法.
[[id:hogehoge][xxxx]]
org-toggle-link display
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が開く.
- refs.
- Initial visibility (The Org Manual)
- org-modeのファイルを開いた時の挙動が変わっていた
- org-mode v9.4から挙動が変わったとのこと.
✅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
testDeletetext
Codetext
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 の読み込みに時間がかかっているのでこの改善がビッグイシュー.
- ref. 🔗org-modeの起動時間を短縮する(org-babel-load-languages編)
- see also. org-babel(ob)
と思ったけど, 現状 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にエディタからコードを送信するような使い方なのでちょっと違う.
- Org-mode(Emacs)から直接gnuplotでグラフを出力する方法について
- https://github.com/emacs-gnuplot/gnuplot
- Emacs の gnuplot-mode で gnuplot を快適に | ゴルディアスの涙目
✅今日の日付を元にしたファイル名を作成するには?
(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で一日分のデータを管理するのは目からウロコだった.
- EmacsConf 2022: Health data journaling and visualization with Org Mode and GNUplot - David O’Toole - YouTube
- https://gitlab.com/dto/health-template
🔗References
Insights
✨Org-modeはテキストデータを扱うことには秀でるがテーブルデータがつらい
Org-modeはテキストを扱うことには秀でるが, テーブルデータを扱うのが辛い. csvのようなDBがとてもつらい. Notionにはここでは絶対に勝てない.
もちろん, org-tableという悪魔秘術は秘術はあるものの, それでも辛い.
🔗Related
up: 📁Emacs