tree-view-mode

# tree-view-mode.el
  拙作 tree.el によって表示したディレクトリ・ツリーを折り畳んで表示できる閲覧モードです。

  以前[此処](https://qiita.com/s-fubuki/items/87ae322ba99879452427)で公開した tree.el に、  データセーブや閲覧機能などをチョコチョコと追加拡張していたのですが、  公開するために整理してまとめてみました。

  以前公開していたものとはカスタマイズ変数名等が変わっているので、  使っていた人は注意してください。 これについては後述します。

![tree-sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239081/4ef1b678-39af-5fa3-2482-4fc628da7a6f.png)


# インストール
  例によって[此処](http://github.com/s-fubuki/tree-view-mode/)から `tree.el` と `tree-view-mode.el` を DL し
  `load-path` の通ったディレクトリに置いて、  必要に応じバイト・コンパイル等します

  そして init.el 等に以下を加えます。

```
  (require 'tree-view-mode)
```
:::note info
Emacs 28 のネイティブ・コンパイル機能は環境を整えていないためまだ試していません。
:::

# 基本的な使い方 

  以下のように起動してディレクトリ名を入力すると、  ディレクトリツリーが折り畳まれた状態で表示され表のような操作ができます。

```emacs-lisp:mini-buffer
M-x tree
```

1. 基本的には TAB を叩いていけば次々にディレクトリの中を見ていけるようなデザインにしてあります。
1. isearch すると折り畳みされていてもマッチ箇所が開きます。
1. ミゲモは問題なく使える場合とそうでない場合があるようです。(ascii 文字列サーチでマッチハイライトが暴れて引っかかる感じ?)

|Key|機能|
|:--|:--|
| space or n                   | 次の行                                                      |
| BS or p                      | 前の行                                                      |
| <                            | 前のディレクトリ                                            |
| >                            | 次のディレクトリ                                            |
| s                            | ポイントのあるディレクトリを開く                            |
| h                            | ポイントのあるディレクトリを閉じる                          |
| i                            | ポイントのあるディレクトリを開閉する                        |
| TAB                          | ディレクトリを開閉し次の行へ                                |
| S-TAB                        | TAB のほぼ逆方向動作                                        |
| C-c C-s                      | ポイントのディレクトリの枝をすべて開く                      |
| C-c C-h                      | ポイントのあるディレクトリ以外すべて閉じる                  |
| S                            | すべてのディレクトリを開く                                  |
| H                            | すべてのディレクトリを閉じる                                |
| w                            | ポイントのファイル名をキルリングにコピー(prefix でフルパス) |
<!--
| M-x tree-buffer-to-list-file | 現在バッファ表示しているツリーをデータとしてセーブ          |

:::note info
表示されている情報だけを使うので、既存ディレクトリなら tree-list-write を使った方が正確な stat も保存されるのでいいです。
:::
-->

:::note info
旧版ではプレフィクス起動するとインライン挿入されましたが、それは廃止し C-u 0 M-x tree でフラット表示するようになっています。単なるプレフィクスは何かのために取ってあります。
:::

# tree.el 側でのカスタマイズ
  `User Option` tree-options

  以下のシンボルから必要なものをリストで並べてセットしておくと、  その機能がアクティブになります。
  3列目は eshell からの起動時オプションで対応するキャラクタです。

|Symbol| 機能| eshell|
|:------|:--------------------:|:-:|
| size  | ファイルサイズの表示 | s |
| date  | タイムスタンプの表示 | d |
| quote | ファイル名をクォート | Q |
| dir   | ディレクトリオンリー | D |

```emacs-lisp:sample
(setq tree-options '(size date quote))
```

:::note info
旧版の `tree-option-d`, `tree-option-Q` の機能がひとつにまとめられています。
:::

# eshell について
  eshell からも tree で使えるようにしてあります。
  オプションは `tree -sd`  のように通常のシェルコマンド風に指定します。

  eshell から起動するときは `tree-eshell-options` の値をデフォルトのオプションで使います。
  デフォルトではこの変数に `tree-options` の値がそのままセットされます。

# tree のデータ化やコンバート等
## DIR のツリーをリスト FILE にする
 `Command` tree-list-write dir file

## ツリー TEXT を リスト FILE にする
 `Command` tree-text-to-list-file text file

## ツリー・リストのデータ FILE をツリーとしてバッファに表示
 `Command` tree-buffer-display FILE

## dired でポイントしているツリー・リスト・ファイルから REGEXP をサーチ
 `Command` dired-tree-search regexp

# もっさり
## tree-view-mode: 巨大なファイルだと重いです
  Overlay で折り畳みしていますが、  Directory の数だけ Overlay を作るので
  2万ディレクトリくらいある tree file のように、  あまりに Directory が多いと生成時間に加えバッファ操作も重くなり動作に現れます。
  ですが、しばらく操作を続けていると普通に動くようになってきます。
  よくわかりませんが Emacs が内部で Overlay 検索の最適化をするのかもしれません。

## ツリー・テキストをスキャンしてリスト化する場合
   空のディレクトリの場合ディレクトリとして認識ができずファイルになってしまいます。

# テスト環境
Win10 or Win11
1. GNU Emacs 29.0.50 (build 1, x86_64-w64-mingw32) of 2022-04-03
1. GNU Emacs 28.1 (build 2, x86_64-w64-mingw32) of 2022-04-22