TaskPaperファイルを秀丸で

テキストファイルが好き

……と宣言するほどのことでもないんですが、自分のメモ群は、できればEvernoteみたいなproprietaryなシステムでなく、ずっと使える環境に置いておきたいと考えています。するとどうしてもテキストファイル中心になります。しばらく紙copiを使っていましたが、不具合が多発してきたうえにソフトウェアの更新も滞っているようなので、手放しました。愛用のテキストエディタ秀丸には「ファイルマネージャー枠」というウィンドウを表示させることができ、これだけでかなり紙copiのように使えます。

アウトラインエディタを探して

複数ファイルを見渡すのは秀丸の「ファイルマネージャー枠」でOK。次に求めたのは、アウトラインエディタです。そんなに凝ったものは必要なく、階層付きテキストが扱えれば十分で、これも秀丸がかなえてくれます。設定は「その他」→「ファイルタイプ別の設定」から、こんな感じ。

秀丸 階層付きテキストの設定

すると次のように表示されます。

秀丸 階層付きテキスト

さらにiPhoneでも!

……というわけで秀丸とDropboxでわりと不自由なく過ごしてきたのですが、iPhoneの使用頻度が高まるにつれて、iOSでもWindowsでも透過的に扱えるアウトラインテキストエディタが欲しくなってきました。

ところが階層付きテキストというフォーマットをサポートしているエディタがなかなかありません。結局のところ、下に書くようにTaskPaperというテキストを扱えるアプリに秀丸を合わせることにしました。TaskPaperの画面はこんな感じ。Project、Task、そしてNoteという3種類の要素をサポートしています。さらに@tagのような文字列はタグとして認識され、検索できたりします。この手のアプリは独自フォーマットに情報を格納するか、テキストであってもXMLで編集が面倒だったりするのですが、TaskPaperのファイル形式はテキストエディタでも普通に編集できます。

TaskPaper 

TaskPaper's File Format

