Emacsはカスタマイズ性に優れたテキストエディタになります。GNUプロジェクトの一部として開発されています。Lispベースの言語(Emacs Lisp)を使って、ユーザーが機能を自在にカスタマイズできます。
この記事では、主にインストール方法やEmacsのOrgモードについて紹介します。
目次
インストール方法
Emacs は推奨パッケージとして mailutils がインストールされます。
mailutils がインストールされると、インストール時に postfix の設定をする必要があり、少し面倒です。
単純なエディタとして使いたい場合、メール設定は不要なので、--no-install-recommends オプションを利用して、Emacs をインストールします。
1 |
sudo apt install --no-install-recommends emacs |
また、emacs の日本語環境のためにはemac-mozcをインストールしておく必要があります。
1 |
sudo apt emacs-mozc |
mozcとはgoogle日本語入力のオープンソース版になります。
Linux環境で日本語を入力できるようにするにはibus-mozcまたはfcitx5-mozcをインストールします。emacs-mozcでもibus-mozcでもfcitx5-mozcでも結局はバックグラウンドではmozc-serverが動作します。mozc-serverまでのインタフェースがそれぞれ異なり、そこで使い勝手が変わってきます。
ibus-mozcはRedHat社が支援しており、Ubuntu, Fedora等でデスクトップ環境がGNOME系である環境で安定していて、日本語環境を標準インストールする際にインストールされています。 fcitx5-mozcはibus-mozcと比べて、高速で軽量であることを特徴としてKDEや軽量デスクトップ環境で安定していて人気があるとされています。 また、emacs-mozcはemacs環境で日本語入力を行うためのパッケージになります。emacs環境で日本語入力を行う場合はemacs-mozcが必要です。
1 |
sudo apt install ibus-mozc |
または
1 |
sudo apt install fcitx5-mozc |
設定ファイル
以下の設定ファイル(~/.emacs.d/init.el)では以下の項目のことをしています。
- use-packageを使えるようにする。
- 起動時のメッセージをオフ
- バックアップファイルを作らない
- オートセーブをしない
- japanese-mozcで日本語入力ができるようにする
- インクリメントサーチでもjapanese-mozcで日本語入力ができるようにする
Emacsで日本語を利用できるするようには、設定を追加する必要があります。内容に日本語を利用する場合と、インクリメントサーチに日本語を利用する場合で、それぞれ設定が必要です。また、ここでは特別なキーバインド設定は特に行っていません。
動作確認もしていますが、ChatGPTなどを利用して作成しています。以下の設定を利用する場合は自己責任でお願いします。
~/.emacs.d/init.el
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
(require 'package) ;; パッケージアーカイブの設定(MELPAを使えるように) (setq package-archives '(("melpa" . "https://melpa.org/packages/") ("gnu" . "https://elpa.gnu.org/packages/"))) (package-initialize) ;; 初回のみ: use-package がインストールされていなければインストール (unless (package-installed-p 'use-package) (package-refresh-contents) (package-install 'use-package)) ;; 常に自動でインストールするように設定 (require 'use-package) (setq use-package-always-ensure t) (setq inhibit-startup-message t) (setq make-backup-files nil) (setq auto-save-default nil) (set-language-environment "Japanese") (prefer-coding-system 'utf-8) (use-package mozc :ensure t :custom (default-input-method "japanese-mozc")) (use-package mozc-im :ensure t :after mozc :init :config (setq default-input-method "japanese-mozc-im") ) |
emacsの簡単な操作
ここでは本当は Emacs のキーボード操作の方法を記述すべきなのかもしれませんが、GUI版の Emacs ではメニューバーが充実しています。最初の基本的な操作はメニューバーから操作をしてもいいかもしれません。そして、慣れてきたらキーボード操作でできるようになるといいでしょう。
唯一、慣れていない状態でも覚えておくべきキーボード操作は Ctrl+g だと思います。Ctrl+g は操作の中断になります。Ctrl+g を覚えておけば、何かをミスして操作できなくなったときに元の操作まで抜けることができる可能性が高いです。Vim での Esc キーに近い役割です。
メニューバーの表示非表示の一時的な切り替えは M-x menu-bar-mode でできます。
メニューバーの表示非表示の永続的な設定は init.el に以下の行のいずれかを追加することで設定できます。
1 2 |
(menu-bar-mode -1) ; メニューバーを非表示にする (menu-bar-mode 1) ; メニューバーを表示に戻す |
Orgモード
デフォルトの状態では設定されていない、Org モードの推奨設定があります。
1 2 3 |
(global-set-key (kbd "C-c l") #'org-store-link) (global-set-key (kbd "C-c a") #'org-agenda) (global-set-key (kbd "C-c c") #'org-capture) |
Org モードは .org の拡張子のファイルで自動的に起動します。それ以外の拡張子で Org モードを利用するにはファイルの最初の行に以下のような行を追加し読み込み直して起動させます。 Org モードになっている状態ではメニューバーに Org や Table のメニューが追加されます。そちらでもある程度の操作ができます。
1 |
MY PROJECTS -*- mode: org; -*- |
Org モードはまず基本として以下のような見出しで構成します。
1 2 3 |
* 見出しレベル1 ** 見出しレベル2 *** 見出しレベル3 |
このような見出しの行に対して、Todo やスケジューリング等の様々な機能ができます。
Todo
Todo は以下のような見た目になります。このような見た目にするキーワードはキーボード操作で簡単に追加できます。
1 2 |
* TODO 買い物に行く * DONE 本を読む |
操作 | 説明 |
---|---|
S-right / S-left | Todo の状態を変更 (または TODO を追加) |
C-c C-t | Todo の状態を変更 (または TODO を追加) |
M-RET | 新しい見出しを作成(現在の見出しの下に) |
M-S-RET | Todo キーワードを付けて新しい見出しを作成(現在の見出しの下に) |
M-up/down | 見出しのサブツリー単位の移動 |
M-S-up/down | 見出しの移動 |
M-left/right | 見出しのレベルの上げ下げ |
M-S-left/right | 見出しのサブツリー単位のレベルの上げ下げ |
また、Todo のキーワードの設定はカスタマイズが可能です。
1 |
(setq org-todo-keywords '((sequence "TODO" "WAITING" "DONE"))) |
ファイル毎に個別に設定する場合はファイルの先頭に
1 2 3 4 5 6 7 8 9 10 |
#+TODO: TODO(t) | DONE(d) #+TODO: REPORT(r) BUG(b) KNOWNCAUSE(k) | FIXED(f) #+TODO: | CANCELED(c) * item [0/3] [0%] ** TODO a ** BUG b *** KNOWNCAUSE c ** TODO d *** REPORT e |
TODO のリストを出すための補完をするためのキーは M-TAB ですが、Windows だとマルチウインドウの切り替えとシステムのショートカットキーと競合しています。これを回避する方法として、Microsoft の PowerToys をインストールし、Keyboard Manager でキーを別のキーに割り当て、Emacs でそのキーを利用して、補完機能を使う方法があります。
以下は Windows 側で無変換キーを F14 に割り当てた後に、Emacs 側で無変換+TAB のキーで補完機能が利用できるように割り当てた例になります。Emacs 側では、F14 はよくわかりませんが KF86Launch5 として認識されるようです。
1 |
(global-set-key (kbd "<XF86Launch5> TAB") 'completion-at-point) |
スケジューリング
スケジューリングは以下のような見た目になります。スケジューリングに関する行もキーボード操作で簡単に追加できます。ただし、スケジューリングのための日付設定はキーボード操作である程度できますが直接書き直したほうが早いかもしれない場合もあります。また、SCHEDULED: とDEADLINE: の順番は機能的には特に意味はありません。
1 2 3 |
* TODO レポートを出す SCHEDULED: <2025-05-05 月> DEADLINE: <2025-05-06 火> |
操作 | 説明 |
---|---|
C-c C-s | スケジュールを追加(予定日) |
C-c C-d | 締切を追加 |
アジェンダモード
アジェンダモードを利用するにはinit.elに以下のようにアジェンダモードで使用するファイルを設定する必要があります。
1 |
(setq org-agenda-files '("~/org/todo.org" "~/org/projects.org")) |
ファイルのリストではなく、特定のディレクトリ全体を指定する場合 directory-file-recursively を利用できます。2つ目の引数は正規表現で .org ファイルを指定しています。 \\ はEmacs Lispのエスケープシーケンスで、正規表現のパターンで \. の形にし、. の一文字に一致します。 Emacs で新規で org ファイルを作成する場合は読み込み時に org ファイルが存在しないのでファイル保存後に開き直し、設定を読み直す必要があります。
1 |
(setq org-agenda-files (directory-files-recursively "~/org" "\\.org$")) |
操作 | 説明 |
---|---|
C-c a | org-agenda を起動(事前にコマンドを設定する必要有り) |
org-agenda を起動する場合、さらに追加でコマンドを入力してアジェンダビューとしてそれぞれの画面に遷移できます。
操作 | 説明 |
---|---|
a | アジェンダ一覧 |
t | TODO の一覧表示 |
m | タグによる検索 |
s | テキスト検索 |
q | アジェンダの終了 |
アジェンダビューはキーを入力して操作できます。ここではアジェンダビューの操作は多くあるため、使いやすい一部の操作を紹介します。
操作 | 説明 |
---|---|
q | アジェンダビューの終了 |
r | 再読み込み(refresh) |
t | TODOの状態を変更 |
, | 優先度を変更 |
スケジューリングのアジェンダビューについては以下の操作があります。
操作 | 説明 |
---|---|
d または v d | 日表示 |
w または v w | 週表示 |
v m | 月表示 |
v y | 年表示 |
v SPC | 表示のリセット |
j | 日付ジャンプ |
f | 次の期間 |
b | 前の期間 |
. | 今日に移動 |
アジェンダビューでの操作でその他の表示に関するものは以下の操作があります。
操作 | 説明 |
---|---|
o | 他のウィンドウを削除 |
SPC | アイテムの元の位置を別のウィンドウに表示 |
TAB | 別のウィンドウでアイテムの元の場所へ移動 |
RET | アイテムの元の場所に戻り、他のウィンドウを削除 |
C-c C-x b | 現在の項目のサブツリー全体を間接バッファに表示 |
リスト
リストとして箇条書きリストと番号付きリストがあります。また、見出しの例のようにリストは階層を作ることができます。
1 2 3 4 5 6 7 8 |
- りんご - みかん + バナナ * ぶどう 1. 牛乳を買う 2. パンを買う 3. 卵を買う |
操作 | 説明 |
---|---|
TAB | リスト内でインデント(入れ子に) |
S-TAB | アウトデント(戻す) |
M-S-RET | 同じ階層のリスト項目を追加 |
M-up / M-down | 項目を上下に移動 |
アルファベットのリストを許すには設定を追加する必要があります。
1 |
(setq org-list-allow-alphabetical t) |
設定すると以下のように利用できます。
1 2 |
a. 項目A b. 項目B |
チェックリスト
チェックリストは以下のような見た目になります。
1 2 3 4 |
* TODO 買い物リスト - [ ] 牛乳 - [x] パン - [ ] 卵 |
操作 | 説明 |
---|---|
M-RET | 新しい見出しを作成(現在の見出しの下に) |
S-M-RET | 空欄のチェックボックスがある設定された新しい見出しを作成(現在の見出しの下に) |
C-u C-c C-c | チェックボックスのない場合にチェックボックスの作成 |
C-c C-c | チェックボックスの切り替え |
リンク
リンクはHTML(より近いのはマークダウンでのリンク)のようなリンクテキストを作成できます。作成方法は以下のようにし、正しく記述できるとテキストに下線が引かれたリンクテキストを作成できます。 リンクはemacsの新しいバッファで開くことができます。
1 2 |
[[https://example.com][表示名]] [[file:~/memo.txt]] |
操作 | 説明 |
---|---|
C-c C-o | リンクを開く |
表
表は以下のような見た目になります。
1 2 3 4 |
| 名前 | 点数 | |-----+-----| | 太郎 | 80 | | 花子 | 90 | |
表の作成
操作 | 説明 |
---|---|
C-c | | 表の作成または表へ変換(アクティブ領域を指定。区切り文字は全行にあるTABまたはカンマで判断。存在しない場合は空白) |
C-u C-c | | カンマ区切り(csv)を表へ変換 |
C-u C-u C-c | | TAB区切り(tsv)を表へ変換 |
C-u C-u C-u C-c | | 区切り文字にマッチする正規表現で表へ変換 |
表のデータ間の移動
操作 | 説明 |
---|---|
C-c C-c | 表の調整 |
TAB | 表を調整し、次のフィールドに移動 |
S-TAB | 表を調整し、前のフィールドに移動 |
RET | 表を調整し、次の行に移動 |
M-a | 現在のフィールドの先頭または前のフィールドに移動 |
M-e | 現在のフィールドの末尾または次のフィールドに移動 |
列データや行データの移動
操作 | 説明 |
---|---|
M-LEFT | 現在の列を左に移動 |
M-RIGHT | 現在の列を右に移動 |
M-UP | 現在の行を上に移動 |
M-DOWN | 現在の行を下に移動 |
表の編集
操作 | 説明 |
---|---|
C-c - | 現在の行の下に水平線を挿入 |
M-S-LEFT | 現在の列を削除 |
M-S-RIGHT | ポイント位置に新しい列を挿入。ポイント位置にあった列から右側の列はすべて右に移動 |
M-S-UP | 現在の行または水平線を削除 |
M-S-DOWN | 現在の行の上に新しい行を挿入 |
C-c ^ | 表の行をソート 行の範囲は最も近い水平区切り線の間、または表全体 ポイントの位置はソートに使用する列 コマンド実行後にソートの種類(abc順、数値順、時間順、独自関数)を選択 |
表の転置やインポート・エクスポート
操作 | 説明 |
---|---|
M-x org-table-transpose-table-at-point | テーブルを転置し、水平線を削除 |
M-x org-table-import | ファイルを表としてインポート 表はタブまたは空白で区切る必要がある |
M-x org-table-export | 表をファイルにエクスポート 表はデフォルト動作ではタブで区切られる |
クロック
クロックは以下のような見た目になります。
1 2 3 4 5 6 7 |
** TODO タスク2 :PROPERTIES: :Effort: 2:00 :END: :LOGBOOK: CLOCK: [2025-05-10 Sat 05:39]--[2025-05-10 Sat 05:43] => 0:04 :END: |
タイマーの利用
操作 | 説明 |
---|---|
C-c C-x C-i | クロックイン(Clock in) ← 開始 |
C-c C-x C-o | クロックアウト(Clock out) ← 終了 |
C-c C-x e | 作業の見積もり時間を設定 |
C-c C-x C-e | クロック中の作業での見積もり時間を再設定 |
C-c C-x C-d | 今日のクロックの集計表示 |
クロックテーブル
操作 | 説明 |
---|---|
M-x org-clock-report | クロックテーブルを挿入 |
C-c C-x x clocktable | クロックテーブルを挿入(ブロックの生成) |
C-c C-x x columnview | カラムビューを挿入(ブロックの生成) |
M-x org-id-get-create | idプロパティを生成 |
C-c C-x p | プロパティを設定、コマンド後にプロパティ名とプロパティ値を要求 |
クロックテーブルが挿入されるとscopeがsubtreeで生成されます。
1 2 3 4 5 6 7 8 |
#+BEGIN: clocktable :scope subtree :maxlevel 2 #+CAPTION: Clock summary at [2025-05-10 Sat 17:12] | Headline | Time | | |--------------+--------+------| | *Total time* | *1:00* | | |--------------+--------+------| | \_ タスク4 | | 1:00 | #+END: |
基本的に1つのファイルに1つのクロックテーブルで運用するような形でscopeはfileにしたほうが扱いやすい運用ができると思います。
1 2 3 4 5 6 7 8 9 10 11 12 |
#+BEGIN: clocktable :scope file :maxlevel 2 #+CAPTION: Clock summary at [2025-05-10 Sat 17:18] | Headline | Time | | |--------------+--------+------| | *Total time* | *2:06* | | |--------------+--------+------| | 作業 | 2:06 | | | \_ タスク1 | | 1:01 | | \_ タスク2 | | 0:04 | | \_ タスク3 | | 0:01 | | \_ タスク4 | | 1:00 | #+END: |
:formula %で時間の割合が表示できます。:formulaは:formula "@1$3=string(\"sub time \")"のように使うと#+TBLFM: @1$3=string("sub time ")の行を挿入できますが、:formula %と併用ができず、#+TBLFMの行を入れるほどの計算もあまり利点がないため、:formula %でのみで運用したほうがよいと思います。
1 2 3 4 5 6 7 8 9 10 11 12 |
#+BEGIN: clocktable :scope file :maxlevel 2 :formula % #+CAPTION: Clock summary at [2025-05-10 Sat 17:20] | Headline | Time | | % | |--------------+--------+------+-------| | *Total time* | *2:06* | | 100.0 | |--------------+--------+------+-------| | 作業 | 2:06 | | 100.0 | | \_ タスク1 | | 1:01 | 48.4 | | \_ タスク2 | | 0:04 | 3.2 | | \_ タスク3 | | 0:01 | 0.8 | | \_ タスク4 | | 1:00 | 47.6 | #+END: |
:compact tでコンパクトな表示ができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#+BEGIN: clocktable :scope file :maxlevel 2 :formula % :compact t #+CAPTION: Clock summary at [2025-05-10 Sat 17:30] | Headline | Time | sub time | |--------------+--------+----------| | *Total time* | *2:06* | 100.0 | |--------------+--------+----------| | 作業 | 2:06 | 100.0 | | \_ タスク1 | 1:01 | 48.4 | | \_ タスク2 | 0:04 | 3.2 | | \_ タスク3 | 0:01 | 0.8 | | \_ タスク4 | 1:00 | 47.6 | #+TBLFM: @1$3=string("sub time ") #+END: |
見積もりのプロパティを設定した場合はカラムビューを利用するとよいです。カラムビューを利用するには見出しにプロパティのIDとCOLUMNSを設定すると使いやすいです。 プロパティ値は直接記述できますが、コマンドを利用してもよいでしょう。M-x org-id-get-createでIDを自動生成でき、C-c C-x pでプロパティの設定ができます。 プロパティの設定はプロパティ名だけ設定をし、後から直接記述してもいいかもしれません。 C-C C-x x columnviewでカラムビューのひな形を作成し、scopeにidを設定し、C-c C-cで再計算するとCOLUMNSで設定した列を表示してくれます。
1 2 3 4 5 |
* TODO 作業 :PROPERTIES: :ID: 992438f3-9c36-4e65-b172-301bfe50c7d7 :COLUMNS: %50ITEM(Task) %Effort(Estimated){:} %CLOCKSUM(Clocked) %5TODO :END: |
上のような見出しに対して、カラムビューを作ると以下のような表ができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#+BEGIN: columnview :hlines 2 :id "992438f3-9c36-4e65-b172-301bfe50c7d7" | Task | Estimated | Clocked | TODO | |--------+-----------+---------+------| | 作業 | 3:00 | 2:06 | TODO | |--------+-----------+---------+------| | タスク1 | | 1:01 | TODO | |--------+-----------+---------+------| | タスク2 | 2:00 | 0:04 | TODO | |--------+-----------+---------+------| | タスク3 | 1:00 | 0:01 | TODO | |--------+-----------+---------+------| | タスク4 | | 1:00 | TODO | #+END: |
計算列が必要ならCOLUMNSプロパティに列を追加し、
1 2 3 4 5 |
* TODO 作業 :PROPERTIES: :ID: 992438f3-9c36-4e65-b172-301bfe50c7d7 :COLUMNS: %50ITEM(Task) %Effort(Estimated){:} %CLOCKSUM(Clocked) %TimeDifference %5TODO :END: |
#+TBLFMを利用して計算すればよいでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#+BEGIN: columnview :hlines 2 :id "992438f3-9c36-4e65-b172-301bfe50c7d7" | Task | Estimated | Clocked | TimeDifference | TODO | |--------+-----------+---------+----------------+------| | 作業 | 3:00 | 2:06 | -00:54:00 | TODO | |--------+-----------+---------+----------------+------| | タスク1 | | 1:01 | 01:01:00 | TODO | |--------+-----------+---------+----------------+------| | タスク2 | 2:00 | 0:04 | -01:56:00 | TODO | |--------+-----------+---------+----------------+------| | タスク3 | 1:00 | 0:01 | -00:59:00 | TODO | |--------+-----------+---------+----------------+------| | タスク4 | | 1:00 | 01:00:00 | TODO | #+TBLFM: $4=$3-if("$2"!="nan",$2,0);T #+END: |
Emacsのセッション間でクロックの履歴を保存したい場合は、以下の設定をinit.el等に追加します。クロックイン後にEmacsを終了して、Clockのログが中途半端な状態で終了した後にもう一度、Emacsを起動した後にクロックを再開するかどうかを尋ねられるようになります。 GUI版のEmacsを終了するときにクロックアウトをして保存するかどうか尋ねられますが、それはNoを選んで終了し再開させます。
1 2 3 |
(setq org-clock-persist 'history) (org-clock-persistence-insinuate) (setq org-clock-persist t) |
タグ
タグはタスクや見出しに付けるラベルで、後で検索・フィルタに使えます。 見出しの行末に :tag1:tag2: のように記述されます。見出しの上の階層によって設定されたタグは継承されます。
1 2 3 4 5 |
* TODO プログラムを作成する :program: ** TODO プログラムを設計 :design:designer: ** TODO プログラムを実装 :implementation:programmer: ** TODO プログラムをテスト :test:tester: ** TODO プログラムをデプロイ :deploy:operator: |
また、0階層にタグを設定するようにファイル内の全ての見出しにタグを設定するような記述もできます。
1 |
#+FILETAGS: :work:worker: |
タグを記述するときに簡単な補完機能が欲しい場合は、まず、#+TAGSを設定し、ファイルを読み直したら、ミニバッファの画面からタグを選択して補完できるようになります。 波括弧で囲むと排他的なタグとして扱うことができます。
1 2 3 4 5 |
#+TAGS: { @work(w) @home(h) } #+TAGS: { laptop(l) pc(p) } #+TAGS: aaa(a) bbb(b) ccc(c) * 書類を書く :@work:laptop:aaa:bbb: |
角括弧を使うと階層構造を持ったグループ化することができます。タグを継承関係を使わずにグループ化されているタグで検索にマッチできます。
1 2 3 |
#+TAGS: [ program : design implementation test deploy ] * TODO design :design: |
操作 | 説明 |
---|---|
C-c C-q | タグ追加/編集 |
C-c C-c | タグ追加/編集(タグ設定として利用する場合 C-c C-q と同じ) |
C-c \ | タグ検索 |
/ | Agendaでタグフィルタ |
コメント
# から行末までがコメント扱いで、コメント行はAgendaなどに影響しません 。
1 |
# これはコメントです |