org-mode

概要

org-modeはEmacsの機能の1つ。独自のアウトライン形式.orgを扱うためのインターフェースを提供する。Emacsのkiller appの一角で、根強い人気がある。

  • キーボードにフォーカスしたアウトライン操作
  • プロジェクト管理
  • 時間計測
  • 脚注
  • PDF、HTMLなどの各種形式への変換(Insomniaはこの変換を使ってビルドしている)
  • コードの実行、実行結果の文書内への挿入
  • シンタックスハイライト
  • タグを使用した検索

などが可能。

Memo

pandocでディレクトリ内のorgファイルを1つのPDFにする

sudo apt install pandoc texlive-lang-japanese texlive-latex-extra texlive-luatex
sudo apt install librsvg2-bin # SVG
pandoc -s test.org -o te2st.pdf --pdf-engine=lualatex -V documentclass=ltjsarticle -V luatexjapresetoptions=morisawa
mkdir -p pdf
find ./ -name "*.org" -type f -exec sh -c 'echo ${0}; pandoc "${0}" -o "pdf/${0%.org}.pdf" --toc -N --pdf-engine=lualatex -V documentclass=ltjsarticle -V luatexjapresetoptions=morisawa && echo ok' {} \;
sudo apt install pdftk
pdftk *.pdf cat output merge.pdf

見積もり時間

C-c C-x e で見積もり時間を設定できる。見積もり時間を設定すると、モードラインの残り時間の横に表示される。[0:51/03:00]という感じ。

easy templates

  • <q tag でquote blockを展開できる
  • <s tag でsource code blockを展開できる

orgエレメントの情報を取得する

org-modeをパースした結果が保持されているので、APIによって簡単に扱うことができる。

(org-element-context)

(src-block (:language emacs-lisp :switches nil :parameters :results raw :begin 530 :end 622 :number-lines nil :preserve-indent nil :retain-labels t :use-labels t :label-fmt nil :value (org-element-context) :post-blank 1 :post-affiliated 553 :caption (((細かい情報を取得できる))) :parent nil))

org-modeが各エレメントをどのように扱っているか少し想像がつく。

(org-element-type (org-element-context))

src-block

orgファイルからkeywordsを取得する

(org-collect-keywords)を使うとorgファイルの情報を取得できる。

(defun org-roam-db–file-title () “In current Org buffer, get the title. If there is no title, return the file name relative to `org-roam-directory’.” (org-link-display-format (or (cadr (assoc “TITLE” (org-collect-keywords ’(“title”)))) (file-name-sans-extension (file-relative-name (buffer-file-name (buffer-base-buffer)) org-roam-directory)))))

(defun org-roam-db-insert-file ()

メモをつける

タスクの状態が遷移したときに、メモを開く設定ができる。

:PROPERTIES:
:LOGGING:  lognoterepeat
:END:

プロパティ挿入

特殊な意味をもつ、大文字で構成されるさまざまなプロパティが存在する。 EXPORTシリーズ、CUSTOM_ID、ID…。

C-c C-x p で挿入できる。

直前のタスクで再度計測

C-c C-x C-i (org-clock-in) でタスク計測できる。

直前のタスクで再度計測するときは、 C-c C-x C-x (org-clock-in-last) で可能。 https://orgmode.org/manual/Clocking-commands.html

clock-inが動くだけで、org-pomodoroはinvokeしない。

見出しのリンクを挿入する

Org-roamで見出しへのファイル内リンクを貼りたいとき。

org-store-link (C-c l) で、見出しのリンクを取得する。このとき見出しのIDが生成される。これを消すと辿れなくなるので注意。

org-insert-link (C-c C-l) で、貼り付ける。

タグをつける

C-c C-c で見出しにタグを挿入できる。 WIPとかつけるようにすると便利そう。 基本的なカテゴリは階層で、一時的な状態はタグでやるようにするのがよさそう。

C-c / m で検索できる。

可変幅と等幅フォント

Emacsはテキストエディタなので、文字表示のほとんどは等幅フォントだ。が、 org-modeでは自然言語の文章なので、幅の違うフォントのほうが読みやすい。

zzamboni.org | Beautifying Org Mode in Emacsの設定がとても良い。

  • M-qでインデントの形に文章を整形する
  • variable-pitch-modeが可変幅にするmode
  • variable-pitch-modeだけだとコードブロックも可変になっちゃうので、コードブロックなどのfaceも変更する

org-alertで通知する

spegoraro/org-alert: System notifications of org agenda items org-alertでDEADLINEが近い見出しを通知できる。 期限設定していても、通知されなければ忘れる。 スケジュール管理に使うのであれば必須か。

babelのヘッダーを挿入する

ヘッダーでbabelの実行結果のオプションを変えることができる。

#+BEGIN_SRC emacs-lisp :result outputs
(concat "hello" "world")
#+END_SRC

で実行すると標準出力が挿入される。

手書きは忘れやすいのでコマンドでやる。 コードブロック上で C-c C-v j :: org-babel-insert-header-arg

わかりやすい説明。 org-modeのコードブロック(Babel)の使い方 | Misohena Blog

babelで結果をそのまま表示する

適用させたい見出しレベルのproperty内で、↓追加する。

:header-args+: :results output

動作の違い。

[1, 2]
1 2
p [1, 2]
[1, 2]

org-protocolを設定する

Chrome拡張としてある。ここのReadmeに書いてあるコマンドを実行する。

  • emacsclientをorg-protocolのハンドラとして登録する。たぶんプロトコルと対応するアプリケーションを選ぶ、という処理だろう。httpのときはブラウザを起動する、みたいな
cat > "${HOME}/.local/share/applications/org-protocol.desktop" << EOF
[Desktop Entry]
Name=org-protocol
Exec=emacsclient %u
Type=Application
Terminal=false
Categories=System;
MimeType=x-scheme-handler/org-protocol;
EOF

そして↓。Linux MintでもOKだった。

update-desktop-database ~/.local/share/applications/

OSの設定は完了。Emacsの設定を追加する。template名をちゃんと設定する+ディレクトリが存在しないと起動しない。

(setq org-capture-templates `(
    ("p" "Protocol" entry (file+headline ,(concat org-directory "notes.org") "Inbox")
        "* %^{Title}\nSource: %u, %c\n #+BEGIN_QUOTE\n%i\n#+END_QUOTE\n\n\n%?")
    ("L" "Protocol Link" entry (file+headline ,(concat org-directory "notes.org") "Inbox")
        "* %? [[%:link][%:description]] \nCaptured On: %U")
))

