テキストエディタにアウトラインを導入して快適なテキスト編集を手に入れる

# はじめに
仕事にせよ趣味にせよ、テキストを書く機会や必要性はそれなりにあると思います。たとえば個人的なメモ、技術や手順の備忘録、README やプロジェクトの各種ドキュメントなどですね。

皆さんはどのようなツールや方法で書いていますか？

本記事では **アウトラインをテキストエディタに導入する** というアイデアとその方法についてご紹介します。

# アウトラインとは？
アウトラインとは **見出し** と **目次** から成るテキスト管理の仕組みです。

見出しとは、章（大見出し）や節（中見出し）に代表されるように **文書を特定の単位でまとめたもの（特にそのタイトル）** を指します。

目次とは **見出しのみを一覧表示したもの** です。

アウトラインという概念は書籍やドキュメントではお馴染みですが、これをテキストエディタにも導入し、操作（特に見出し単位での操作）できるようにすることで、より効率的なテキスト閲覧・編集を実現できます。

# テキストとは
ここまで何回も「テキスト」と連呼していますが、この言葉についてもおさらいしておきましょう。

テキストとは **プレインテキスト（Plain Text）** のことです。言葉で説明するのは難しいのですが、例を挙げると以下になります。

- memo.txt や README.md などテキストエディタで直接編集できるもの
- インタプリタを介してリッチに表示できる記法もある（例：HTML、Markdown、ReST）
- 反対語はリッチテキスト
  - 例: Word、Excel、Powerpoint etc...

そんなプレインテキストですが、（リッチテキストと比べた）メリットは以下のとおりです。

- 動作が軽い
- ファイルサイズが小さい
- 加工が簡単
- どの環境でも見れる

しかし良い点ばかりでもなくデメリットもあります。

- 見出しや目次など文書構造がわかりづらいため、
  - 素早く要点を知ることができない
  - 目的の箇所を探すのが大変（長文だと何度もスクロールする必要がある）

プレインテキストがそのメリットにもかかわらずあまり使われないのは、これらデメリットがあるからだと思います。アウトラインを導入すると、このデメリットを解消できます。

# デモ
ここではアウトラインを導入していない例（Before）と導入した例（After）を比較してみます。

## Before-1
メモ帳で開いたものです。何もハイライトしていません。非常にわかりづらいですね。