TaskPaper's file format is fairly simple. Here's how TaskPaper reads a file:

  • Files are expected to use the UTF-8 encoding and use '\n' to separate lines.
  • A task is a line that begins with a hyphen followed by a space ('- ') which can optionally be prefixed (i.e indented) with tabs or spaces. A task can have zero or more tags anywhere on the line (not just trailing at the end).
  • A project is a line that isn't a task and ends with a colon (':'), or a colon (':\n') followed by a newline. Tags can exist after the colon, but if any non-tag text is present, then it won't be recognized as a project.
  • A note is any line that doesn't match the task or project rules.
  • Indentation level (with tabs, not spaces) defines ownership. For instance, if you indent one task under another task, then it is considered a subtask. Tasks and notes own all objects that are indented underneath them. Empty lines are ignored when calculating ownership.
  • A tag has the form "@tag", i.e. it starts with an "at" character ("@"), followed by a run of non-whitespace characters. A tag can optionally have a value assigned to it. The value syntax immediately follows the tag word (no whitespace between) and is enclosed by parentheses: '(' and ')'. The value text inside can have whitespace, but no newlines. Here is an example of a tag with a value: @tag(tag's value)

(TaskPaper User’s Guide)

上記の定義では不明瞭な点をいくつか補足します。

  • '- abc:'のようにTaskとProjectの定義が重なった行は、Taskとして認識されます(上記左画面のTask3:という行を参照)。
  • '@tag:'のようにタグとProjectの定義が重なった行は、タグとして認識されます(上記左画面の@tag2:が右画面でtag2:というタグとして認識されています)。
  • @tag(tag's value)なんて使わないよ、と思うのですが、ときどきアプリが自動的にValueを追記してしまいます。たとえば左画面の下には、TaskとNoteに@doneタグを付けてArchiveした行があります。それぞれの行に付いている@project(PJT @tag1 A @tag2 @tag3)というタグは、Archiveの際にアプリが自動的に付与したものです。

上記の定義を参考に、一応は秀丸 a la TaskPaperな強調表示定義を作れました。上のTaskPaperで開いていたファイルを秀丸で読み込んだのが下の画面です。

秀丸 a la TaskPaper 1

左画面のツリーと右画面のテキストは個別に折りたためます。下は右画面の3-8行目を折りたたんだところ。

秀丸 a la TaskPaper 2

TaskPaper風表示のための強調表示定義

上記の設定のため、「その他」→「ファイルタイプ別の設定」にて、新しく.taskpaper用の設定を作りました。

1. 強調表示を決定する

最初に、色を付ける対象を定義します。TaskPaperではProjectが太字、Taskが普通の字、Noteが薄い色の字(太さは普通)、そして@doneとタグされた行全体には取り消し線が入ります。秀丸では強調表示として取り消し線をかけることはできませんので、@doneを含む行色を薄くしようと思います。その代わりといっては何ですが、タグに色を付けて目立つようにしましょう。また未完了のタスクを目立たせたいので、下線を付します。まとめると次のようなイメージです。

  • 普通の文字Noteは薄い色の字で(ただし @tag だけは色付き)
  • 特に強調表示1Projectは濃く太い字で(ただし @tag だけは色付き)← ツリー表示の対象
  • 特に強調表示2Taskは普通の字+下線で(ただし @tag だけは色付き)←ツリー表示の対象
  • 特に強調表示3】@done 以外の @tag には目立つ色を付けて(太さは普通)
  • 特に強調表示4@done を含むProject、Task、Noteは薄い字で(@tagも含めて)

文字や行に色を付けるには、「その他」→「ファイルタイプ別の設定」→デザイン(設定の対象)を選んでいくと現れる「場所の一覧」画面を使います。上のリストの【】内は、この画面で定義されている場所の名前です。

Noteは、ProjectでもTaskでもないすべての行です。要するに地の文ですので、【普通の文字】そのものを薄くしてしまいます。

【特に強調表示1~4】は、最後の数字が大きいほど優先順位が高くなっています。タグにProjectやTaskよりも高い優先順位を与えておけば、ProjectやTaskに含まれるタグだけに別の色を付けることが可能です。さらにdoneタグを含む行にはすべてを塗りつぶす最高の優先順位を与えます。あまり薄くしても読めなくなってしまうので、Noteと同じ色にしておきました。したがってNoteに@doneを付けても色は変わりません。

なお【強調表示】でなく【特に強調表示】を選んだ理由は後述します。結果的にはどちらでもOKでした。

2. 強調表示を特定の箇所に割り当てる

「その他」→「ファイルタイプ別の設定」→「デザイン→強調表示」(設定の対象)で、強調表示させる箇所を割り当てるルールを正規表現によって定義します。先のリストにしたがって説明します。

Noteは地の文なので設定はありません。

Projectはけっこう面倒です。
Project A: であれば、行末のコロンを探せばよいので、正規表現では :$ です。ただし、
Project A: @abc @def のようにコロンの後にタグを複数置けるので、 :( @\S+)*$ のように拡張しなければなりません。さらに
Project A: @abc(tag's value) @def のようにタグが値を持つ場合を考慮すると :( @[^ \t(]+(\(.*?\))?)*$ が必要です。
行全体にマッチさせたいので、コロンの前に .* を付けてできあがり。
自分でも忘れてしまいそうなので、主要な要素毎に分解して解説しておきます:

.+       ← 改行以外の字が1文字以上
:        ← コロン
(        ← パターン1(タグにマッチ)開始
 @       ← スペースと@
[^ \t(]+ ← ' '・タブ・'('以外の文字が1文字以上
(        ← パターン2開始(タグの値にマッチ)開始
\(.*?\)  ← '('から最初の')'まで。?は「ものぐさ指定」
)?       ← パターン2が0あるいは1回
)*       ← パターン1の0回以上のくり返し
$        ← 行末

TaskはProjectに比べるとシンプルで、基本的には行頭にタブが0個以上入った後の '- ' を検知すればよいので '^\t*- ' となります(定義ではスペースも '- ' の前に来られるので、厳密には '^[\t ]*- ' )。
行全体に下線を引きたいので、'^\t*- .*$' としてマッチの幅を広げます。
この状態では、行頭のタブ部分にも下線が入ります。それも見やすいのですが、ちょっとうるさくなるので (?<=^\t*)- .*$  として消しました。(?<=abc)xyz とすると、abcxyzにマッチさせつつxyzだけをヒット文字列として返してくれます。

次にタグ。Projectの中でタグを識別したやり方とでほとんど同じですが、@の直前には半角スペースに加えてタブが来る場合(Noteの冒頭にタグを置く)と何もない場合(第一階層のプロジェクトの行頭にタグを置く)があるので、@の前に ’(^|\t| )’ を付けて、(^|\t| )@[^ \t(]+(?=(\(.*?\))?) のようになります。タグの値を (?= ) で囲んでいるのは、タグの値を強調表示したくなかったからです

最後にdoneタグを含む行。行頭から行末までのどこかにスペースかタブで区切られた@doneという文字列がある行を探すには、 .*(^| |\t)@done($| |\t).* でした。

以上のルールを定義した画面を下に貼っておきます。

秀丸 強調表示

3. ツリー表示の定義

「その他」→「ファイルタイプ別の設定」→「アウトライン→解析」(設定の対象)で、ツリー表示のノードにする対象を割り当てます。ここで、強調表示の種類が「行の強調表示N」か「特に強調表示N」であれば、もう一度正規表現を書かなくても、たとえば「『特に強調表示2』で表示している行はツリー表示せよ」という指定ができます。最初に「強調表示N」でなく「特に強調表示N」を選んだ理由はそこにあったのですが、実際に「特に強調表示1」つまりProjectと「特に強調表示2」つまりTaskをツリー表示させてみると、困ったことが起きました。doneタグを付けた行がツリーから消えてしまうのです。そうか、普通のタグは行の一部分が「特に強調表示3」になるだけなので問題ありませんが、doneタグをつけると行の全体が「特に強調表示4」で上書きされてしまうので、ツリーの表示対象から外れてしまうのですね。doneタグはNoteにも付ける可能性があるので、「特に強調表示4」をツリーの表示対象とするわけにはいきません。

そこで重複感はありますが、ツリー表示させる対象も正規表現で指定することにしました。

Projectは「特に強調表示1」と同じ。Taskはシンプルに ^\t*- でOKです。それぞれの定義のプロパティ画面の中で「インデントの深さでレベルを決める」にチェックを入れておくことで、行頭のタブの数に応じた階層が再現されます。

秀丸 アウトライン解析

作業ディレクトリをDropboxと同期させておけば、1つのテキストファイルをWindows PCでもiPhoneでも透過的に編集できます。

ここまでの設定を強調表示定義ファイルにまとめておきます。どなたかのご参考になれば。

»» TaskPaper.hilight

その他のオススメの設定
  • タブの文字数【「その他」→「ファイルタイプ別の設定」→「体裁→タブ」(設定の対象)】
    3階層ぐらいは使うことを考えると、8では大きすぎます。2か4がよいかと思います。
  • 自動インデント【「その他」→「ファイルタイプ別の設定」→「体裁→インデント」(設定の対象)】
    インデントされた行でリターンキーを押すと、新しい行にもインデントを挿入してくれます。同一レベルでTaskやNoteをたくさん作るときに便利。
  • 行頭のタブ文字で段落全体をインデントする【同上】
    コンテンツが複数行にわたるとき、2行目以降も先頭行に合わせてインデントしてくれます。TaskPaperと同じ挙動ですね。見やすいので常時ONでよいかと。

 


友達に伝える
作成: 2013/9/26 by:koji
更新: 2013/9/29 by:koji


テキストファイルでタグを管理する

Tech

XOOPS Cube Legacy cheat sheet

新規ユーザー登録(無料)

  • メールニュース[週刊起-動線]の購読
  • コメントなどの投稿
  • ココロミの利用
  • 一部コンテンツの購読

ログイン

コメント

タグ(キーワード)