Chromeに拡張機能をインストールしてクリックすると、Emacsが立ち上がる。

org-protocolでプロンプトを出さないようにする

Linux Mint, Chromeにて。 org-protocolを設定できても、ドメインごとでxdg-openを許可しますかプロンプトが出るので面倒。 ポリシーを変更することで出さないようにする。

設定ポリシーは、chrome://policy/ で確認できる。最初は何もない。 ↓実行する。

sudo mkdir -p /etc/opt/chrome/policies/managed/ && echo '{ "URLAllowlist": ["org-protocol://*"] }' |sudo tee /etc/opt/chrome/policies/managed/whitelist.json

chrome://policy/ に表示されるのを確認する(再読込が必要)。 org-protocol使用時にプロンプトが出なくなる。

エクスポートしないタグ

C-c C-qnoexport を指定するとその場所はエクスポートされない。

Tasks

TODO org-lintをCIで実行する

org-lint をディレクトリに対して行う方法。

TODO ファイルごとの形式を正規化する

見出しにけっこうズレがある。そういうのを検知するLintがあるはずだ。

Example

チェックリスト

C-c でチェックできる。

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

脚注

これが脚注1である。 定義はどこに書いてもいい。 出力時にはFootnotesのアウトラインが作られてそこに挿入される。

Reference

zzamboni.org | Beautifying Org Mode in Emacs

かなりいい感じに表示する設定。

Archives

CLOSE exampleを完成させる

どういう意味なのか、全く思い出せない。 ああ、org-modeの使用例のページを作るということか。 別にいらないだろう。実際の例で示せばいい。

DONE denoteを調べる

roamだと時系列、ブログ的に表現しにくいので、denoteを調べる。ほとんどは分野別ファイルで問題ないが、たまに必要なときがある。いい感じだ。

denoteリンクをHTMLエクスポートする方法がわからない。エラーになる。 リネームするときは denote-rename-file を使う。

DONE Agenda Viewの整理

予定関係をうまく使えてない。

  • effort表示をorg-agendaでできるようにした
    • 目標値だけで、今どれくらいやったのかはわからないのが若干ビミョーだが…
  • 週タスクを決めるためのビュー
    • TODO一覧を見る
    • 今週やると決めたものにeffortを設定する
  • 今日(週)やることのビュー
    • 週のscheduleの一覧が表示される
    • 今日やることをWIPにして開始
    • 2つ表示しようとしたが、面倒だったのでやめた
    • scheduledがうまく設定できず。まああまり先に設定してもやらないので、まあやらなくていい。せいぜい今週がわかればいい
    • effortでのフィルタはできたので、週にやりたいものはeffortを設定することにする

Footnotes:

1

The link is: https://orgmode.org