![o1_notepad.jpg](https://qiita-image-store.s3.amazonaws.com/0/191170/d18c3f8f-41f6-ec37-48f1-95df20a497d4.jpeg)

## Before-2
VSCode で開いたものです。ハイライトが付いていて見易くなっていますね。ここまで行えている方は多いと思います。

![o2_vscode.jpg](https://qiita-image-store.s3.amazonaws.com/0/191170/b8054285-d64f-c2ad-430d-998744319a10.jpeg)

しかしアウトラインが無いため、長文になると苦しくなってきます。スクロールや検索を駆使して苦労することになるでしょう。

## After
（何のエディタでも構いませんが下図は私が普段使っている）秀丸エディタで開いたものです。

![o3.gif](https://qiita-image-store.s3.amazonaws.com/0/191170/2912c11d-f3eb-cc5b-6a72-6330a2dbe3e1.gif)
Before と比べて以下の点で優れています。

- 目次により **全体構造を把握** できる
- 特定の見出しにジャンプできる
  - **目次をクリックして指定見出しに一発ジャンプ**
  - ショートカットキーで **次/前の見出しに一発ジャンプ**
- 見出し単位で並び替えやコピーを行える

アウトラインを導入したことにより、何も導入されていない、ただのテキストよりも何かと扱いやすくなっています。

# アウトラインを導入する
概要はこのくらいにして、ここからはアウトラインを導入するために必要なテキストエディタの設定を見ていきましょう。

ここではテキストエディタとして（私が愛用する）秀丸エディタを取り上げますが、他のエディタの場合は適宜読み替えてください。

## (まとめ) 必要な設定一覧
わかる方 or 忙しい方向けに「アウトラインの導入に必要な設定」の要点をまとめておきます。

- (1) 記法を決める
  - 例: Markdown, asciidoc, その他Wiki記法や独自記法
- (2) 見出しに相当する機能を探す
  - 例1: 見出し（秀丸エディタ）
  - 例2: シンボル（VSCode, Sublime Text）
- (3) 見出しを認識させる
  - おそらくファイル種類毎に正規表現で指定するはずです
  - 正規表現例: `# 大見出し` → `^(\#)([^\#]+)$`
- (4) 認識した見出しをハイライトさせる
  - これもファイル種類毎にカスタマイズできると思います
- (5) 見出しを俯瞰できる機能を探す
  - 例1: アウトライン（秀丸エディタ）
  - 例2: サイドバー（Vim） ← ただしデフォではサポートされていないのでプラグインを探すか実装する必要アリ
- (6) 見出し単位の操作を探す or 実装する、かつショートカットキーを割り当てる

以下は各手順について詳細を見ていきます。

## (1)記法を決める
「何を以て見出しとするか」に絶対的なルールはありませんが、既に存在する記法を用いた方が何かと汎用的でしょう。

- Markdown（見出しは `# 見出し` と書きます）
- はてな記法（見出しは `* 見出し` と書きます）
- Mediawiki 記法（見出しは `= 見出し =` と書きます）

個人的には Markdown をオススメします。

というのも、Markdown は記法としては非常にシンプルに作られている一方、広く使われておりプレビュー手段も豊富だからです。また表現力についても、太字やリンク表記など基本をサポートしており、よほど堅固なドキュメントでもない限りは通用します。

## (2)見出しに相当する機能を探す
テキストエディタでアウトラインを導入するには、まず見出しを認識させねばなりません。

秀丸エディタだとそのまんま「見出し」という機能があります。他のエディタだと「シンボル」や「関数定義」などと呼ぶことが多いでしょう。

## (3)見出しを認識させる
見出しに相当する機能がわかったところで、次は「どんな文字列パターンを見出しと認識させるのか」という設定が必要になります。

たとえば Markdown 記法では `# 大見出し` や `## 中見出し` のように、行頭にシャープを重ねることで n 階層目の見出しを表現します。これを認識させる必要があります。

**正規表現で指定するケースが多い** と思います。秀丸エディタでは `その他 > ファイルタイプ別の設定 > アウトライン > 解析` のあたりから設定できます。正規表現の例は以下になります。

- `# 大見出し` → `^(\#)([^\#]+)$`
- `## 中見出し`  → `^(\#){2}([^\#]+)$`

他のエディタだとこの辺は多少厄介かもしれません。たとえば Sublime Text だと [設定ファイルを書いて頑張る](http://docs.sublimetext.info/en/latest/reference/symbols.html) ことになります。

## (4)認識した見出しをハイライトさせる
せっかくなので見出しはハイライト（強調表示）させると見易いでしょう。

秀丸エディタの場合は `その他 > ファイルタイプ別の設定 > デザイン > 強調表示` のあたりから設定できます。こちらもやはり正規表現で指定します。

## (5)見出しを俯瞰できる機能を探す
見出しを認識できたところで、次はそれらを要約表示する「目次」に相当する機能も欲しいところです。

秀丸エディタだと **アウトライン解析の枠** がこれにあたります。この機能を使うと、ウィンドウの左端あるいは右端に見出し一覧が表示されます。テキスト全体の構造を俯瞰できるのはもちろん、特定の見出しにジャンプしたり、ドラッグドロップで順番を入れ替えたりすることができてとても便利です。

Vim の場合だと、サイドバーに見出しを表示する何らかのプラグインを導入するか、自分で作ることになると思います。

## (6)見出し単位で操作するショートカットキーを探す
もうひとつ、あると便利なのが「見出し単位の操作」を行えるようにすること、そしてそれをショートカットキー一発で呼び出せるようにすることです。

特に便利なのが **前(次)の見出しに移動** という操作であり、ぜひとも実現したいところです。

私の秀丸エディタでは「Alt + カーソルキー上下」で一つ前後の見出しにジャンプできるようにしてあります。 見出し単位でサクサクスクロールできるので、何万文字/何十万文字の長文テキストもラクラク扱えます。ちなみに設定方法は `その他 > キー割り当て` から「次(前)の見出し」という操作にキーを割り当てる感じです。

# アウトラインを使うワケ
ここまで長々と設定方法について書きましたが、ここで参考までにアウトラインの存在意義や利用価値について書いておきます。

「（他にも編集手段はあるのに）なぜわざわざテキストエディタ上でアウトラインを実現するのか」という点を、Q&A 形式でまとめてみました。

## Q: Word や Powerpoint を使えばいいのでは？
Ans: **不便でストレスが溜まる** ので基本的に使いたくないです。

それらリッチテキストは重たいですし、スクリプトでパースや加工もしづらく、ファイルサイズも大きくて管理しづらい上にバージョン管理もできません。

## Q: 1ファイルに長文を書くのではなく複数ファイルに分割するべきでは？
Ans: 好みの問題だと思います。

私はウィンドウやタブを変えずにアクセスできるので一ファイルに押し込めるのが好きです。小説や書籍データなどもその方が編集しやすいと思います。

しかし1ファイルだと複数箇所を同時に開いて見比べることができない（VSCode や Vim なら割と柔軟にウィンドウ分割できますが）ので不便ではあります。一方、最初から複数ファイルに分割しておくと、エディタウィンドウやタブをその分開くだけでいいので楽です。

## Q: Wiki にガシガシ書けばいいのでは？
Ans: **ブラウザ上のテキストボックスだとストレスが溜まります** （愛用のテキストエディタで編集したいです）。

最近は Wiki も Web サービスも充実しており、下手なエディタよりも書きやすく管理しやすいように仕上がっていますが、個人的にはそれでも愛用テキストエディタの書き心地には遠く及ばないと思います。

逆にテキストエディタに対してこだわりがないなら、最初からそれらを使った方がハッピーかもしれません。ただアウトラインの実現は難しいと思います。

# おわりに
本記事ではアウトラインをテキストエディタに導入するやり方と考え方について紹介してみました。参考になれば幸いです。また「こんなやり方やツールを使っているよ！」等もありましたらぜひ教えてください :smile: