2007年10月5日金曜日

Emacsのアウトライン機能を使いこなす

 論文を書くときや小説やシナリオを書くときなど、ある程度構造的な文章を書く場合、アウトライン機能は大変便利な機能です。これがないと作業出来ないという人もいるでしょう。

 ubuntuでも独立したアウトラインプロセッサソフトもいくつかありますが、エディタに内蔵されているアウトライン機能は普通のテキストでシームレスにアウトライン機能が利用できるのが最大の特徴でしょう。反対にアウトライン専用ソフトは独自のファイル形式でエディタ内蔵よりもはるかに複雑な装飾が出来るものが多いです。

 Emacsでアウトライン機能を使うには、M-x outline-mode とすることでアウトラインモードになり、各見出しが色付されて表示されます。

 emacsではアウトラインの見出しは行頭に「」アスタリスクを付けることで見出しとします。
 *見出し
 **小見出し
 ***小小見出し
こんな感じですね。

 もちろんこの見出し記号は自由に変えることも可能です。

基本的な操作方法

すべての本文を折り畳むC-c C-t
最上位の見出しだけにするC-c C-q
すべてを展開するC-c C-a
カーソル位置の見出しの本文を折り畳むC-c C-d
カーソル位置の見出しの本文を展開するC-c C-s

これぐらい覚えておけば大丈夫でしょう。

●見出しだけを別ウィンドウに表示しておきたい

 アウトライン機能ですから、見出しだけを別ウィンドウに表示させ、常に文章全体の構造を把握しておきたい、という場合もあるでしょう。
 そういうときは、間接バッファ機能を使います。~/.emacs に以下を追記します。

(defun outtree ()
"outline-tree
見出しを別ウィンドウで表示させる.
by yama @ Thu Mar 29 23:37:45 2007"
(interactive)
(if 'outline-mode (outline-mode))
(hide-body)
(let* ((basename (princ (buffer-name)))
(newtmp (concat basename "-tree")))
(if (get-buffer newtmp)
(unless (get-buffer-window newtmp)
(split-window-vertically 10)
(switch-to-buffer newtmp)
(other-window 1))
(progn
(make-indirect-buffer (current-buffer) newtmp)
(split-window-vertically 10)
(switch-to-buffer newtmp)
(if 'outline-mode (outline-mode))
(hide-sublevels 1)
(other-window 1)))))
M-x outtree で別ウィンドウに見出しだけが表示されます。


●もうちょっと便利に

Ee - Emacs Information Manager というelispパッケージがあるのですが、こいつは何でもかんでも階層化して表示しちゃおうというもので、その中に ee-outline というのがあります。
 階層化して表示するわけですから、とうぜんoutline-modeとの相性もいいです。

インストール

ubuntuのリポジトリにはないみたいなので直接取ってきます。
wget http://www.jurta.org/emacs/ee/emacs-ee-0.0.2.tar.gz
tar zxvf emacs-ee-0.0.2.tar.gz
mv emacs-ee-0.0.2 ee
mv ee ~/.lisp
として~/.lisp/ee に放り込み、~/.emacs に以下を追記してloadpathを通します。
(setq load-path (cons "~/.lisp/ee" load-path))
そしてさらに~/.emacsに以下を追記します。
;;====================================
;;; Ee - Emacs Information Manager
;;===================================
(require 'ee-autoloads)

;; アウトラインの該当個所を表示
;; ee のアウトライン表示で該当箇所を別ウィンドウに表示できる.
(defadvice previous-line
(after ee activate)
(if (and (eq major-mode 'ee-mode)
(string-match "ee-outline" (buffer-name (current-buffer))))
(ee-outline-display-buffer)))

(defadvice next-line
(after ee activate)
(if (and (eq major-mode 'ee-mode)
(string-match "ee-outline" (buffer-name (current-buffer))))
(ee-outline-display-buffer)))

(defadvice ee-view-record-select-or-expansion-show-or-hide
(around ee-delete-window activate)
(if (and (eq major-mode 'ee-mode)
(string-match "ee-outline" (buffer-name (current-buffer))))
(progn
ad-do-it
(delete-other-windows))
ad-do-it))

(defun my-ee-outline ()
"事前にoutline-modeを起動してからee-outlineにする"
(interactive)
(outline-mode)
(ee-outline))

;; C-c o で起動。
(global-set-key "\C-co" 'my-ee-outline)

使い方

  • C-c o でアウトラインのツリー表示が表示されます。
  • カーソルを動かすことで画面が縦に分割され、該当する部位が逐次表示されます。
  • カーソルの左右で折りたたみ、展開。
  • 該当見出しでリターンキーでその場所を開きます。あるいは o キーでフォーカスが移動します。
  • h キーでヘルプが出ます。


もっともっと便利にっ

これ以上の便利さを追求すると、アウトライン機能のみならず、ToDoやスケジュール、リンク機能を備え、一人WiKiまで出来ちゃう org-mode がいいかもしれません。アウトライン機能のキー設定も TAB キー一つで折り畳み、展開が行え、各見出しの並び替えなども楽にできるようになっています。

導入は emacs22 以降なら標準で入っていますので、 M-x org-mode とするだけです。

詳しい使い方は、何しろ機能が豊富過ぎて説明しきれません。幸いマニュアルを翻訳してくれている方がいますのでそちらを参照してください。

0 件のコメント: