├── .dir-locals.el
├── .github
├── stale.yml
└── workflows
│ └── build.yml
├── .gitignore
├── Cask
├── Changelog.org
├── Extensions.org
├── LICENSE
├── Makefile
├── README.org
├── icons
└── default
│ ├── asciidoc.png
│ ├── audio.png
│ ├── babel.png
│ ├── bookmark.png
│ ├── buffer-group-closed.png
│ ├── buffer-group-open.png
│ ├── c.png
│ ├── cabal.png
│ ├── clojure.png
│ ├── conf.png
│ ├── css.png
│ ├── dart.png
│ ├── direnv.png
│ ├── docker.png
│ ├── elx-light.png
│ ├── elx.png
│ ├── emacs.png
│ ├── erlang.png
│ ├── error.png
│ ├── git.png
│ ├── go.png
│ ├── gradle.png
│ ├── haskell.png
│ ├── html.png
│ ├── hy.png
│ ├── image.png
│ ├── info.png
│ ├── jar.png
│ ├── jinja2.png
│ ├── js.png
│ ├── json.png
│ ├── julia.png
│ ├── kotlin.png
│ ├── ledger.png
│ ├── lock.png
│ ├── markdown.png
│ ├── nix.png
│ ├── ocaml.png
│ ├── pdf.png
│ ├── php.png
│ ├── project.png
│ ├── puppet.png
│ ├── purescript.png
│ ├── python.png
│ ├── racket.png
│ ├── rust.png
│ ├── sbt.png
│ ├── scala.png
│ ├── scons.png
│ ├── shell.png
│ ├── svgrepo
│ ├── README.txt
│ ├── briefcase.png
│ ├── cal.png
│ ├── close.png
│ ├── dir-docs-closed.svg
│ ├── dir-docs-open.svg
│ ├── dir-git-closed.png
│ ├── dir-git-closed.svg
│ ├── dir-git-open.png
│ ├── dir-git-open.svg
│ ├── dir-github-closed.svg
│ ├── dir-github-open.svg
│ ├── dir-src-closed.png
│ ├── dir-src-closed.svg
│ ├── dir-src-open.png
│ ├── dir-src-open.svg
│ ├── dir-test-closed.png
│ ├── dir-test-closed.svg
│ ├── dir-test-open.png
│ ├── dir-test-open.svg
│ ├── house.png
│ ├── inbox.png
│ ├── list.png
│ ├── mail-plus.png
│ ├── mail.png
│ ├── repeat.png
│ ├── screen.png
│ └── suitcase.png
│ ├── systemd.png
│ ├── tags-closed.png
│ ├── tags-leaf.png
│ ├── tags-open.png
│ ├── tex.png
│ ├── ts.png
│ ├── txt.png
│ ├── vagrant.png
│ ├── video.png
│ ├── vsc
│ ├── README.txt
│ ├── access.png
│ ├── ai.png
│ ├── alaw.png
│ ├── angular.png
│ ├── ansible.png
│ ├── antlr.png
│ ├── any.png
│ ├── apache.png
│ ├── apple.png
│ ├── appveyor.png
│ ├── arduino.png
│ ├── ascript.png
│ ├── asm.png
│ ├── asp.png
│ ├── autohk.png
│ ├── babel.png
│ ├── bat.png
│ ├── bazel.png
│ ├── binary.png
│ ├── bower.png
│ ├── bundler.png
│ ├── cargo.png
│ ├── cert.png
│ ├── cfscript.png
│ ├── class.png
│ ├── cmake.png
│ ├── cobol.png
│ ├── cpp.png
│ ├── cpph.png
│ ├── cucumber.png
│ ├── cython.png
│ ├── delphi.png
│ ├── deps.png
│ ├── diff.png
│ ├── dir-binary-closed.png
│ ├── dir-binary-closed.svg
│ ├── dir-binary-open.png
│ ├── dir-binary-open.svg
│ ├── dir-closed.png
│ ├── dir-docs-closed.png
│ ├── dir-docs-closed.svg
│ ├── dir-docs-open.png
│ ├── dir-docs-open.svg
│ ├── dir-git-closed.svg
│ ├── dir-git-open.svg
│ ├── dir-github-closed.png
│ ├── dir-github-closed.svg
│ ├── dir-github-open.png
│ ├── dir-github-open.svg
│ ├── dir-images-closed.png
│ ├── dir-images-closed.svg
│ ├── dir-images-open.png
│ ├── dir-images-open.svg
│ ├── dir-open.png
│ ├── dir-private-closed.png
│ ├── dir-private-closed.svg
│ ├── dir-private-open.png
│ ├── dir-private-open.svg
│ ├── dir-public-closed.png
│ ├── dir-public-closed.svg
│ ├── dir-public-open.png
│ ├── dir-public-open.svg
│ ├── dir-services-closed.png
│ ├── dir-services-closed.svg
│ ├── dir-services-open.png
│ ├── dir-services-open.svg
│ ├── dir-src-closed.svg
│ ├── dir-src-open.svg
│ ├── dir-temp-closed.png
│ ├── dir-temp-closed.svg
│ ├── dir-temp-open.png
│ ├── dir-temp-open.svg
│ ├── dir-test-closed.svg
│ ├── dir-test-open.svg
│ ├── django.png
│ ├── dlang.png
│ ├── editorcfg.png
│ ├── elm.png
│ ├── elx.png
│ ├── erb.png
│ ├── eslint.png
│ ├── excel.png
│ ├── font.png
│ ├── fortran.png
│ ├── fsharp.png
│ ├── fsproj.png
│ ├── godot.png
│ ├── graphql.png
│ ├── helm.png
│ ├── jar.png
│ ├── java.png
│ ├── jenkins.png
│ ├── jupyter.png
│ ├── key.png
│ ├── less.png
│ ├── license.png
│ ├── lisp.png
│ ├── locale.png
│ ├── log.png
│ ├── lua.png
│ ├── make.png
│ ├── manifest.png
│ ├── maven.png
│ ├── meson.png
│ ├── nginx.png
│ ├── nim.png
│ ├── npm.png
│ ├── org.png
│ ├── patch.png
│ ├── perl.png
│ ├── perl6.png
│ ├── pgsql.png
│ ├── phpunit.png
│ ├── pip.png
│ ├── pkg.png
│ ├── plsql.png
│ ├── pp.png
│ ├── prettier.png
│ ├── prolog.png
│ ├── protobuf.png
│ ├── r.png
│ ├── rake.png
│ ├── reason.png
│ ├── root-closed.png
│ ├── root-open.png
│ ├── ruby.png
│ ├── scss.png
│ ├── sql.png
│ ├── sqlite.png
│ ├── swagger.png
│ ├── swift.png
│ ├── terraform.png
│ ├── toml.png
│ ├── vim.png
│ ├── wasm.png
│ ├── xml.png
│ ├── yarn.png
│ └── zip.png
│ ├── vue.png
│ ├── warning.png
│ └── yaml.png
├── screenshots
├── dired-icons.png
├── disable-project.png
├── filewatch.gif
├── git-commit-diff.png
├── git.gif
├── hydra.png
├── icon-resize.gif
├── indent-guide-block.png
├── indent-guide-line.png
├── mouse-drag.gif
├── mouse-interface.gif
├── open-files.gif
├── right-click.png
├── screenshot.png
├── workspace-edit.gif
└── workspace-edit.png
├── src
├── elisp
│ ├── treemacs-annotations.el
│ ├── treemacs-async.el
│ ├── treemacs-bookmarks.el
│ ├── treemacs-compatibility.el
│ ├── treemacs-core-utils.el
│ ├── treemacs-customization.el
│ ├── treemacs-dom.el
│ ├── treemacs-extensions.el
│ ├── treemacs-faces.el
│ ├── treemacs-file-management.el
│ ├── treemacs-filewatch-mode.el
│ ├── treemacs-follow-mode.el
│ ├── treemacs-fringe-indicator.el
│ ├── treemacs-git-commit-diff-mode.el
│ ├── treemacs-header-line.el
│ ├── treemacs-hydras.el
│ ├── treemacs-icons.el
│ ├── treemacs-interface.el
│ ├── treemacs-logging.el
│ ├── treemacs-macros.el
│ ├── treemacs-mode.el
│ ├── treemacs-mouse-interface.el
│ ├── treemacs-peek-mode.el
│ ├── treemacs-persistence.el
│ ├── treemacs-project-follow-mode.el
│ ├── treemacs-rendering.el
│ ├── treemacs-scope.el
│ ├── treemacs-tag-follow-mode.el
│ ├── treemacs-tags.el
│ ├── treemacs-themes.el
│ ├── treemacs-treelib.el
│ ├── treemacs-visuals.el
│ ├── treemacs-workspaces.el
│ └── treemacs.el
├── extra
│ ├── treemacs-all-the-icons.el
│ ├── treemacs-evil.el
│ ├── treemacs-icons-dired.el
│ ├── treemacs-magit.el
│ ├── treemacs-mu4e.el
│ ├── treemacs-persp.el
│ ├── treemacs-perspective.el
│ ├── treemacs-projectile.el
│ └── treemacs-tab-bar.el
└── scripts
│ ├── treemacs-count-mail.py
│ ├── treemacs-dirs-to-collapse.py
│ ├── treemacs-find-ignored-files.py
│ ├── treemacs-git-commit-diff.py
│ ├── treemacs-git-status.py
│ └── treemacs-single-file-git-status.py
└── test
├── checkdock.el
├── testdir1
└── testdir2
│ └── testdir3
│ ├── testfile.el
│ └── testfile.org
└── treemacs-test.el
/.dir-locals.el:
--------------------------------------------------------------------------------
1 | ((emacs-lisp-mode
2 | (indent-tabs-mode . nil)
3 | (tab-width . 2))
4 | (git-commit-mode
5 | (git-commit-major-mode . git-commit-elisp-text-mode)))
6 |
--------------------------------------------------------------------------------
/.github/stale.yml:
--------------------------------------------------------------------------------
1 | daysUntilStale: 60
2 | daysUntilClose: false
3 | exemptLabels:
4 | - pinned
5 | - security
6 | staleLabel: stale
7 | markComment: >
8 | This issue has been automatically marked as stale because it has not had
9 | recent activity (this bot only works as a reminder, it will not close issues).
10 | closeComment: false
11 |
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: CI Build
2 | on: [ push, pull_request ]
3 | env:
4 | CI: "true"
5 | jobs:
6 | test:
7 | runs-on: ubuntu-latest
8 | strategy:
9 | fail-fast: false
10 | matrix:
11 | emacs_version:
12 | - 28.1
13 | - 28.2
14 | - 29.1
15 | - 29.2
16 | - 29.3
17 | - 29.4
18 | # - snapshot FIXME disabled due to bytecode overflow errors during compilation
19 | steps:
20 | - name: Install Emacs
21 | uses: purcell/setup-emacs@master
22 | with:
23 | version: ${{ matrix.emacs_version }}
24 | - name: Install Cask
25 | uses: conao3/setup-cask@master
26 | with:
27 | version: 'snapshot'
28 | - name: Install Aspell
29 | run: sudo apt-get install -y aspell
30 | - name: Checkout treemacs
31 | uses: actions/checkout@v2
32 | with:
33 | repository: Alexander-Miller/treemacs
34 | path: treemacs
35 | - name: Cask Install
36 | run: cask --path treemacs install
37 | - name: Checkdoc
38 | run: make -C treemacs checkdoc
39 | - name: Compile
40 | run: make -C treemacs compile
41 | - name: Test
42 | run: make -C treemacs test
43 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.elc
2 | /.cask/
3 | /performance-test/
4 | /Extensions.el
5 |
--------------------------------------------------------------------------------
/Cask:
--------------------------------------------------------------------------------
1 | (source gnu)
2 | (source melpa)
3 |
4 | (package-file "src/elisp/treemacs.el")
5 |
6 | (development
7 | (depends-on "dash")
8 | (depends-on "s")
9 | (depends-on "ht")
10 | (depends-on "ace-window")
11 | (depends-on "all-the-icons")
12 | (depends-on "pfuture")
13 | (depends-on "hydra")
14 | (depends-on "cfrs")
15 | (depends-on "evil")
16 | (depends-on "projectile")
17 | (depends-on "magit")
18 | (depends-on "persp-mode")
19 | (depends-on "perspective")
20 | (depends-on "with-editor")
21 | (depends-on "buttercup")
22 | (depends-on "el-mock")
23 | (depends-on "ert-runner"))
24 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | .POSIX:
2 |
3 | MAKEFLAGS += k
4 | CASK = cask
5 | EMACS ?= emacs
6 |
7 | NO_LOAD_WARNINGS = --eval "(defvar treemacs-no-load-time-warnings t)"
8 | SRC_DIR = src/elisp
9 | EXTRA_DIR = src/extra
10 | EMACSFLAGS = -Q -batch -L $(SRC_DIR) $(NO_LOAD_WARNINGS)
11 | COMPILE_COMMAND = --eval "(setq byte-compile-error-on-warn t)" -f batch-byte-compile
12 | CHECKDOC_COMMAND = -l "test/checkdock.el"
13 | LINT_DIR = /tmp/treemacs
14 | LINT_FLAG = --eval "(setq byte-compile-dest-file-function (lambda (f) (concat \"$(LINT_DIR)\" (file-name-nondirectory f) \"c\")))"
15 | TEST_COMMAND = buttercup -L $(SRC_DIR) -L $(EXTRA_DIR) -L . $(NO_LOAD_WARNINGS)
16 |
17 | ELS = $(SRC_DIR)/treemacs.el
18 | ELS += $(SRC_DIR)/treemacs-annotations.el
19 | ELS += $(SRC_DIR)/treemacs-async.el
20 | ELS += $(SRC_DIR)/treemacs-bookmarks.el
21 | ELS += $(SRC_DIR)/treemacs-compatibility.el
22 | ELS += $(SRC_DIR)/treemacs-core-utils.el
23 | ELS += $(SRC_DIR)/treemacs-customization.el
24 | ELS += $(SRC_DIR)/treemacs-diagnostics.el
25 | ELS += $(SRC_DIR)/treemacs-dom.el
26 | ELS += $(SRC_DIR)/treemacs-extensions.el
27 | ELS += $(SRC_DIR)/treemacs-faces.el
28 | ELS += $(SRC_DIR)/treemacs-file-management.el
29 | ELS += $(SRC_DIR)/treemacs-filewatch-mode.el
30 | ELS += $(SRC_DIR)/treemacs-follow-mode.el
31 | ELS += $(SRC_DIR)/treemacs-fringe-indicator.el
32 | ELS += $(SRC_DIR)/treemacs-git-commit-diff-mode.el
33 | ELS += $(SRC_DIR)/treemacs-header-line.el
34 | ELS += $(SRC_DIR)/treemacs-hydras.el
35 | ELS += $(SRC_DIR)/treemacs-icons.el
36 | ELS += $(SRC_DIR)/treemacs-interface.el
37 | ELS += $(SRC_DIR)/treemacs-logging.el
38 | ELS += $(SRC_DIR)/treemacs-macros.el
39 | ELS += $(SRC_DIR)/treemacs-mode.el
40 | ELS += $(SRC_DIR)/treemacs-mouse-interface.el
41 | ELS += $(SRC_DIR)/treemacs-persistence.el
42 | ELS += $(SRC_DIR)/treemacs-project-follow-mode.el
43 | ELS += $(SRC_DIR)/treemacs-rendering.el
44 | ELS += $(SRC_DIR)/treemacs-scope.el
45 | ELS += $(SRC_DIR)/treemacs-tag-follow-mode.el
46 | ELS += $(SRC_DIR)/treemacs-tags.el
47 | ELS += $(SRC_DIR)/treemacs-themes.el
48 | ELS += $(SRC_DIR)/treemacs-visuals.el
49 | ELS += $(SRC_DIR)/treemacs-treelib.el
50 | ELS += $(SRC_DIR)/treemacs-workspaces.el
51 | ELS += $(EXTRA_DIR)/treemacs-all-the-icons.el
52 | ELS += $(EXTRA_DIR)/treemacs-evil.el
53 | ELS += $(EXTRA_DIR)/treemacs-icons-dired.el
54 | ELS += $(EXTRA_DIR)/treemacs-magit.el
55 | ELS += $(EXTRA_DIR)/treemacs-persp.el
56 | ELS += $(EXTRA_DIR)/treemacs-perspective.el
57 | ELS += $(EXTRA_DIR)/treemacs-projectile.el
58 | ELS += $(EXTRA_DIR)/treemacs-tab-bar.el
59 | ELCS = $(ELS:.el=.elc)
60 |
61 | .PHONY: test compile checkdoc clean lint prepare clean-start .prepare-lint
62 |
63 | .ONESHELL:
64 |
65 | %.elc: %.el
66 | @printf "Compiling $<\n"
67 | $(CASK) exec $(EMACS) $(EMACSFLAGS) $(COMPILE_COMMAND) $<
68 |
69 | compile: prepare $(ELCS)
70 |
71 | .cask: Cask
72 | @echo Updating external dependencies...
73 | @$(CASK) install
74 | @$(CASK) update
75 | @touch .cask
76 |
77 | prepare: .cask
78 |
79 | test: prepare
80 | @$(CASK) exec $(TEST_COMMAND)
81 |
82 | clean:
83 | @rm -f $(SRC_DIR)/*.elc
84 | @rm -f $(EXTRA_DIR)/*.elc
85 |
86 | lint: EMACSFLAGS += $(LINT_FLAG)
87 | lint: .prepare-lint compile checkdoc
88 | @rm -rf $(LINT_DIR)
89 |
90 | checkdoc:
91 | @$(CASK) exec $(EMACS) $(EMACSFLAGS) $(CHECKDOC_COMMAND)
92 |
93 | clean-start: prepare
94 | @$(CASK) exec $(EMACS) -Q -L $(SRC_DIR) --eval "(require 'treemacs)" &
95 |
96 | .prepare-lint:
97 | @rm -rf $(LINT_DIR)
98 | @mkdir -p $(LINT_DIR)
99 |
--------------------------------------------------------------------------------
/icons/default/asciidoc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/asciidoc.png
--------------------------------------------------------------------------------
/icons/default/audio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/audio.png
--------------------------------------------------------------------------------
/icons/default/babel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/babel.png
--------------------------------------------------------------------------------
/icons/default/bookmark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/bookmark.png
--------------------------------------------------------------------------------
/icons/default/buffer-group-closed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/buffer-group-closed.png
--------------------------------------------------------------------------------
/icons/default/buffer-group-open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/buffer-group-open.png
--------------------------------------------------------------------------------
/icons/default/c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/c.png
--------------------------------------------------------------------------------
/icons/default/cabal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/cabal.png
--------------------------------------------------------------------------------
/icons/default/clojure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/clojure.png
--------------------------------------------------------------------------------
/icons/default/conf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/conf.png
--------------------------------------------------------------------------------
/icons/default/css.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/css.png
--------------------------------------------------------------------------------
/icons/default/dart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/dart.png
--------------------------------------------------------------------------------
/icons/default/direnv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/direnv.png
--------------------------------------------------------------------------------
/icons/default/docker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/docker.png
--------------------------------------------------------------------------------
/icons/default/elx-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/elx-light.png
--------------------------------------------------------------------------------
/icons/default/elx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/elx.png
--------------------------------------------------------------------------------
/icons/default/emacs.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/emacs.png
--------------------------------------------------------------------------------
/icons/default/erlang.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/erlang.png
--------------------------------------------------------------------------------
/icons/default/error.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/error.png
--------------------------------------------------------------------------------
/icons/default/git.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/git.png
--------------------------------------------------------------------------------
/icons/default/go.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/go.png
--------------------------------------------------------------------------------
/icons/default/gradle.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/gradle.png
--------------------------------------------------------------------------------
/icons/default/haskell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/haskell.png
--------------------------------------------------------------------------------
/icons/default/html.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/html.png
--------------------------------------------------------------------------------
/icons/default/hy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/hy.png
--------------------------------------------------------------------------------
/icons/default/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/image.png
--------------------------------------------------------------------------------
/icons/default/info.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/info.png
--------------------------------------------------------------------------------
/icons/default/jar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/jar.png
--------------------------------------------------------------------------------
/icons/default/jinja2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/jinja2.png
--------------------------------------------------------------------------------
/icons/default/js.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/js.png
--------------------------------------------------------------------------------
/icons/default/json.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/json.png
--------------------------------------------------------------------------------
/icons/default/julia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/julia.png
--------------------------------------------------------------------------------
/icons/default/kotlin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/kotlin.png
--------------------------------------------------------------------------------
/icons/default/ledger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/ledger.png
--------------------------------------------------------------------------------
/icons/default/lock.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/lock.png
--------------------------------------------------------------------------------
/icons/default/markdown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/markdown.png
--------------------------------------------------------------------------------
/icons/default/nix.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/nix.png
--------------------------------------------------------------------------------
/icons/default/ocaml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/ocaml.png
--------------------------------------------------------------------------------
/icons/default/pdf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/pdf.png
--------------------------------------------------------------------------------
/icons/default/php.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/php.png
--------------------------------------------------------------------------------
/icons/default/project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/project.png
--------------------------------------------------------------------------------
/icons/default/puppet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/puppet.png
--------------------------------------------------------------------------------
/icons/default/purescript.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/purescript.png
--------------------------------------------------------------------------------
/icons/default/python.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/python.png
--------------------------------------------------------------------------------
/icons/default/racket.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/racket.png
--------------------------------------------------------------------------------
/icons/default/rust.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/rust.png
--------------------------------------------------------------------------------
/icons/default/sbt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/sbt.png
--------------------------------------------------------------------------------
/icons/default/scala.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/scala.png
--------------------------------------------------------------------------------
/icons/default/scons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/scons.png
--------------------------------------------------------------------------------
/icons/default/shell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/shell.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/README.txt:
--------------------------------------------------------------------------------
1 | The icons in this subdirectory are taken from https://www.svgrepo.com/
2 | and are licensed under the SVG Repo license: https://www.svgrepo.com/page/licensing
3 |
--------------------------------------------------------------------------------
/icons/default/svgrepo/briefcase.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/briefcase.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/cal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/cal.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/close.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/dir-docs-closed.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/icons/default/svgrepo/dir-docs-open.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/icons/default/svgrepo/dir-git-closed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/dir-git-closed.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/dir-git-closed.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/icons/default/svgrepo/dir-git-open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/dir-git-open.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/dir-git-open.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/icons/default/svgrepo/dir-github-closed.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/icons/default/svgrepo/dir-github-open.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/icons/default/svgrepo/dir-src-closed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/dir-src-closed.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/dir-src-closed.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/icons/default/svgrepo/dir-src-open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/dir-src-open.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/dir-src-open.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/icons/default/svgrepo/dir-test-closed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/dir-test-closed.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/dir-test-closed.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/icons/default/svgrepo/dir-test-open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/dir-test-open.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/dir-test-open.svg:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/icons/default/svgrepo/house.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/house.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/inbox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/inbox.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/list.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/list.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/mail-plus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/mail-plus.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/mail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/mail.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/repeat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/repeat.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/screen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/screen.png
--------------------------------------------------------------------------------
/icons/default/svgrepo/suitcase.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/svgrepo/suitcase.png
--------------------------------------------------------------------------------
/icons/default/systemd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/systemd.png
--------------------------------------------------------------------------------
/icons/default/tags-closed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/tags-closed.png
--------------------------------------------------------------------------------
/icons/default/tags-leaf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/tags-leaf.png
--------------------------------------------------------------------------------
/icons/default/tags-open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/tags-open.png
--------------------------------------------------------------------------------
/icons/default/tex.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/tex.png
--------------------------------------------------------------------------------
/icons/default/ts.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/ts.png
--------------------------------------------------------------------------------
/icons/default/txt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/txt.png
--------------------------------------------------------------------------------
/icons/default/vagrant.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vagrant.png
--------------------------------------------------------------------------------
/icons/default/video.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/video.png
--------------------------------------------------------------------------------
/icons/default/vsc/README.txt:
--------------------------------------------------------------------------------
1 | The icons in this subdirectory are taken from vscode-icons (https://github.com/vscode-icons/vscode-icons)
2 | and are licensed under the Creative Commons - ShareAlike (CC BY-SA) license: https://creativecommons.org/licenses/by-sa/4.0/.
3 |
--------------------------------------------------------------------------------
/icons/default/vsc/access.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/access.png
--------------------------------------------------------------------------------
/icons/default/vsc/ai.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/ai.png
--------------------------------------------------------------------------------
/icons/default/vsc/alaw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/alaw.png
--------------------------------------------------------------------------------
/icons/default/vsc/angular.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/angular.png
--------------------------------------------------------------------------------
/icons/default/vsc/ansible.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/ansible.png
--------------------------------------------------------------------------------
/icons/default/vsc/antlr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/antlr.png
--------------------------------------------------------------------------------
/icons/default/vsc/any.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/any.png
--------------------------------------------------------------------------------
/icons/default/vsc/apache.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/apache.png
--------------------------------------------------------------------------------
/icons/default/vsc/apple.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/apple.png
--------------------------------------------------------------------------------
/icons/default/vsc/appveyor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/appveyor.png
--------------------------------------------------------------------------------
/icons/default/vsc/arduino.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/arduino.png
--------------------------------------------------------------------------------
/icons/default/vsc/ascript.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/ascript.png
--------------------------------------------------------------------------------
/icons/default/vsc/asm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/asm.png
--------------------------------------------------------------------------------
/icons/default/vsc/asp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/asp.png
--------------------------------------------------------------------------------
/icons/default/vsc/autohk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/autohk.png
--------------------------------------------------------------------------------
/icons/default/vsc/babel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/babel.png
--------------------------------------------------------------------------------
/icons/default/vsc/bat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/bat.png
--------------------------------------------------------------------------------
/icons/default/vsc/bazel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/bazel.png
--------------------------------------------------------------------------------
/icons/default/vsc/binary.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/binary.png
--------------------------------------------------------------------------------
/icons/default/vsc/bower.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/bower.png
--------------------------------------------------------------------------------
/icons/default/vsc/bundler.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/bundler.png
--------------------------------------------------------------------------------
/icons/default/vsc/cargo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/cargo.png
--------------------------------------------------------------------------------
/icons/default/vsc/cert.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/cert.png
--------------------------------------------------------------------------------
/icons/default/vsc/cfscript.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/cfscript.png
--------------------------------------------------------------------------------
/icons/default/vsc/class.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/class.png
--------------------------------------------------------------------------------
/icons/default/vsc/cmake.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/cmake.png
--------------------------------------------------------------------------------
/icons/default/vsc/cobol.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/cobol.png
--------------------------------------------------------------------------------
/icons/default/vsc/cpp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/cpp.png
--------------------------------------------------------------------------------
/icons/default/vsc/cpph.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/cpph.png
--------------------------------------------------------------------------------
/icons/default/vsc/cucumber.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/cucumber.png
--------------------------------------------------------------------------------
/icons/default/vsc/cython.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/cython.png
--------------------------------------------------------------------------------
/icons/default/vsc/delphi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/delphi.png
--------------------------------------------------------------------------------
/icons/default/vsc/deps.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/deps.png
--------------------------------------------------------------------------------
/icons/default/vsc/diff.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/diff.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-binary-closed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-binary-closed.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-binary-closed.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-binary-open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-binary-open.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-binary-open.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-closed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-closed.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-docs-closed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-docs-closed.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-docs-closed.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-docs-open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-docs-open.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-docs-open.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-git-closed.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-git-open.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-github-closed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-github-closed.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-github-closed.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-github-open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-github-open.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-github-open.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-images-closed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-images-closed.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-images-closed.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-images-open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-images-open.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-images-open.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-open.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-private-closed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-private-closed.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-private-closed.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-private-open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-private-open.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-private-open.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-public-closed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-public-closed.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-public-closed.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-public-open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-public-open.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-public-open.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-services-closed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-services-closed.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-services-closed.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-services-open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-services-open.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-services-open.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-src-closed.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-src-open.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-temp-closed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-temp-closed.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-temp-closed.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-temp-open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dir-temp-open.png
--------------------------------------------------------------------------------
/icons/default/vsc/dir-temp-open.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-test-closed.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/dir-test-open.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/icons/default/vsc/django.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/django.png
--------------------------------------------------------------------------------
/icons/default/vsc/dlang.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/dlang.png
--------------------------------------------------------------------------------
/icons/default/vsc/editorcfg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/editorcfg.png
--------------------------------------------------------------------------------
/icons/default/vsc/elm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/elm.png
--------------------------------------------------------------------------------
/icons/default/vsc/elx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/elx.png
--------------------------------------------------------------------------------
/icons/default/vsc/erb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/erb.png
--------------------------------------------------------------------------------
/icons/default/vsc/eslint.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/eslint.png
--------------------------------------------------------------------------------
/icons/default/vsc/excel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/excel.png
--------------------------------------------------------------------------------
/icons/default/vsc/font.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/font.png
--------------------------------------------------------------------------------
/icons/default/vsc/fortran.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/fortran.png
--------------------------------------------------------------------------------
/icons/default/vsc/fsharp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/fsharp.png
--------------------------------------------------------------------------------
/icons/default/vsc/fsproj.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/fsproj.png
--------------------------------------------------------------------------------
/icons/default/vsc/godot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/godot.png
--------------------------------------------------------------------------------
/icons/default/vsc/graphql.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/graphql.png
--------------------------------------------------------------------------------
/icons/default/vsc/helm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/helm.png
--------------------------------------------------------------------------------
/icons/default/vsc/jar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/jar.png
--------------------------------------------------------------------------------
/icons/default/vsc/java.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/java.png
--------------------------------------------------------------------------------
/icons/default/vsc/jenkins.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/jenkins.png
--------------------------------------------------------------------------------
/icons/default/vsc/jupyter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/jupyter.png
--------------------------------------------------------------------------------
/icons/default/vsc/key.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/key.png
--------------------------------------------------------------------------------
/icons/default/vsc/less.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/less.png
--------------------------------------------------------------------------------
/icons/default/vsc/license.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/license.png
--------------------------------------------------------------------------------
/icons/default/vsc/lisp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/lisp.png
--------------------------------------------------------------------------------
/icons/default/vsc/locale.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/locale.png
--------------------------------------------------------------------------------
/icons/default/vsc/log.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/log.png
--------------------------------------------------------------------------------
/icons/default/vsc/lua.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/lua.png
--------------------------------------------------------------------------------
/icons/default/vsc/make.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/make.png
--------------------------------------------------------------------------------
/icons/default/vsc/manifest.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/manifest.png
--------------------------------------------------------------------------------
/icons/default/vsc/maven.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/maven.png
--------------------------------------------------------------------------------
/icons/default/vsc/meson.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/meson.png
--------------------------------------------------------------------------------
/icons/default/vsc/nginx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/nginx.png
--------------------------------------------------------------------------------
/icons/default/vsc/nim.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/nim.png
--------------------------------------------------------------------------------
/icons/default/vsc/npm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/npm.png
--------------------------------------------------------------------------------
/icons/default/vsc/org.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/org.png
--------------------------------------------------------------------------------
/icons/default/vsc/patch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/patch.png
--------------------------------------------------------------------------------
/icons/default/vsc/perl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/perl.png
--------------------------------------------------------------------------------
/icons/default/vsc/perl6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/perl6.png
--------------------------------------------------------------------------------
/icons/default/vsc/pgsql.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/pgsql.png
--------------------------------------------------------------------------------
/icons/default/vsc/phpunit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/phpunit.png
--------------------------------------------------------------------------------
/icons/default/vsc/pip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/pip.png
--------------------------------------------------------------------------------
/icons/default/vsc/pkg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/pkg.png
--------------------------------------------------------------------------------
/icons/default/vsc/plsql.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/plsql.png
--------------------------------------------------------------------------------
/icons/default/vsc/pp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/pp.png
--------------------------------------------------------------------------------
/icons/default/vsc/prettier.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/prettier.png
--------------------------------------------------------------------------------
/icons/default/vsc/prolog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/prolog.png
--------------------------------------------------------------------------------
/icons/default/vsc/protobuf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/protobuf.png
--------------------------------------------------------------------------------
/icons/default/vsc/r.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/r.png
--------------------------------------------------------------------------------
/icons/default/vsc/rake.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/rake.png
--------------------------------------------------------------------------------
/icons/default/vsc/reason.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/reason.png
--------------------------------------------------------------------------------
/icons/default/vsc/root-closed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/root-closed.png
--------------------------------------------------------------------------------
/icons/default/vsc/root-open.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/root-open.png
--------------------------------------------------------------------------------
/icons/default/vsc/ruby.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/ruby.png
--------------------------------------------------------------------------------
/icons/default/vsc/scss.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/scss.png
--------------------------------------------------------------------------------
/icons/default/vsc/sql.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/sql.png
--------------------------------------------------------------------------------
/icons/default/vsc/sqlite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/sqlite.png
--------------------------------------------------------------------------------
/icons/default/vsc/swagger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/swagger.png
--------------------------------------------------------------------------------
/icons/default/vsc/swift.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/swift.png
--------------------------------------------------------------------------------
/icons/default/vsc/terraform.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/terraform.png
--------------------------------------------------------------------------------
/icons/default/vsc/toml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/toml.png
--------------------------------------------------------------------------------
/icons/default/vsc/vim.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/vim.png
--------------------------------------------------------------------------------
/icons/default/vsc/wasm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/wasm.png
--------------------------------------------------------------------------------
/icons/default/vsc/xml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/xml.png
--------------------------------------------------------------------------------
/icons/default/vsc/yarn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/yarn.png
--------------------------------------------------------------------------------
/icons/default/vsc/zip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vsc/zip.png
--------------------------------------------------------------------------------
/icons/default/vue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/vue.png
--------------------------------------------------------------------------------
/icons/default/warning.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/warning.png
--------------------------------------------------------------------------------
/icons/default/yaml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/icons/default/yaml.png
--------------------------------------------------------------------------------
/screenshots/dired-icons.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/screenshots/dired-icons.png
--------------------------------------------------------------------------------
/screenshots/disable-project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/screenshots/disable-project.png
--------------------------------------------------------------------------------
/screenshots/filewatch.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/screenshots/filewatch.gif
--------------------------------------------------------------------------------
/screenshots/git-commit-diff.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/screenshots/git-commit-diff.png
--------------------------------------------------------------------------------
/screenshots/git.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/screenshots/git.gif
--------------------------------------------------------------------------------
/screenshots/hydra.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/screenshots/hydra.png
--------------------------------------------------------------------------------
/screenshots/icon-resize.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/screenshots/icon-resize.gif
--------------------------------------------------------------------------------
/screenshots/indent-guide-block.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/screenshots/indent-guide-block.png
--------------------------------------------------------------------------------
/screenshots/indent-guide-line.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/screenshots/indent-guide-line.png
--------------------------------------------------------------------------------
/screenshots/mouse-drag.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/screenshots/mouse-drag.gif
--------------------------------------------------------------------------------
/screenshots/mouse-interface.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/screenshots/mouse-interface.gif
--------------------------------------------------------------------------------
/screenshots/open-files.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/screenshots/open-files.gif
--------------------------------------------------------------------------------
/screenshots/right-click.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/screenshots/right-click.png
--------------------------------------------------------------------------------
/screenshots/screenshot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/screenshots/screenshot.png
--------------------------------------------------------------------------------
/screenshots/workspace-edit.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/screenshots/workspace-edit.gif
--------------------------------------------------------------------------------
/screenshots/workspace-edit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Alexander-Miller/treemacs/abd27c86df6b7bf8bc7d4c2a86b4ea9e425084c7/screenshots/workspace-edit.png
--------------------------------------------------------------------------------
/src/elisp/treemacs-faces.el:
--------------------------------------------------------------------------------
1 | ;;; treemacs.el --- A tree style file viewer package -*- lexical-binding: t -*-
2 |
3 | ;; Copyright (C) 2024 Alexander Miller
4 |
5 | ;; This program is free software; you can redistribute it and/or modify
6 | ;; it under the terms of the GNU General Public License as published by
7 | ;; the Free Software Foundation, either version 3 of the License, or
8 | ;; (at your option) any later version.
9 |
10 | ;; This program is distributed in the hope that it will be useful,
11 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | ;; GNU General Public License for more details.
14 |
15 | ;; You should have received a copy of the GNU General Public License
16 | ;; along with this program. If not, see .
17 |
18 | ;;; Commentary:
19 |
20 | ;; Treemacs faces.
21 |
22 | ;;; Code:
23 |
24 | (defface treemacs-directory-face
25 | '((t :inherit font-lock-function-name-face))
26 | "Face used by treemacs for directories."
27 | :group 'treemacs-faces)
28 |
29 | (defface treemacs-directory-collapsed-face
30 | '((t :inherit treemacs-directory-face))
31 | "Face used by treemacs for collapsed directories.
32 | This is the face used for the collapsed part of nodes, so if the node is
33 | \"foo/bar/baz\", the face is used for \"foo/bar/\".
34 |
35 | Using this face is incompatible with `treemacs-git-mode' (exept for the simple
36 | variant), so it will only be used if git-mode is disabled or set to simple."
37 | :group 'treemacs-faces)
38 |
39 | (defface treemacs-window-background-face
40 | '((t :inherit default))
41 | "Face used for the background of the treemacs window."
42 | :group 'treemacs-faces)
43 |
44 | (defface treemacs-hl-line-face
45 | '((t :inherit hl-line))
46 | "Face used for the hl-line selection in the treemacs window."
47 | :group 'treemacs-faces)
48 |
49 | (defface treemacs-file-face
50 | '((t :inherit default))
51 | "Face used by treemacs for files."
52 | :group 'treemacs-faces)
53 |
54 | (defface treemacs-root-face
55 | '((t :inherit font-lock-constant-face :underline t :bold t :height 1.2))
56 | "Face used by treemacs for its root nodes."
57 | :group 'treemacs-faces)
58 |
59 | (defface treemacs-root-unreadable-face
60 | '((t :inherit treemacs-root-face :strike-through t))
61 | "Face used by treemacs for unreadable root nodes."
62 | :group 'treemacs-faces)
63 |
64 | (defface treemacs-root-remote-face
65 | '((t :inherit (font-lock-function-name-face treemacs-root-face)))
66 | "Face used by treemacs for remote (Tramp) root nodes."
67 | :group 'treemacs-faces)
68 |
69 | (defface treemacs-root-remote-unreadable-face
70 | '((t :inherit treemacs-root-unreadable-face))
71 | "Face used by treemacs for unreadable remote (Tramp) root nodes."
72 | :group 'treemacs-faces)
73 |
74 | (defface treemacs-root-remote-disconnected-face
75 | '((t :inherit (warning treemacs-root-remote-face)))
76 | "Face used by treemacs for disconnected remote (Tramp) root nodes."
77 | :group 'treemacs-faces)
78 |
79 | (defface treemacs-term-node-face
80 | '((t :inherit font-lock-string-face))
81 | "Face used by treemacs in the terminal for directory node symbols."
82 | :group 'treemacs-faces)
83 |
84 | (defface treemacs-git-unmodified-face
85 | '((t :inherit treemacs-file-face))
86 | "Face used for unmodified files."
87 | :group 'treemacs-faces)
88 |
89 | (defface treemacs-git-modified-face
90 | '((t :inherit font-lock-variable-name-face))
91 | "Face used for modified files."
92 | :group 'treemacs-faces)
93 |
94 | (defface treemacs-git-renamed-face
95 | '((t :inherit font-lock-doc-face))
96 | "Face used for renamed files."
97 | :group 'treemacs-faces)
98 |
99 | (defface treemacs-git-ignored-face
100 | '((t :inherit font-lock-comment-face))
101 | "Face for ignored files."
102 | :group 'treemacs-faces)
103 |
104 | (defface treemacs-git-untracked-face
105 | '((t :inherit font-lock-string-face))
106 | "Face for untracked files."
107 | :group 'treemacs-faces)
108 |
109 | (defface treemacs-git-added-face
110 | '((t :inherit font-lock-type-face))
111 | "Face for newly added files."
112 | :group 'treemacs-faces)
113 |
114 | (defface treemacs-git-conflict-face
115 | '((t :inherit error))
116 | "Face for conflicting files."
117 | :group 'treemacs-faces)
118 |
119 | (defface treemacs-tags-face
120 | '((t :inherit font-lock-builtin-face))
121 | "Face for tags."
122 | :group 'treemacs-faces)
123 |
124 | (defface treemacs-help-title-face
125 | `((t :inherit ,(if (facep 'spacemacs-transient-state-title-face)
126 | 'spacemacs-transient-state-title-face
127 | 'font-lock-constant-face)))
128 | "Face for the title of the helpful hydra."
129 | :group 'treemacs-faces)
130 |
131 | (defface treemacs-help-column-face
132 | '((t :inherit font-lock-keyword-face :underline t))
133 | "Face for column headers of the helpful hydra."
134 | :group 'treemacs-faces)
135 |
136 | (defface treemacs-on-failure-pulse-face
137 | '((t :foreground "#111111" :background "#ab3737" :extend t))
138 | "Pulse face used when an error occurs or an action fails."
139 | :group 'treemacs-faces)
140 |
141 | (defface treemacs-on-success-pulse-face
142 | '((t :foreground "#111111" :background "#669966" :extend t))
143 | "Pulse face used to signal a successful action."
144 | :group 'treemacs-faces)
145 |
146 | (defface treemacs-fringe-indicator-face
147 | `((t :foreground ,(face-background 'cursor nil t)))
148 | "Face for the fringe indicator."
149 | :group 'treemacs-faces)
150 |
151 | (defface treemacs-header-button-face
152 | '((t :inherit 'font-lock-keyword-face))
153 | "Face used for header buttons.
154 | Applies to buttons like
155 | - `treemacs-header-close-button'
156 | - `treemacs-header-projects-button'
157 | - `treemacs-header-workspace-button'"
158 | :group 'treemacs-faces)
159 |
160 | (defface treemacs-peek-mode-indicator-face
161 | '((t :background "#669966"))
162 | "Face used to indicate that `treemacs-peek-mode' is enabled."
163 | :group 'treemacs-faces)
164 |
165 | (defface treemacs-marked-file-face
166 | '((t :foreground "#F0C674" :background "#AB3737" :bold t))
167 | "Face for files marked by treemacs."
168 | :group 'treemacs-faces)
169 |
170 | (defface treemacs-git-commit-diff-face
171 | '((t :inherit 'font-lock-comment-face))
172 | "Face for `treemacs-git-commit-diff-mode' annotations."
173 | :group 'treemacs-faces)
174 |
175 | (defface treemacs-async-loading-face
176 | '((t :inherit 'font-lock-comment-face :height 0.8))
177 | "Face used for the \"Loading…\" string used by asynchronous extensions."
178 | :group 'treemacs-faces)
179 |
180 | (provide 'treemacs-faces)
181 |
182 | ;;; treemacs-faces.el ends here
183 |
--------------------------------------------------------------------------------
/src/elisp/treemacs-follow-mode.el:
--------------------------------------------------------------------------------
1 | ;;; treemacs.el --- A tree style file viewer package -*- lexical-binding: t -*-
2 |
3 | ;; Copyright (C) 2024 Alexander Miller
4 |
5 | ;; This program is free software; you can redistribute it and/or modify
6 | ;; it under the terms of the GNU General Public License as published by
7 | ;; the Free Software Foundation, either version 3 of the License, or
8 | ;; (at your option) any later version.
9 |
10 | ;; This program is distributed in the hope that it will be useful,
11 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | ;; GNU General Public License for more details.
14 |
15 | ;; You should have received a copy of the GNU General Public License
16 | ;; along with this program. If not, see .
17 |
18 | ;;; Commentary:
19 |
20 | ;; Follow mode definition.
21 |
22 | ;;; Code:
23 |
24 | (require 'hl-line)
25 | (require 'dash)
26 | (require 's)
27 | (require 'treemacs-customization)
28 | (require 'treemacs-rendering)
29 | (require 'treemacs-dom)
30 | (require 'treemacs-async)
31 | (require 'treemacs-core-utils)
32 |
33 | (eval-when-compile
34 | (require 'treemacs-macros))
35 |
36 | (treemacs-import-functions-from "dired"
37 | dired-current-directory)
38 |
39 | (defvar treemacs--ready-to-follow nil
40 | "Signals to `treemacs-follow-mode' if a follow action may be run.
41 | Must be set to nil when no following should be triggered, e.g. when the
42 | treemacs buffer is being rebuilt or during treemacs' own window selection
43 | functions.")
44 |
45 | (defvar treemacs--follow-timer nil
46 | "Idle timer for `treemacs--follow' to run.")
47 |
48 | (defun treemacs--follow ()
49 | "Move point to the current file in the treemacs buffer.
50 | Expand directories if needed. Do nothing if current file does not exist in the
51 | file system or is not below current treemacs root or if the treemacs buffer is
52 | not visible."
53 | ;; Treemacs selecting files with `ace-window' results in a large amount of
54 | ;; window selections, so we should be breaking out as soon as possbile
55 | (setq treemacs--follow-timer nil)
56 | (when treemacs--ready-to-follow
57 | (treemacs-without-following
58 | (let* ((treemacs-window (treemacs-get-local-window))
59 | (current-buffer (current-buffer))
60 | (buffer-name (buffer-name current-buffer))
61 | (current-file (or (buffer-file-name current-buffer)
62 | (when (eq major-mode 'dired-mode)
63 | (treemacs-canonical-path (dired-current-directory))))))
64 | (when (and treemacs-window
65 | current-file
66 | (not (s-starts-with? treemacs--buffer-name-prefix buffer-name))
67 | (file-exists-p current-file)
68 | (not (string= buffer-name "COMMIT_EDITMSG")))
69 | (-when-let (project-for-file (treemacs--find-project-for-buffer current-file))
70 | (with-selected-window treemacs-window
71 | (-let [selected-file (--if-let (treemacs-current-button)
72 | (treemacs--nearest-path it)
73 | (treemacs-project->path project-for-file))]
74 | (unless (treemacs-is-path selected-file :same-as current-file)
75 | (when (treemacs-goto-file-node current-file project-for-file)
76 | (when treemacs-project-follow-cleanup
77 | (dolist (project (treemacs-workspace->projects (treemacs-current-workspace)))
78 | (unless (or (not (treemacs-project->is-expanded? project))
79 | (eq project project-for-file))
80 | (-when-let (project-pos (treemacs-project->position project))
81 | (goto-char project-pos)
82 | (treemacs--collapse-root-node project-pos)))))
83 | (when treemacs-recenter-after-file-follow
84 | (treemacs--maybe-recenter treemacs-recenter-after-file-follow))))))))))))
85 |
86 | (defun treemacs--follow-after-buffer-list-update ()
87 | "Debounced call to `treemacs--follow'."
88 | (when treemacs--ready-to-follow
89 | (unless treemacs--follow-timer
90 | (setq treemacs--follow-timer
91 | (run-with-idle-timer treemacs-file-follow-delay nil #'treemacs--follow)))))
92 |
93 | (defun treemacs--setup-follow-mode ()
94 | "Setup all the hooks needed for `treemacs-follow-mode'."
95 | (add-hook 'buffer-list-update-hook #'treemacs--follow-after-buffer-list-update)
96 | (treemacs--follow))
97 |
98 | (defun treemacs--tear-down-follow-mode ()
99 | "Remove the hooks added by `treemacs--setup-follow-mode'."
100 | (remove-hook 'buffer-list-update-hook #'treemacs--follow-after-buffer-list-update))
101 |
102 | (define-minor-mode treemacs-follow-mode
103 | "Toggle `treemacs-follow-mode'.
104 | When enabled treemacs will keep track of and focus the currently selected
105 | buffer's file. This only applies if the file is within the treemacs root
106 | directory.
107 | This functionality can also be manually invoked with `treemacs-find-file'."
108 | :init-value nil
109 | :global t
110 | :lighter nil
111 | :group 'treemacs
112 | (if treemacs-follow-mode
113 | (treemacs--setup-follow-mode)
114 | (treemacs--tear-down-follow-mode)))
115 |
116 | (treemacs-only-during-init (treemacs-follow-mode))
117 |
118 | (provide 'treemacs-follow-mode)
119 |
120 | ;;; treemacs-follow-mode.el ends here
121 |
--------------------------------------------------------------------------------
/src/elisp/treemacs-fringe-indicator.el:
--------------------------------------------------------------------------------
1 | ;;; treemacs.el --- A tree style file viewer package -*- lexical-binding: t -*-
2 |
3 | ;; Copyright (C) 2024 Alexander Miller
4 |
5 | ;; This program is free software; you can redistribute it and/or modify
6 | ;; it under the terms of the GNU General Public License as published by
7 | ;; the Free Software Foundation, either version 3 of the License, or
8 | ;; (at your option) any later version.
9 |
10 | ;; This program is distributed in the hope that it will be useful,
11 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | ;; GNU General Public License for more details.
14 |
15 | ;; You should have received a copy of the GNU General Public License
16 | ;; along with this program. If not, see .
17 |
18 | ;;; Commentary:
19 |
20 | ;; Handling of visuals in general and icons in particular.
21 |
22 | ;;; Code:
23 |
24 | (require 'dash)
25 | (require 'treemacs-core-utils)
26 | (require 'treemacs-scope)
27 | (require 'treemacs-customization)
28 |
29 | (eval-when-compile
30 | (require 'inline)
31 | (require 'treemacs-macros))
32 |
33 | (defvar-local treemacs--fringe-indicator-overlay nil)
34 |
35 | (defconst treemacs--fringe-overlay-before-string
36 | (propertize
37 | " " 'display
38 | `(left-fringe ,treemacs--fringe-indicator-bitmap treemacs-fringe-indicator-face))
39 | "The `before-string' property value used by the fringe indicator overlay.")
40 |
41 | (defun treemacs--move-fringe-indicator-to-point ()
42 | "Move the fringe indicator to the position of point."
43 | (when treemacs--fringe-indicator-overlay
44 | (-let [pabol (line-beginning-position)]
45 | (move-overlay treemacs--fringe-indicator-overlay pabol (1+ pabol)))))
46 |
47 | (defun treemacs--enable-fringe-indicator ()
48 | "Enabled the fringe indicator in the current buffer."
49 | (unless treemacs--fringe-indicator-overlay
50 | (setq-local
51 | treemacs--fringe-indicator-overlay
52 | (-doto (make-overlay 1 1 (current-buffer))
53 | (overlay-put 'before-string treemacs--fringe-overlay-before-string)))
54 | (treemacs--move-fringe-indicator-to-point)))
55 |
56 | (defun treemacs--disable-fringe-indicator ()
57 | "Enabled the fringe indicator in the current buffer."
58 | (when treemacs--fringe-indicator-overlay
59 | (delete-overlay treemacs--fringe-indicator-overlay)
60 | (setf treemacs--fringe-indicator-overlay nil)))
61 |
62 | (defun treemacs--show-fringe-indicator-only-when-focused (window)
63 | "Hook to ensure the fringe indicator not shown when treemacs is not selected.
64 | WINDOW is the treemacs window that has just been focused or unfocused."
65 | (if (eq treemacs--in-this-buffer t)
66 | (when treemacs--fringe-indicator-overlay
67 | (overlay-put
68 | treemacs--fringe-indicator-overlay 'before-string
69 | treemacs--fringe-overlay-before-string))
70 | (with-selected-window window
71 | (when treemacs--fringe-indicator-overlay
72 | (overlay-put
73 | treemacs--fringe-indicator-overlay
74 | 'before-string nil)))))
75 |
76 | (defun treemacs--tear-down-fringe-indicator-mode ()
77 | "Tear down `treemacs-fringe-indicator-mode'."
78 | (remove-hook 'treemacs-mode-hook
79 | #'treemacs--enable-fringe-indicator-in-current-buffer)
80 | (treemacs-run-in-all-derived-buffers
81 | (treemacs--disable-fringe-indicator)
82 | (advice-remove #'hl-line-highlight #'treemacs--move-fringe-indicator-to-point)
83 | (remove-hook 'window-selection-change-functions
84 | #'treemacs--show-fringe-indicator-only-when-focused
85 | :local)))
86 |
87 | (define-minor-mode treemacs-fringe-indicator-mode
88 | "Toggle `treemacs-fringe-indicator-mode'.
89 | When enabled, a visual indicator in the fringe will be displayed to highlight
90 | the selected line in addition to `hl-line-mode'. Useful if `hl-line-mode'
91 | doesn't stand out enough with your colour theme.
92 |
93 | Can be called with one of two arguments:
94 |
95 | - `always' will always show the fringe indicator.
96 | - `only-when-focused' will only show the fringe indicator when the treemacs
97 | window is focused (only possible with Emacs 27+).
98 |
99 | For backward compatibility just enabling this mode without an explicit argument
100 | has the same effect as using `always'."
101 | :init-value nil
102 | :global t
103 | :lighter nil
104 | :group 'treemacs
105 | (if treemacs-fringe-indicator-mode
106 | (progn
107 | (setf arg (or arg t))
108 | (if (memq arg '(always only-when-focused t))
109 | (treemacs--setup-fringe-indicator-mode arg)
110 | (call-interactively #'treemacs--setup-fringe-indicator-mode)))
111 | (treemacs--tear-down-fringe-indicator-mode)))
112 |
113 | (defun treemacs--setup-fringe-indicator-mode (arg)
114 | "Setup `treemacs-fringe-indicator-mode'.
115 | When ARG is `only-when-focused' a hook will be set up to only display the
116 | fringe indicator when the treemacs window is selected."
117 | (interactive (list (->> (completing-read "Fringe Indicator" '("Always" "Only When Focused"))
118 | (downcase)
119 | (s-split " ")
120 | (s-join "-")
121 | (intern))))
122 | (setf treemacs-fringe-indicator-mode arg)
123 | (add-hook 'treemacs-mode-hook
124 | #'treemacs--enable-fringe-indicator-in-current-buffer)
125 | (treemacs-run-in-all-derived-buffers
126 | (treemacs--enable-fringe-indicator-in-current-buffer)))
127 |
128 | (defun treemacs--enable-fringe-indicator-in-current-buffer ()
129 | "Set up fringe-indicator-mode for the current buffer."
130 | (treemacs--enable-fringe-indicator)
131 | (advice-add #'hl-line-highlight
132 | :after #'treemacs--move-fringe-indicator-to-point)
133 | (when (memq treemacs-fringe-indicator-mode '(t only-when-focused))
134 | (add-hook 'window-selection-change-functions
135 | #'treemacs--show-fringe-indicator-only-when-focused
136 | nil :local)))
137 |
138 | (treemacs-only-during-init (treemacs-fringe-indicator-mode))
139 |
140 | (provide 'treemacs-fringe-indicator)
141 |
142 | ;;; treemacs-fringe-indicator.el ends here
143 |
--------------------------------------------------------------------------------
/src/elisp/treemacs-git-commit-diff-mode.el:
--------------------------------------------------------------------------------
1 | ;;; treemacs-git-commit-diff-mode.el --- A tree style file viewer package -*- lexical-binding: t -*-
2 |
3 | ;; Copyright (C) 2024 Alexander Miller
4 |
5 | ;; This program is free software; you can redistribute it and/or modify
6 | ;; it under the terms of the GNU General Public License as published by
7 | ;; the Free Software Foundation, either version 3 of the License, or
8 | ;; (at your option) any later version.
9 |
10 | ;; This program is distributed in the hope that it will be useful,
11 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | ;; GNU General Public License for more details.
14 |
15 | ;; You should have received a copy of the GNU General Public License
16 | ;; along with this program. If not, see .
17 |
18 | ;;; Commentary:
19 |
20 | ;; Minor mode to annotate project with the number of commits a repo is ahead
21 | ;; and/or behind its remote.
22 |
23 | ;; NOTE: This module is lazy-loaded.
24 |
25 | ;;; Code:
26 |
27 | (require 'vc-git)
28 | (require 'dash)
29 | (require 'pfuture)
30 | (require 'treemacs-customization)
31 | (require 'treemacs-workspaces)
32 | (require 'treemacs-annotations)
33 |
34 | (eval-when-compile
35 | (require 'treemacs-macros))
36 |
37 | (defconst treemacs--git-commit-diff.py
38 | (if (member "treemacs-git-commit-diff.py" (directory-files treemacs-dir))
39 | (treemacs-join-path treemacs-dir "treemacs-git-commit-diff.py")
40 | (treemacs-join-path treemacs-dir "src/scripts/treemacs-git-commit-diff.py")))
41 |
42 | (defconst treemacs--commit-diff-ann-source "treemacs-commit-diff"
43 | "Annotation source name for commit diffs.")
44 |
45 | (defun treemacs--update-git-commit-diff (project &optional buffer)
46 | "Update the commit diff for a single PROJECT.
47 | Look for the PROJECT either in BUFFER or the local treemacs buffer."
48 | (let ((path (treemacs-project->path project))
49 | (buffer (or buffer (treemacs-get-local-buffer))))
50 | (treemacs-with-path path
51 | :no-match-action
52 | (ignore)
53 | :file-action
54 | (pfuture-callback `(,treemacs-python-executable
55 | "-O"
56 | ,treemacs--git-commit-diff.py
57 | ,treemacs-git-executable
58 | ,path)
59 | :directory path
60 | :on-success
61 | (when (buffer-live-p buffer)
62 | (-let [out (-> (pfuture-callback-output)
63 | (treemacs-string-trim-right)
64 | (read))]
65 | (with-current-buffer buffer
66 | (if out
67 | (treemacs-set-annotation-suffix path out treemacs--commit-diff-ann-source)
68 | (treemacs-remove-annotation-suffix path treemacs--commit-diff-ann-source))
69 | (treemacs-apply-single-annotation path))))))))
70 |
71 | (defun treemacs--update-commit-diff-in-every-project ()
72 | "Update diffs for every project in the current scope.
73 | To be run when commt-diff-mode is activated or a treemacs buffer is created."
74 | (dolist (project (treemacs-workspace->projects (treemacs-current-workspace)))
75 | (when (vc-git-responsible-p (treemacs-project->path project))
76 | (treemacs--update-git-commit-diff project))))
77 |
78 | (defun treemacs--enable-git-commit-diff-mode ()
79 | "Setup for `treemacs-comit-diff-mode'."
80 | (add-hook 'treemacs-post-project-refresh-functions #'treemacs--update-git-commit-diff)
81 | (add-hook 'treemacs-post-buffer-init-hook #'treemacs--update-commit-diff-in-every-project)
82 | (treemacs-run-in-every-buffer
83 | (treemacs--update-commit-diff-in-every-project)))
84 |
85 | (defun treemacs--disable-git-commit-diff-mode ()
86 | "Tear-down for `treemacs-comit-diff-mode'."
87 | (remove-hook 'treemacs-post-project-refresh-functions #'treemacs--update-git-commit-diff)
88 | (remove-hook 'treemacs-post-buffer-init-hook #'treemacs--update-commit-diff-in-every-project)
89 | (treemacs-run-in-every-buffer
90 | (dolist (project (treemacs-workspace->projects (treemacs-current-workspace)))
91 | (-let [path (treemacs-project->path project)]
92 | (treemacs-remove-annotation-suffix path treemacs--commit-diff-ann-source)
93 | (treemacs-apply-single-annotation path)))))
94 |
95 | ;;;###autoload
96 | (define-minor-mode treemacs-git-commit-diff-mode
97 | "Minor mode to display commit differences for your git-tracked projects.
98 |
99 | When enabled treemacs will add an annotation next to every git project showing
100 | how many commits ahead or behind your current branch is compared to its remote
101 | counterpart.
102 |
103 | The difference will be shown using the format `↑x ↓y', where `x' and `y' are the
104 | numbers of commits a project is ahead or behind. The numbers are determined
105 | based on the output of `git status -sb'.
106 |
107 | By default the annotation is only updated when manually updating a project with
108 | `treemacs-refresh'. You can install `treemacs-magit' to enable automatic
109 | updates whenever you commit/fetch/rebase etc. in magit.
110 |
111 | Does not require `treemacs-git-mode' to be active."
112 | :init-value nil
113 | :global t
114 | :lighter nil
115 | :group 'treemacs
116 | (if treemacs-git-commit-diff-mode
117 | (treemacs--enable-git-commit-diff-mode)
118 | (treemacs--disable-git-commit-diff-mode)))
119 |
120 | (provide 'treemacs-git-commit-diff-mode)
121 |
122 | ;;; treemacs-git-commit-diff-mode.el ends here
123 |
--------------------------------------------------------------------------------
/src/elisp/treemacs-header-line.el:
--------------------------------------------------------------------------------
1 | ;;; treemacs.el --- A tree style file viewer package -*- lexical-binding: t -*-
2 |
3 | ;; Copyright (C) 2024 Alexander Miller
4 |
5 | ;; This program is free software; you can redistribute it and/or modify
6 | ;; it under the terms of the GNU General Public License as published by
7 | ;; the Free Software Foundation, either version 3 of the License, or
8 | ;; (at your option) any later version.
9 |
10 | ;; This program is distributed in the hope that it will be useful,
11 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | ;; GNU General Public License for more details.
14 |
15 | ;; You should have received a copy of the GNU General Public License
16 | ;; along with this program. If not, see .
17 |
18 | ;;; Commentary:
19 |
20 | ;; Variations of header-line-format treemacs can use.
21 |
22 | ;;; Code:
23 |
24 | (require 'dash)
25 | (require 'treemacs-faces)
26 | (require 'treemacs-interface)
27 |
28 | (eval-when-compile
29 | (require 'treemacs-macros)
30 | (require 'cl-lib))
31 |
32 | (cl-macrolet
33 | ((make-local-map
34 | (&rest body)
35 | `(-doto (make-sparse-keymap)
36 | (define-key [header-line mouse-1]
37 | (lambda (event)
38 | (interactive "e")
39 | ,@body)))))
40 |
41 | (defconst treemacs-header-close-button
42 | (propertize
43 | "(❌)"
44 | 'local-map (make-local-map (delete-window (posn-window (event-start event))))
45 | 'face 'treemacs-header-button-face)
46 | "Header button to close the treemacs window.")
47 |
48 | (defconst treemacs-header-projects-button
49 | (propertize
50 | "(P)"
51 | 'local-map
52 | (make-local-map
53 | (let* ((menu
54 | (easy-menu-create-menu
55 | nil
56 | `(["Add Project" treemacs-add-project]
57 | ["Add Projectile Project" treemacs-projectile :visible (featurep 'treemacs-projectile)]
58 | ["Remove Project" treemacs-remove-project-from-workspace])))
59 | (choice (x-popup-menu event menu)))
60 | (when choice (call-interactively (lookup-key menu (apply 'vector choice))))))
61 | 'face 'treemacs-header-button-face)
62 | "Header button to open a project administration menu.")
63 |
64 | (defconst treemacs-header-workspace-button
65 | (propertize
66 | "(W)"
67 | 'local-map
68 | (make-local-map
69 | (let* ((menu
70 | (easy-menu-create-menu
71 | nil
72 | `(["Edit Workspaces" treemacs-edit-workspaces]
73 | ["Create Workspace" treemacs-create-workspace]
74 | ["Remove Workspace" treemacs-remove-workspace]
75 | ["Rename Workspace" treemacs-rename-workspace]
76 | ["Switch Workspace" treemacs-switch-workspace]
77 | ["Set Fallback Workspace" treemacs-set-fallback-workspace])))
78 | (choice (x-popup-menu event menu)))
79 | (when choice (call-interactively (lookup-key menu (apply 'vector choice))))) )
80 | 'face 'treemacs-header-button-face)
81 | "Header button to open a workspace administration menu.")
82 |
83 | (defconst treemacs-header-toggles-button
84 | (propertize
85 | "(T)"
86 | 'local-map
87 | (make-local-map
88 | (let* ((menu
89 | (easy-menu-create-menu
90 | nil
91 | `([,(format "Dotfile Visibility (Currently %s)"
92 | (if treemacs-show-hidden-files "Enabled" "Disabled"))
93 | treemacs-toggle-show-dotfiles]
94 | [,(format "Follow-Mode (Currently %s)"
95 | (if treemacs-follow-mode "Enabled" "Disabled"))
96 | treemacs-follow-mode]
97 | [,(format "Filewatch-Mode (Currently %s)"
98 | (if treemacs-filewatch-mode "Enabled" "Disabled"))
99 | treemacs-filewatch-mode]
100 | [,(format "Fringe-Indicator-Mode (Currently %s)"
101 | (if treemacs-fringe-indicator-mode "Enabled" "Disabled"))
102 | treemacs-fringe-indicator-mode])))
103 | (choice (x-popup-menu event menu)))
104 | (when choice (call-interactively (lookup-key menu (apply 'vector choice))))) )
105 | 'face 'treemacs-header-button-face)
106 | "Header button to open a minor-modes/toggles administration menu."))
107 |
108 | (defconst treemacs-header-buttons-format
109 | (concat " " treemacs-header-close-button
110 | " " treemacs-header-projects-button
111 | " " treemacs-header-workspace-button
112 | " " treemacs-header-toggles-button)
113 | "Possible value setting for `treemacs-header-line-format'.
114 | Consists for 4 different buttons:
115 | - `treemacs-header-close-button'
116 | - `treemacs-header-projects-button'
117 | - `treemacs-header-workspace-button'
118 | - `treemacs-header-toggles-button'")
119 |
120 | (defun treemacs--header-top-scroll-indicator ()
121 | "Determine header line for `treemacs-indicate-top-scroll-mode'."
122 | (if (= (window-start) (point-min))
123 | (car treemacs-header-scroll-indicators)
124 | (cdr treemacs-header-scroll-indicators)))
125 |
126 | ;;;###autoload
127 | (define-minor-mode treemacs-indicate-top-scroll-mode
128 | "Minor mode which shows whether treemacs is scrolled all the way to the top.
129 |
130 | When this mode is enabled the header line of the treemacs window will display
131 | whether the window's first line is visible or not.
132 |
133 | The strings used for the display are determined by
134 | `treemacs-header-scroll-indicators'.
135 |
136 | This mode makes use of `treemacs-user-header-line-format' - and thus
137 | `header-line-format' - and is therefore incompatible with other modifications to
138 | these options."
139 | :init-value nil
140 | :global t
141 | :group 'treemacs
142 | (setf treemacs-user-header-line-format
143 | (when treemacs-indicate-top-scroll-mode
144 | '("%e" (:eval (treemacs--header-top-scroll-indicator)))))
145 | (treemacs-run-in-every-buffer
146 | (setf header-line-format treemacs-user-header-line-format)))
147 |
148 | (provide 'treemacs-header-line)
149 |
150 | ;;; treemacs-header-line.el ends here
151 |
--------------------------------------------------------------------------------
/src/elisp/treemacs-logging.el:
--------------------------------------------------------------------------------
1 | ;;; treemacs.el --- A tree style file viewer package -*- lexical-binding: t -*-
2 |
3 | ;; Copyright (C) 2024 Alexander Miller
4 |
5 | ;; This program is free software; you can redistribute it and/or modify
6 | ;; it under the terms of the GNU General Public License as published by
7 | ;; the Free Software Foundation, either version 3 of the License, or
8 | ;; (at your option) any later version.
9 |
10 | ;; This program is distributed in the hope that it will be useful,
11 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | ;; GNU General Public License for more details.
14 |
15 | ;; You should have received a copy of the GNU General Public License
16 | ;; along with this program. If not, see .
17 |
18 | ;;; Commentary:
19 |
20 | ;; Implementation for logging messages.
21 |
22 | ;;; Code:
23 |
24 | (require 'treemacs-customization)
25 |
26 | (defvar treemacs--saved-eldoc-display nil
27 | "Stores the value of `treemacs-eldoc-display'.
28 | The value is set to nil and stashed here with every log statement to prevent the
29 | logged message being almost immediately overridden by the eldoc output.
30 |
31 | The value is also stashed as a single-item-list which serves as a check make
32 | sure it isn't stashed twice (thus stashing the already disabled nil value).")
33 |
34 | (defvar treemacs--no-messages nil
35 | "When set to t `treemacs-log' will produce no output.
36 | Not used directly, but as part of `treemacs-without-messages'.")
37 |
38 | (defun treemacs--restore-eldoc-after-log ()
39 | "Restore the stashed value of `treemacs-eldoc-display'."
40 | (remove-hook 'pre-command-hook #'treemacs--restore-eldoc-after-log)
41 | (setf treemacs-eldoc-display (car treemacs--saved-eldoc-display)
42 | treemacs--saved-eldoc-display nil))
43 |
44 | (defmacro treemacs-without-messages (&rest body)
45 | "Temporarily turn off messages to execute BODY."
46 | (declare (debug t))
47 | `(let ((treemacs--no-messages t))
48 | ,@body))
49 |
50 | (defmacro treemacs--do-log (prefix msg &rest args)
51 | "Print a log statement with the given PREFIX and MSG and format ARGS."
52 | `(progn
53 | (unless (consp treemacs--saved-eldoc-display)
54 | (setf treemacs--saved-eldoc-display (list treemacs-eldoc-display)))
55 | (setf treemacs-eldoc-display nil)
56 | (unless treemacs--no-messages
57 | (message "%s %s" ,prefix (format ,msg ,@args)))
58 | (add-hook 'pre-command-hook #'treemacs--restore-eldoc-after-log)))
59 |
60 | (defmacro treemacs-log (msg &rest args)
61 | "Write an info/success log statement given format string MSG and ARGS."
62 | (declare (indent 1))
63 | `(treemacs--do-log
64 | (propertize "[Treemacs]" 'face 'font-lock-keyword-face)
65 | ,msg ,@args))
66 |
67 | (defmacro treemacs-log-failure (msg &rest args)
68 | "Write a warning/failure log statement given format string MSG and ARGS."
69 | (declare (indent 1))
70 | `(treemacs--do-log
71 | (propertize "[Treemacs]" 'face '((:inherit warning :weight bold)))
72 | ,msg ,@args))
73 |
74 | (defmacro treemacs-log-err (msg &rest args)
75 | "Write an error log statement given format string MSG and ARGS."
76 | (declare (indent 1))
77 | `(treemacs--do-log
78 | (propertize "[Treemacs]" 'face '((:inherit error :weight bold)))
79 | ,msg ,@args))
80 |
81 | (provide 'treemacs-logging)
82 |
83 | ;;; treemacs-logging.el ends here
84 |
--------------------------------------------------------------------------------
/src/elisp/treemacs-peek-mode.el:
--------------------------------------------------------------------------------
1 | ;;; treemacs.el --- A tree style file viewer package -*- lexical-binding: t -*-
2 |
3 | ;; Copyright (C) 2024 Alexander Miller
4 |
5 | ;; This program is free software; you can redistribute it and/or modify
6 | ;; it under the terms of the GNU General Public License as published by
7 | ;; the Free Software Foundation, either version 3 of the License, or
8 | ;; (at your option) any later version.
9 |
10 | ;; This program is distributed in the hope that it will be useful,
11 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | ;; GNU General Public License for more details.
14 |
15 | ;; You should have received a copy of the GNU General Public License
16 | ;; along with this program. If not, see .
17 |
18 | ;;; Commentary:
19 |
20 | ;; TODO
21 |
22 | ;; NOTE: This module is lazy-loaded.
23 |
24 |
25 | ;;; Code:
26 |
27 | (require 'treemacs-tags)
28 | (require 'treemacs-core-utils)
29 |
30 | (eval-when-compile
31 | (require 'treemacs-macros))
32 |
33 | (defvar treemacs--peek-timer nil)
34 |
35 | (defvar treemacs--peeked-buffers nil)
36 |
37 | (defvar treemacs--pre-peek-state nil
38 | "List of window, buffer to restore and buffer to kill treemacs used for peeking.")
39 |
40 | (defun treemacs--kill-peek-buffers ()
41 | "Kill buffers opened during peeking that are no longer needed."
42 | (-each treemacs--peeked-buffers #'kill-buffer)
43 | (setf treemacs--peeked-buffers nil))
44 |
45 | (defun treemacs--setup-peek-buffer (path)
46 | "Setup the peek buffer and window for PATH."
47 | (let* ((inhibit-message t)
48 | (file-buffer (get-file-buffer path))
49 | (next-window (next-window (selected-window)))
50 | (window (if file-buffer
51 | (or (get-buffer-window file-buffer)
52 | next-window)
53 | next-window)))
54 | (save-selected-window
55 | (select-window window)
56 | (unless treemacs--pre-peek-state
57 | (setf treemacs--pre-peek-state (list window (window-buffer window))))
58 | (if file-buffer
59 | (switch-to-buffer file-buffer :norecord)
60 | (find-file-existing path)
61 | (add-to-list 'treemacs--peeked-buffers (current-buffer))))))
62 |
63 | (defun treemacs--do-peek ()
64 | "Timer callback to set up the peeked buffer.
65 | Check if the node at point is a file, and if yes take a peek."
66 | (when (eq t treemacs--in-this-buffer)
67 | (let* ((btn (treemacs-current-button))
68 | (path (and btn (treemacs-button-get btn :path))))
69 | (when (and path
70 | (stringp path)
71 | (file-exists-p path))
72 | (treemacs--setup-peek-buffer path)))))
73 |
74 | (defun treemacs--finish-peek-on-window-leave (&optional _)
75 | "Finish peeking when the treemacs window is no longer selected.
76 | Shut down peek-mode while making sure that the current buffer will not be
77 | purged."
78 | (let ((treemacs-buffer (treemacs-get-local-buffer))
79 | (current-buffer (current-buffer)))
80 | (unless (equal treemacs-buffer current-buffer)
81 | (setf treemacs--peeked-buffers
82 | (delete current-buffer treemacs--peeked-buffers))
83 | (treemacs-peek-mode -1))))
84 |
85 | (defun treemacs--disable-peek-mode ()
86 | "Hook function for `treemacs-quit-hook'."
87 | (treemacs-peek-mode -1))
88 |
89 | (defun treemacs--setup-peek-mode ()
90 | "Set up faces, timers, and hooks etc."
91 | (when treemacs--fringe-indicator-overlay
92 | (overlay-put treemacs--fringe-indicator-overlay
93 | 'face 'treemacs-peek-mode-indicator-face))
94 | (when treemacs--peek-timer (cancel-timer treemacs--peek-timer))
95 | (setf treemacs--peek-timer
96 | (run-with-idle-timer 0.5 :repeat #'treemacs--do-peek))
97 | (add-hook
98 | 'window-selection-change-functions #'treemacs--finish-peek-on-window-leave
99 | nil :local)
100 | (add-hook 'treemacs-quit-hook #'treemacs--disable-peek-mode))
101 |
102 | (defun treemacs--tear-down-peek-mode (&optional restore-window)
103 | "Tear down faces, timers.
104 | Restore the initial window buffer when RESTORE-WINDOW is non-nil. Will only
105 | happen when `treemacs-peek-mode' has been called interactively, when the
106 | tear-down happens on account of the window-leave hook the current buffer is
107 | kept."
108 | (with-current-buffer (treemacs-get-local-buffer)
109 | (when treemacs--fringe-indicator-overlay
110 | (overlay-put treemacs--fringe-indicator-overlay
111 | 'face 'treemacs-fringe-indicator-face))
112 | (when treemacs--peek-timer (cancel-timer treemacs--peek-timer))
113 | (treemacs--kill-peek-buffers)
114 | (remove-hook
115 | 'window-selection-change-functions
116 | #'treemacs--finish-peek-on-window-leave
117 | :local)
118 | (when (and restore-window treemacs--pre-peek-state)
119 | (-let [(window buffer) treemacs--pre-peek-state]
120 | (with-selected-window window
121 | (switch-to-buffer buffer))))
122 | (setf treemacs--pre-peek-state nil))
123 | (remove-hook 'treemacs-quit-hook #'treemacs--disable-peek-mode))
124 |
125 | ;;;###autoload
126 | (define-minor-mode treemacs-peek-mode
127 | "Minor mode that allows you to peek at buffers before deciding to open them.
128 |
129 | While the mode is active treemacs will automatically display the file at point,
130 | without leaving the treemacs window.
131 |
132 | Peeking will stop when you leave the treemacs window, be it through a command
133 | like `treemacs-RET-action' or some other window selection change.
134 |
135 | Files' buffers that have been opened for peeking will be cleaned up if they did
136 | not exist before peeking started.
137 |
138 | The peeked window can be scrolled using
139 | `treemacs-next/previous-line-other-window' and
140 | `treemacs-next/previous-page-other-window'"
141 | :init-value nil
142 | :global t
143 | :lighter nil
144 | :group 'treemacs
145 | (if treemacs-peek-mode
146 | (progn
147 | (unless (boundp 'window-selection-change-functions)
148 | (user-error "%s %s"
149 | "Peek-mode is only available in Emacs"
150 | "versions that support `window-selection-change-functions'"))
151 | (treemacs--setup-peek-mode))
152 | (treemacs--tear-down-peek-mode (called-interactively-p 'interactive))))
153 |
154 | (provide 'treemacs-peek-mode)
155 |
156 | ;;; treemacs-peek-mode.el ends here
157 |
--------------------------------------------------------------------------------
/src/elisp/treemacs-project-follow-mode.el:
--------------------------------------------------------------------------------
1 | ;;; treemacs.el --- A tree style file viewer package -*- lexical-binding: t -*-
2 |
3 | ;; Copyright (C) 2024 Alexander Miller
4 |
5 | ;; This program is free software; you can redistribute it and/or modify
6 | ;; it under the terms of the GNU General Public License as published by
7 | ;; the Free Software Foundation, either version 3 of the License, or
8 | ;; (at your option) any later version.
9 |
10 | ;; This program is distributed in the hope that it will be useful,
11 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | ;; GNU General Public License for more details.
14 |
15 | ;; You should have received a copy of the GNU General Public License
16 | ;; along with this program. If not, see .
17 |
18 | ;;; Commentary:
19 |
20 | ;; Minor mode to automatically display just the current project.
21 |
22 | ;; NOTE: This module is lazy-loaded.
23 |
24 | ;;; Code:
25 |
26 | (require 'treemacs-scope)
27 | (require 'treemacs-follow-mode)
28 | (require 'treemacs-core-utils)
29 | (eval-when-compile
30 | (require 'treemacs-macros))
31 |
32 | (defvar treemacs--project-follow-timer nil
33 | "Idle timer for `treemacs-project-follow-mode'.")
34 |
35 | (defconst treemacs--project-follow-delay 1.5
36 | "Delay in seconds for `treemacs-project-follow-mode'.")
37 |
38 | (defun treemacs--follow-project (_)
39 | "Debounced display of the current project for `treemacs-project-follow-mode'.
40 | Used as a hook for `window-buffer-change-functions', thus the ignored parameter."
41 | (treemacs-debounce treemacs--project-follow-timer treemacs--project-follow-delay
42 | (treemacs--do-follow-project)))
43 |
44 | (defun treemacs--do-follow-project()
45 | "Actual, un-debounced, implementation of project following."
46 | (-when-let (window (treemacs-get-local-window))
47 | (treemacs-block
48 | (let* ((ws (treemacs-current-workspace))
49 | (new-project-path (treemacs--find-current-user-project))
50 | (old-project-path (-some-> ws
51 | (treemacs-workspace->projects)
52 | (car)
53 | (treemacs-project->path))))
54 | (treemacs-return-if
55 | (or treemacs--in-this-buffer
56 | (null new-project-path)
57 | (and
58 | (null treemacs-project-follow-into-home)
59 | (string=
60 | (expand-file-name "~")
61 | new-project-path))
62 | (bound-and-true-p edebug-mode)
63 | (frame-parent)
64 | (and (= 1 (length (treemacs-workspace->projects ws)))
65 | (string= new-project-path old-project-path))))
66 | (save-selected-window
67 | (treemacs--show-single-project
68 | new-project-path (treemacs--filename new-project-path))
69 | (treemacs--follow)
70 | (hl-line-highlight))))))
71 |
72 | (defun treemacs--follow-project-after-buffer-init ()
73 | "Hook to follow the current project when a treemacs buffer is created.
74 | Used for `treemacs-post-buffer-init-hook', so it will run inside the treemacs
75 | window."
76 | (with-selected-window (next-window (selected-window))
77 | (treemacs--do-follow-project)))
78 |
79 | (defun treemacs--setup-project-follow-mode ()
80 | "Setup all the hooks needed for `treemacs-project-follow-mode'."
81 | (when treemacs--project-follow-timer (cancel-timer treemacs--project-follow-timer))
82 | (setf treemacs--project-follow-timer nil)
83 | (add-hook 'window-buffer-change-functions #'treemacs--follow-project)
84 | (add-hook 'window-selection-change-functions #'treemacs--follow-project)
85 | (add-hook 'treemacs-post-buffer-init-hook #'treemacs--follow-project-after-buffer-init))
86 |
87 | (defun treemacs--tear-down-project-follow-mode ()
88 | "Remove the hooks added by `treemacs--setup-project-follow-mode'."
89 | (cancel-timer treemacs--project-follow-timer)
90 | (remove-hook 'window-buffer-change-functions #'treemacs--follow-project)
91 | (remove-hook 'window-selection-change-functions #'treemacs--follow-project)
92 | (remove-hook 'treemacs-post-buffer-init-hook #'treemacs--follow-project-after-buffer-init))
93 |
94 | ;;;###autoload
95 | (define-minor-mode treemacs-project-follow-mode
96 | "Toggle `treemacs-only-current-project-mode'.
97 |
98 | This is a minor mode meant for those who do not care about treemacs' workspace
99 | features, or its preference to work with multiple projects simultaneously. When
100 | enabled it will function as an automated version of
101 | `treemacs-display-current-project-exclusively', making sure that, after a small
102 | idle delay, the current project, and *only* the current project, is displayed in
103 | treemacs.
104 |
105 | The project detection is based on the current buffer, and will try to determine
106 | the project using the following methods, in the order they are listed:
107 |
108 | - the current projectile.el project, if `treemacs-projectile' is installed
109 | - the current project.el project
110 | - the current `default-directory'
111 |
112 | The update will only happen when treemacs is in the foreground, meaning a
113 | treemacs window must exist in the current scope.
114 |
115 | This mode requires at least Emacs version 27 since it relies on
116 | `window-buffer-change-functions' and `window-selection-change-functions'."
117 | :init-value nil
118 | :global t
119 | :lighter nil
120 | :group 'treemacs
121 | (if treemacs-project-follow-mode
122 | (progn
123 | (unless (and (boundp 'window-buffer-change-functions)
124 | (boundp 'window-selection-change-functions))
125 | (user-error "%s %s"
126 | "Project-Follow-Mode is only available in Emacs"
127 | "versions that support `window-buffer-change-functions'"))
128 | (treemacs--setup-project-follow-mode))
129 | (treemacs--tear-down-project-follow-mode)))
130 |
131 | (provide 'treemacs-project-follow-mode)
132 |
133 | ;;; treemacs-project-follow-mode.el ends here
134 |
--------------------------------------------------------------------------------
/src/elisp/treemacs-themes.el:
--------------------------------------------------------------------------------
1 | ;;; treemacs.el --- A tree style file viewer package -*- lexical-binding: t -*-
2 |
3 | ;; Copyright (C) 2024 Alexander Miller
4 |
5 | ;; This program is free software; you can redistribute it and/or modify
6 | ;; it under the terms of the GNU General Public License as published by
7 | ;; the Free Software Foundation, either version 3 of the License, or
8 | ;; (at your option) any later version.
9 |
10 | ;; This program is distributed in the hope that it will be useful,
11 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | ;; GNU General Public License for more details.
14 |
15 | ;; You should have received a copy of the GNU General Public License
16 | ;; along with this program. If not, see .
17 |
18 | ;;; Commentary:
19 |
20 | ;; Definitions for the theme type, their creation, and, the means to
21 | ;; change themes.
22 |
23 | ;;; Code:
24 |
25 | (require 'dash)
26 | (require 'ht)
27 | (require 'treemacs-core-utils)
28 | (require 'treemacs-logging)
29 |
30 | (eval-when-compile
31 | (require 'inline)
32 | (require 'treemacs-macros)
33 | (require 'cl-lib))
34 |
35 | (eval-when-compile
36 | (cl-declaim (optimize (speed 3) (safety 0))))
37 |
38 | (treemacs-import-functions-from "treemacs-icons"
39 | treemacs--select-icon-set)
40 |
41 | (cl-defstruct (treemacs-theme
42 | (:conc-name treemacs-theme->)
43 | (:constructor treemacs-theme->create!)
44 | (:named t))
45 | name path gui-icons tui-icons)
46 |
47 | (defvar treemacs--current-theme nil "The currently used theme.")
48 |
49 | (defvar treemacs--themes nil "List of all known themes.")
50 |
51 | (define-inline treemacs-current-theme ()
52 | "Get the current theme."
53 | (declare (side-effect-free t))
54 | (inline-quote treemacs--current-theme))
55 |
56 | (define-inline treemacs--find-theme (name)
57 | "Find theme with the given NAME."
58 | (declare (side-effect-free t))
59 | (inline-letevals (name)
60 | (inline-quote
61 | (--first (string= (treemacs-theme->name it) ,name) treemacs--themes))))
62 |
63 | (cl-defmacro treemacs-create-theme (name &key icon-directory extends config)
64 | "Create a new (bare) theme with the given NAME.
65 | - ICON-DIRECTORY is the (mandatory) theme's location.
66 | - EXTENDS is the theme to be extended.
67 | - CONFIG is a code block to fill the created theme with icons via
68 | `treemacs-create-icon'."
69 | (declare (indent 1))
70 | `(let* ((gui-icons (make-hash-table :size 300 :test 'equal))
71 | (tui-icons (make-hash-table :size 300 :test 'equal))
72 | (theme (treemacs-theme->create!
73 | :name ,name
74 | :path ,icon-directory
75 | :gui-icons gui-icons
76 | :tui-icons tui-icons)))
77 | (add-to-list 'treemacs--themes theme)
78 | ,(when extends
79 | `(treemacs-unless-let (base-theme (treemacs--find-theme ,extends))
80 | (treemacs-log-failure "Could not find base theme %s when creating theme %s." ,extends ,name)
81 | (treemacs--maphash (treemacs-theme->gui-icons base-theme) (ext icon)
82 | (ht-set! gui-icons ext icon))
83 | (treemacs--maphash (treemacs-theme->tui-icons base-theme) (ext icon)
84 | (ht-set! tui-icons ext icon))))
85 | (-let [treemacs--current-theme theme]
86 | ,config
87 | (treemacs--propagate-new-icons theme))
88 | ,name))
89 |
90 | (cl-defmacro treemacs-modify-theme (theme &key icon-directory config)
91 | "Modify an existing THEME.
92 | - THEME can either be a treemacs-theme object or the name of a theme.
93 | - For the scope of the modification an alternative ICON-DIRECTORY can also be
94 | used.
95 | - CONFIG will be applied to the THEME in the same manner as in
96 | `treemacs-create-theme'."
97 | (declare (indent 1))
98 | (treemacs-static-assert (not (null theme))
99 | "Theme may not be null.")
100 | `(treemacs-unless-let (theme (if (stringp ,theme) (treemacs--find-theme ,theme) ,theme))
101 | (user-error "Theme '%s' does not exist" ,theme)
102 | (let* ((treemacs--current-theme theme)
103 | (original-icon-dir (treemacs-theme->path theme))
104 | (new-icon-dir (if ,icon-directory ,icon-directory original-icon-dir)))
105 | (unwind-protect
106 | (progn
107 | (setf (treemacs-theme->path theme) new-icon-dir)
108 | ,config
109 | (treemacs--propagate-new-icons theme))
110 | (setf (treemacs-theme->path theme) original-icon-dir))
111 | nil)))
112 |
113 | (defun treemacs--propagate-new-icons (theme)
114 | "Add THEME's new icons to the other themes."
115 | (unless (string= (treemacs-theme->name theme) "Default")
116 | (dolist (other-theme (delete theme treemacs--themes))
117 | (pcase-dolist (`(,current-icons . ,other-icons)
118 | `(,(cons (treemacs-theme->gui-icons theme)
119 | (treemacs-theme->gui-icons other-theme))
120 | ,(cons (treemacs-theme->tui-icons theme)
121 | (treemacs-theme->tui-icons other-theme))))
122 | (treemacs--maphash current-icons (ext icon)
123 | (unless (ht-get other-icons ext)
124 | (ht-set! other-icons ext icon)))))))
125 |
126 | (defun treemacs-load-theme (name)
127 | "Load the theme with the given NAME.
128 | Note that some changes will only take effect after a treemacs buffer was killed
129 | and restored."
130 | (interactive
131 | (list (completing-read "Theme: " (-map #'treemacs-theme->name treemacs--themes))))
132 | (treemacs-unless-let (theme (treemacs--find-theme name))
133 | (treemacs-log-failure "Cannot find theme '%s'." name)
134 | (setq treemacs--current-theme theme)
135 | (dolist (buffer (buffer-list))
136 | (when (memq (buffer-local-value 'major-mode buffer) '(treemacs-mode dired-mode))
137 | (with-current-buffer buffer
138 | (treemacs--select-icon-set))))))
139 |
140 | (provide 'treemacs-themes)
141 |
142 | ;;; treemacs-themes.el ends here
143 |
--------------------------------------------------------------------------------
/src/elisp/treemacs-visuals.el:
--------------------------------------------------------------------------------
1 | ;;; treemacs.el --- A tree style file viewer package -*- lexical-binding: t -*-
2 |
3 | ;; Copyright (C) 2024 Alexander Miller
4 |
5 | ;; This program is free software; you can redistribute it and/or modify
6 | ;; it under the terms of the GNU General Public License as published by
7 | ;; the Free Software Foundation, either version 3 of the License, or
8 | ;; (at your option) any later version.
9 |
10 | ;; This program is distributed in the hope that it will be useful,
11 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | ;; GNU General Public License for more details.
14 |
15 | ;; You should have received a copy of the GNU General Public License
16 | ;; along with this program. If not, see .
17 |
18 | ;;; Commentary:
19 |
20 | ;; Handling of visuals in general and icons in particular.
21 |
22 | ;;; Code:
23 |
24 | (require 'image)
25 | (require 'pulse)
26 | (require 'hl-line)
27 | (require 'treemacs-core-utils)
28 | (require 'treemacs-scope)
29 | (require 'treemacs-themes)
30 | (require 'treemacs-icons)
31 | (require 'treemacs-customization)
32 | (require 'treemacs-fringe-indicator)
33 | (require 'treemacs-logging)
34 |
35 | (eval-when-compile
36 | (require 'inline)
37 | (require 'treemacs-macros))
38 |
39 | (treemacs-import-functions-from "treemacs-icons"
40 | treemacs-get-icon-value)
41 |
42 | (defvar-local treemacs--indentation-string-cache-key nil
43 | "Cache key for `treemacs--indentation-string-cache.")
44 | (defvar-local treemacs--indentation-string-cache (vector)
45 | "Cached propertized indentation.")
46 |
47 | (defvar treemacs--indent-guide-mode nil)
48 |
49 | (defvar treemacs--saved-indent-settings nil
50 | "Saved settings overridden by `treemacs-indent-guide-mode'.
51 | Used to save the values of `treemacs-indentation' and
52 | `treemacs-indentation-string'.")
53 |
54 | (defun treemacs--do-pulse (face)
55 | "Visually pulse current line using FACE."
56 | (pulse-momentary-highlight-one-line (point) face))
57 |
58 | (defsubst treemacs-pulse-on-success (&rest log-args)
59 | "Pulse current line with `treemacs-on-success-pulse-face'.
60 | Optionally issue a log statement with LOG-ARGS."
61 | (declare (indent 1))
62 | (when log-args
63 | (treemacs-log (apply #'format log-args)))
64 | (when treemacs-pulse-on-success
65 | (treemacs--do-pulse 'treemacs-on-success-pulse-face)))
66 |
67 | (defsubst treemacs-pulse-on-failure (&rest log-args)
68 | "Pulse current line with `treemacs-on-failure-pulse-face'.
69 | Optionally issue a log statement with LOG-ARGS."
70 | (declare (indent 1))
71 | (when log-args
72 | (treemacs-log-failure (apply #'format log-args)))
73 | (when treemacs-pulse-on-failure
74 | (treemacs--do-pulse 'treemacs-on-failure-pulse-face)))
75 |
76 | (defun treemacs--build-indentation-cache (depth)
77 | "Rebuild indentation string cache up to DEPTH levels deep."
78 | (setq treemacs--indentation-string-cache
79 | (make-vector (1+ depth) nil)
80 | treemacs--indentation-string-cache-key
81 | (cons treemacs-indentation treemacs-indentation-string))
82 | (dotimes (i (1+ depth))
83 | (aset treemacs--indentation-string-cache i
84 | (cond
85 | ((listp treemacs-indentation-string)
86 | (let ((str nil)
87 | (len (length treemacs-indentation-string)))
88 | (dotimes (n i)
89 | (setf str (concat str
90 | (nth (% n len) treemacs-indentation-string))))
91 | str))
92 | ((integerp treemacs-indentation)
93 | (s-repeat (* i treemacs-indentation) treemacs-indentation-string))
94 | ((not window-system)
95 | (s-repeat (* i 2) treemacs-indentation-string))
96 | (t (propertize " "
97 | 'display
98 | `(space . (:width (,(* (car treemacs-indentation)
99 | i))))))))))
100 |
101 | (define-inline treemacs--get-indentation (depth)
102 | "Gets an indentation string DEPTH levels deep."
103 | (inline-letevals (depth)
104 | (inline-quote
105 | (progn
106 | (when (or (>= ,depth (length treemacs--indentation-string-cache))
107 | (not (eq (car treemacs--indentation-string-cache-key) treemacs-indentation))
108 | ;; Eq is faster than string comparison, and accidentally
109 | ;; rebuilding the cache in some corner case is not disastrous.
110 | (not (eq (cdr treemacs--indentation-string-cache-key) treemacs-indentation-string)))
111 | (treemacs--build-indentation-cache ,depth))
112 | (aref treemacs--indentation-string-cache ,depth)))))
113 |
114 | (define-minor-mode treemacs-indent-guide-mode
115 | "Toggle `treemacs-indent-guide-mode'.
116 | When enabled treemacs will show simple indent guides for its folder structure.
117 | The effect is achieved by overriding the values of `treemacs-indentation' and
118 | `treemacs-indentation-string'. Disabling the mode will restore the previously
119 | used settings."
120 | :init-value nil
121 | :global t
122 | :lighter nil
123 | :group 'treemacs
124 | (if treemacs-indent-guide-mode
125 | (progn
126 | (setf
127 | treemacs--saved-indent-settings
128 | (cons treemacs-indentation treemacs-indentation-string)
129 | treemacs-indentation 1
130 | treemacs-indentation-string
131 | (pcase-exhaustive treemacs-indent-guide-style
132 | ('line (propertize " ┃ " 'face 'font-lock-comment-face))
133 | ('block (list
134 | " "
135 | (propertize "██" 'face 'font-lock-comment-face))))))
136 | (setf treemacs-indentation (car treemacs--saved-indent-settings)
137 | treemacs-indentation-string (cdr treemacs--saved-indent-settings)))
138 | (treemacs-without-messages
139 | (treemacs-run-in-every-buffer
140 | (treemacs--do-refresh (current-buffer) 'all))))
141 |
142 | (provide 'treemacs-visuals)
143 |
144 | ;;; treemacs-visuals.el ends here
145 |
--------------------------------------------------------------------------------
/src/extra/treemacs-evil.el:
--------------------------------------------------------------------------------
1 | ;;; treemacs-evil.el --- Evil mode integration for treemacs -*- lexical-binding: t -*-
2 |
3 | ;; Copyright (C) 2024 Alexander Miller
4 |
5 | ;; Author: Alexander Miller
6 | ;; Package-Requires: ((emacs "26.1") (evil "1.2.12") (treemacs "0.0"))
7 | ;; Version: 0
8 | ;; Homepage: https://github.com/Alexander-Miller/treemacs
9 |
10 | ;; This program is free software; you can redistribute it and/or modify
11 | ;; it under the terms of the GNU General Public License as published by
12 | ;; the Free Software Foundation, either version 3 of the License, or
13 | ;; (at your option) any later version.
14 |
15 | ;; This program is distributed in the hope that it will be useful,
16 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 | ;; GNU General Public License for more details.
19 |
20 | ;; You should have received a copy of the GNU General Public License
21 | ;; along with this program. If not, see .
22 |
23 | ;;; Commentary:
24 | ;;; Evil mode compatibility.
25 |
26 | ;;; Code:
27 |
28 | (require 'evil)
29 | (require 'treemacs)
30 |
31 | (treemacs-import-functions-from "treemacs-hydras"
32 | treemacs-common-helpful-hydra
33 | treemacs-advanced-helpful-hydra)
34 |
35 | (treemacs-import-functions-from "treemacs-mouse-interface"
36 | treemacs-dragleftclick-action
37 | treemacs-leftclick-action)
38 |
39 | (treemacs-import-functions-from "treemacs-mouse-interface"
40 | treemacs-copy-file)
41 |
42 | (declare-function treemacs-add-bookmark "treemacs-bookmarks.el")
43 |
44 | (declare-function treemacs-git-commit-diff-mode "treemacs-commit-diff-mode.el")
45 |
46 | (evil-define-state treemacs
47 | "Treemacs state"
48 | :cursor '(bar . 0)
49 | :enable (motion))
50 |
51 | (evil-set-initial-state 'treemacs-mode 'treemacs)
52 |
53 | (defun treemacs-evil---turn-off-visual-state-after-click (&rest _)
54 | "Go back to `evil-treemacs-state' after a mouse click."
55 | ;; a double click will likely have opened a file so we need to make
56 | ;; sure to go back in the right buffer
57 | (--when-let (treemacs-get-local-buffer)
58 | (with-current-buffer it
59 | (evil-treemacs-state))))
60 |
61 | (defun treemacs-evil--window-move-compatibility-advice (orig-fun &rest args)
62 | "Close Treemacs while moving windows around.
63 | Then call ORIG-FUN with its ARGS and reopen treemacs if it was open before."
64 | (let* ((treemacs-window (treemacs-get-local-window))
65 | (is-active (and treemacs-window (window-live-p treemacs-window))))
66 | (when is-active (treemacs))
67 | (apply orig-fun args)
68 | (when is-active
69 | (save-selected-window
70 | (treemacs)))))
71 |
72 | (dolist (func '(evil-window-move-far-left
73 | evil-window-move-far-right
74 | evil-window-move-very-top
75 | evil-window-move-very-bottom))
76 | (advice-add func :around #'treemacs-evil--window-move-compatibility-advice))
77 |
78 | (advice-add 'treemacs-leftclick-action :after #'treemacs-evil---turn-off-visual-state-after-click)
79 | (advice-add 'treemacs-doubleclick-action :after #'treemacs-evil---turn-off-visual-state-after-click)
80 |
81 | (define-key evil-treemacs-state-map (kbd "j") #'treemacs-next-line)
82 | (define-key evil-treemacs-state-map (kbd "k") #'treemacs-previous-line)
83 | (define-key evil-treemacs-state-map (kbd "M-j") #'treemacs-next-neighbour)
84 | (define-key evil-treemacs-state-map (kbd "M-k") #'treemacs-previous-neighbour)
85 | (define-key evil-treemacs-state-map (kbd "M-J") #'treemacs-next-line-other-window)
86 | (define-key evil-treemacs-state-map (kbd "M-K") #'treemacs-previous-line-other-window)
87 | (define-key evil-treemacs-state-map (kbd "th") #'treemacs-toggle-show-dotfiles)
88 | (define-key evil-treemacs-state-map (kbd "ti") #'treemacs-hide-gitignored-files-mode)
89 | (define-key evil-treemacs-state-map (kbd "tw") #'treemacs-toggle-fixed-width)
90 | (define-key evil-treemacs-state-map (kbd "tv") #'treemacs-fringe-indicator-mode)
91 | (define-key evil-treemacs-state-map (kbd "tf") #'treemacs-follow-mode)
92 | (define-key evil-treemacs-state-map (kbd "ta") #'treemacs-filewatch-mode)
93 | (define-key evil-treemacs-state-map (kbd "tg") #'treemacs-git-mode)
94 | (define-key evil-treemacs-state-map (kbd "tc") #'treemacs-indicate-top-scroll-mode)
95 | (define-key evil-treemacs-state-map (kbd "td") #'treemacs-git-commit-diff-mode)
96 | (define-key evil-treemacs-state-map (kbd "tn") #'treemacs-indent-guide-mode)
97 | (define-key evil-treemacs-state-map (kbd "w") #'treemacs-set-width)
98 | (define-key evil-treemacs-state-map (kbd ">") #'treemacs-increase-width)
99 | (define-key evil-treemacs-state-map (kbd "<") #'treemacs-decrease-width)
100 | (define-key evil-treemacs-state-map (kbd "b") #'treemacs-add-bookmark)
101 | (define-key evil-treemacs-state-map (kbd "?") #'treemacs-common-helpful-hydra)
102 | (define-key evil-treemacs-state-map (kbd "C-?") #'treemacs-advanced-helpful-hydra)
103 | (define-key evil-treemacs-state-map (kbd "RET") #'treemacs-RET-action)
104 | (define-key evil-treemacs-state-map (kbd "TAB") #'treemacs-TAB-action)
105 | (define-key evil-treemacs-state-map (kbd "H") #'treemacs-collapse-parent-node)
106 | (define-key evil-treemacs-state-map (kbd "!") #'treemacs-run-shell-command-for-current-node)
107 | (define-key evil-treemacs-state-map (kbd "=") #'treemacs-fit-window-width)
108 | (define-key evil-treemacs-state-map (kbd "W") #'treemacs-extra-wide-toggle)
109 |
110 | (evil-define-key 'treemacs treemacs-mode-map (kbd "yp") #'treemacs-copy-project-path-at-point)
111 | (evil-define-key 'treemacs treemacs-mode-map (kbd "ya") #'treemacs-copy-absolute-path-at-point)
112 | (evil-define-key 'treemacs treemacs-mode-map (kbd "yr") #'treemacs-copy-relative-path-at-point)
113 | (evil-define-key 'treemacs treemacs-mode-map (kbd "yn") #'treemacs-copy-filename-at-point)
114 | (evil-define-key 'treemacs treemacs-mode-map (kbd "yf") #'treemacs-copy-file)
115 | (evil-define-key 'treemacs treemacs-mode-map (kbd "yv") #'treemacs-paste-dir-at-point-to-minibuffer)
116 | (evil-define-key 'treemacs treemacs-mode-map (kbd "gr") #'treemacs-refresh)
117 | (evil-define-key 'treemacs treemacs-mode-map [down-mouse-1] #'treemacs-leftclick-action)
118 | (evil-define-key 'treemacs treemacs-mode-map [drag-mouse-1] #'treemacs-dragleftclick-action)
119 | (evil-define-key 'treemacs treemacs-mode-map (kbd "h") #'treemacs-COLLAPSE-action)
120 | (evil-define-key 'treemacs treemacs-mode-map (kbd "RET") #'treemacs-RET-action)
121 | (evil-define-key 'treemacs treemacs-mode-map (kbd "l") #'treemacs-RET-action)
122 | (unless (window-system)
123 | (evil-define-key 'treemacs treemacs-mode-map [C-i] #'treemacs-TAB-action))
124 |
125 | (provide 'treemacs-evil)
126 |
127 | ;;; treemacs-evil.el ends here
128 |
--------------------------------------------------------------------------------
/src/extra/treemacs-persp.el:
--------------------------------------------------------------------------------
1 | ;;; treemacs-persp.el --- Persp-mode integration for treemacs -*- lexical-binding: t -*-
2 |
3 | ;; Copyright (C) 2024 Alexander Miller
4 |
5 | ;; Author: Alexander Miller
6 | ;; Package-Requires: ((emacs "26.1") (treemacs "0.0") (persp-mode "2.9.7") (dash "2.11.0"))
7 | ;; Version: 0
8 | ;; Homepage: https://github.com/Alexander-Miller/treemacs
9 |
10 | ;; This program is free software; you can redistribute it and/or modify
11 | ;; it under the terms of the GNU General Public License as published by
12 | ;; the Free Software Foundation, either version 3 of the License, or
13 | ;; (at your option) any later version.
14 |
15 | ;; This program is distributed in the hope that it will be useful,
16 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 | ;; GNU General Public License for more details.
19 |
20 | ;; You should have received a copy of the GNU General Public License
21 | ;; along with this program. If not, see .
22 |
23 | ;;; Commentary:
24 | ;;; Integration of persp-mode into treemacs' buffer scoping framework.
25 |
26 | ;;; Code:
27 |
28 | (require 'treemacs)
29 | (require 'persp-mode)
30 | (require 'eieio)
31 | (require 'dash)
32 |
33 | (eval-when-compile
34 | (require 'treemacs-macros)
35 | (require 'cl-lib))
36 |
37 | ;; remove base compatibility hook
38 | (remove-hook 'persp-activated-functions #'treemacs--remove-treemacs-window-in-new-frames)
39 |
40 | (defclass treemacs-persp-scope (treemacs-scope) () :abstract t)
41 | (add-to-list 'treemacs-scope-types (cons 'Perspectives 'treemacs-persp-scope))
42 |
43 | (cl-defmethod treemacs-scope->current-scope ((_ (subclass treemacs-persp-scope)))
44 | "Get the current perspective as scope.
45 | Returns the symbol `none' if no perspective is active."
46 | (or (get-current-persp) 'none))
47 |
48 | (cl-defmethod treemacs-scope->current-scope-name ((_ (subclass treemacs-persp-scope)) persp)
49 | "Return the name of the given perspective PERSP.
50 | Will return \"No Perspective\" if no perspective is active."
51 | (if (eq 'none persp)
52 | "No Perspective"
53 | (format "Perspective %s" (persp-name persp))))
54 |
55 | (cl-defmethod treemacs-scope->setup ((_ (subclass treemacs-persp-scope)))
56 | "Persp-scope setup."
57 | (add-hook 'persp-activated-functions #'treemacs-persp--on-perspective-switch)
58 | (add-hook 'persp-renamed-functions #'treemacs-persp--on-perspective-rename)
59 | (add-hook 'persp-before-kill-functions #'treemacs--on-scope-kill)
60 | (treemacs-persp--ensure-workspace-exists))
61 |
62 | (cl-defmethod treemacs-scope->cleanup ((_ (subclass treemacs-persp-scope)))
63 | "Persp-scope tear-down."
64 | (remove-hook 'persp-activated-functions #'treemacs-persp--on-perspective-switch)
65 | (remove-hook 'persp-renamed-functions #'treemacs-persp--on-perspective-rename)
66 | (remove-hook 'persp-before-kill-functions #'treemacs--on-scope-kill))
67 |
68 | (defun treemacs-persp--on-perspective-rename (_perspective old-name new-name)
69 | "Hook running after perspective was renamed.
70 | Will rename treemacs perspective workspace OLD-NAME to use NEW-NAME."
71 | (treemacs-do-rename-workspace
72 | (treemacs--find-workspace-by-name (treemacs-persp--format-workspace-name old-name))
73 | (treemacs-persp--format-workspace-name new-name)))
74 |
75 | (defun treemacs-persp--on-perspective-switch (&rest _)
76 | "Hook running after the perspective was switched.
77 | Will select a workspace for the now active perspective, creating it if
78 | necessary."
79 | ;; running with a timer ensures that any other post-processing is finished after a perspective
80 | ;; was run since commands like `spacemacs/helm-persp-switch-project' first create a perspective
81 | ;; and only afterwards select the file to display
82 | (run-with-timer
83 | 0.1 nil
84 | (lambda ()
85 | (treemacs-without-following
86 | (treemacs-persp--ensure-workspace-exists)
87 | (treemacs--change-buffer-on-scope-change)))))
88 |
89 | (defun treemacs-persp--ensure-workspace-exists ()
90 | "Make sure a workspace exists for the given PERSP-NAME.
91 | Matching happens by name. If no workspace can be found it will be created."
92 | (let* ((persp-name (treemacs-scope->current-scope-name
93 | (treemacs-current-scope-type) (treemacs-current-scope)))
94 | (workspace (or (treemacs--find-workspace-by-name persp-name)
95 | (treemacs-persp--create-workspace persp-name))))
96 | (setf (treemacs-current-workspace) workspace)
97 | (treemacs--invalidate-buffer-project-cache)
98 | (run-hooks 'treemacs-switch-workspace-hook)
99 | workspace))
100 |
101 | (defun treemacs-persp--create-workspace (name)
102 | "Create a new workspace for the given persp NAME.
103 | Projects will be found as per `treemacs--find-user-project-functions'. If that
104 | does not return anything the projects of the fallback workspace will be copied."
105 | (treemacs-block
106 | (let* ((ws-result (treemacs-do-create-workspace name))
107 | (ws-status (car ws-result))
108 | (ws (cadr ws-result))
109 | (root-path (treemacs--find-current-user-project))
110 | (project-list))
111 | (unless (eq ws-status 'success)
112 | (treemacs-log "Failed to create workspace for perspective: %s, using fallback instead." ws)
113 | (treemacs-return (car treemacs--workspaces)))
114 | (if root-path
115 | (setf project-list
116 | (list (treemacs-project->create!
117 | :name (treemacs--filename root-path)
118 | :path root-path
119 | :path-status (treemacs--get-path-status root-path))))
120 | (-let [fallback-workspace (car treemacs--workspaces)]
121 | ;; copy the projects instead of reusing them so we don't accidentally rename
122 | ;; a project in 2 workspaces
123 | (dolist (project (treemacs-workspace->projects fallback-workspace))
124 | (push (treemacs-project->create!
125 | :name (treemacs-project->name project)
126 | :path (treemacs-project->path project)
127 | :path-status (treemacs-project->path-status project))
128 | project-list))))
129 | (setf (treemacs-workspace->projects ws) (nreverse project-list))
130 | (treemacs-return ws))))
131 |
132 | (defun treemacs-persp--format-workspace-name (perspective-name)
133 | "Format of the workspace name used for a perspective named PERSPECTIVE-NAME."
134 | (format "Perspective %s" perspective-name))
135 |
136 | (provide 'treemacs-persp)
137 |
138 | ;;; treemacs-persp.el ends here
139 |
--------------------------------------------------------------------------------
/src/extra/treemacs-perspective.el:
--------------------------------------------------------------------------------
1 | ;;; treemacs-perspective.el --- Perspective integration for treemacs -*- lexical-binding: t -*-
2 |
3 | ;; Copyright (C) 2024 Alexander Miller
4 |
5 | ;; Author: Alexander Miller
6 | ;; Jason Dufair
7 | ;; Package-Requires: ((emacs "26.1") (treemacs "0.0") (perspective "2.8") (dash "2.11.0"))
8 | ;; Version: 0
9 | ;; Homepage: https://github.com/Alexander-Miller/treemacs
10 |
11 | ;; This program is free software; you can redistribute it and/or modify
12 | ;; it under the terms of the GNU General Public License as published by
13 | ;; the Free Software Foundation, either version 3 of the License, or
14 | ;; (at your option) any later version.
15 |
16 | ;; This program is distributed in the hope that it will be useful,
17 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
18 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 | ;; GNU General Public License for more details.
20 |
21 | ;; You should have received a copy of the GNU General Public License
22 | ;; along with this program. If not, see .
23 |
24 | ;;; Commentary:
25 | ;;; Integration of perspective.el into treemacs' buffer scoping framework.
26 |
27 | ;;; Code:
28 |
29 | (require 'treemacs)
30 | (require 'perspective)
31 | (require 'eieio)
32 | (require 'dash)
33 |
34 | (eval-when-compile
35 | (require 'treemacs-macros)
36 | (require 'cl-lib))
37 |
38 | ;; remove base compatibility hook
39 | (remove-hook 'perspective-activated-functions #'treemacs--remove-treemacs-window-in-new-frames)
40 |
41 | (defclass treemacs-perspective-scope (treemacs-scope) () :abstract t)
42 | (add-to-list 'treemacs-scope-types (cons 'Perspectives 'treemacs-perspective-scope))
43 |
44 | (cl-defmethod treemacs-scope->current-scope ((_ (subclass treemacs-perspective-scope)))
45 | "Get the current perspective as scope.
46 | Returns the symbol `none' if no perspective is active."
47 | (or (persp-curr) 'none))
48 |
49 | (cl-defmethod treemacs-scope->current-scope-name ((_ (subclass treemacs-perspective-scope)) perspective)
50 | "Return the name of the given PERSPECTIVE.
51 | Will return \"No Perspective\" if no perspective is active."
52 | (if (eq 'none perspective)
53 | "No Perspective"
54 | (treemacs-perspective--format-workspace-name (persp-name perspective))))
55 |
56 | (defun treemacs-perspective--on-scope-kill ()
57 | "Cleanup hook to run when a perspective is killed."
58 | (treemacs--on-scope-kill (persp-current-name)))
59 |
60 | (cl-defmethod treemacs-scope->setup ((_ (subclass treemacs-perspective-scope)))
61 | "Perspective-scope setup."
62 | (add-hook 'persp-switch-hook #'treemacs-perspective--on-perspective-switch)
63 | (add-hook 'persp-after-rename-hook #'treemacs-perspective--on-perspective-rename)
64 | (add-hook 'persp-killed-hook #'treemacs-perspective--on-scope-kill)
65 | (treemacs-perspective--ensure-workspace-exists))
66 |
67 | (cl-defmethod treemacs-scope->cleanup ((_ (subclass treemacs-perspective-scope)))
68 | "Perspective-scope tear-down."
69 | (remove-hook 'persp-switch-hook #'treemacs-perspective--on-perspective-switch)
70 | (remove-hook 'persp-after-rename-hook #'treemacs-perspective--on-perspective-rename)
71 | (remove-hook 'persp-killed-hook #'treemacs-perspective--on-scope-kill))
72 |
73 | (defun treemacs-perspective--on-perspective-rename ()
74 | "Hook running after the perspective was renamed.
75 | Will rename the current workspace to the current perspective's name."
76 | (treemacs-do-rename-workspace
77 | ;; Current workspace's name
78 | (treemacs-current-workspace)
79 | (treemacs-perspective--format-workspace-name (persp-current-name))))
80 |
81 | (defun treemacs-perspective--on-perspective-switch (&rest _)
82 | "Hook running after the perspective was switched.
83 | Will select a workspace for the now active perspective, creating it if
84 | necessary."
85 | ;; running with a timer ensures that any other post-processing is finished after a perspective
86 | ;; was run since commands like `spacemacs/helm-persp-switch-project' first create a perspective
87 | ;; and only afterwards select the file to display
88 | (run-with-timer
89 | 0.1 nil
90 | (lambda ()
91 | (treemacs-without-following
92 | (treemacs-perspective--ensure-workspace-exists)
93 | (treemacs--change-buffer-on-scope-change)))))
94 |
95 | (defun treemacs-perspective--ensure-workspace-exists ()
96 | "Make sure a workspace exists for the given PERSPECTIVE-NAME.
97 | Matching happens by name. If no workspace can be found it will be created."
98 | (let* ((perspective-name (treemacs-scope->current-scope-name
99 | (treemacs-current-scope-type) (treemacs-current-scope)))
100 | (workspace (or (treemacs--find-workspace-by-name perspective-name)
101 | (treemacs-perspective--create-workspace perspective-name))))
102 | (setf (treemacs-current-workspace) workspace)
103 | (treemacs--invalidate-buffer-project-cache)
104 | (run-hooks 'treemacs-switch-workspace-hook)
105 | workspace))
106 |
107 | (defun treemacs-perspective--create-workspace (name)
108 | "Create a new workspace for the given perspective NAME.
109 | Projects will be found as per `treemacs--find-user-project-functions'. If that
110 | does not return anything the projects of the fallback workspace will be copied."
111 | (treemacs-block
112 | (let* ((ws-result (treemacs-do-create-workspace name))
113 | (ws-status (car ws-result))
114 | (ws (cadr ws-result))
115 | (root-path (treemacs--find-current-user-project))
116 | (project-list))
117 | (unless (eq ws-status 'success)
118 | (treemacs-log "Failed to create workspace for perspective: %s, using fallback instead." ws)
119 | (treemacs-return (car treemacs--workspaces)))
120 | (if root-path
121 | (setf project-list
122 | (list (treemacs-project->create!
123 | :name (treemacs--filename root-path)
124 | :path root-path
125 | :path-status (treemacs--get-path-status root-path))))
126 | (-let [fallback-workspace (car treemacs--workspaces)]
127 | ;; copy the projects instead of reusing them so we don't accidentally rename
128 | ;; a project in 2 workspaces
129 | (dolist (project (treemacs-workspace->projects fallback-workspace))
130 | (push (treemacs-project->create!
131 | :name (treemacs-project->name project)
132 | :path (treemacs-project->path project)
133 | :path-status (treemacs-project->path-status project))
134 | project-list))))
135 | (setf (treemacs-workspace->projects ws) (nreverse project-list))
136 | (treemacs-return ws))))
137 |
138 | (defun treemacs-perspective--format-workspace-name (perspective-name)
139 | "Format of the workspace name used for a perspective named PERSPECTIVE-NAME."
140 | (format "Perspective %s" perspective-name))
141 |
142 | (provide 'treemacs-perspective)
143 |
144 | ;;; treemacs-perspective.el ends here
145 |
--------------------------------------------------------------------------------
/src/extra/treemacs-tab-bar.el:
--------------------------------------------------------------------------------
1 | ;;; treemacs-tab-bar.el --- Tab bar integration for treemacs -*- lexical-binding: t -*-
2 |
3 | ;; Copyright (C) 2024 Alexander Miller
4 |
5 | ;; Author: Alexander Miller
6 | ;; Jason Dufair
7 | ;; Aaron Jensen
8 | ;; Package-Requires: ((emacs "27.1") (treemacs "0.0") (dash "2.11.0"))
9 | ;; Version: 0
10 | ;; Homepage: https://github.com/Alexander-Miller/treemacs
11 |
12 | ;; This program is free software; you can redistribute it and/or modify
13 | ;; it under the terms of the GNU General Public License as published by
14 | ;; the Free Software Foundation, either version 3 of the License, or
15 | ;; (at your option) any later version.
16 |
17 | ;; This program is distributed in the hope that it will be useful,
18 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
19 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 | ;; GNU General Public License for more details.
21 |
22 | ;; You should have received a copy of the GNU General Public License
23 | ;; along with this program. If not, see .
24 |
25 | ;;; Commentary:
26 | ;;; Integration of tab-bar-mode into treemacs' buffer scoping framework.
27 |
28 | ;;; Code:
29 |
30 | (require 'dash)
31 | (require 'tab-bar)
32 | (require 'treemacs)
33 |
34 | (eval-when-compile
35 | (require 'treemacs-macros)
36 | (require 'cl-lib))
37 |
38 | (defclass treemacs-tab-bar-scope (treemacs-scope) () :abstract t)
39 | (add-to-list 'treemacs-scope-types (cons 'Tabs 'treemacs-tab-bar-scope))
40 |
41 | (cl-defmethod treemacs-scope->current-scope ((_ (subclass treemacs-tab-bar-scope)))
42 | "Get the current tab as scope.
43 | Return symbol `none' unless variable `tab-bar-mode' is non-nil."
44 | (if tab-bar-mode
45 | (cdr (assq 'name (tab-bar--current-tab)))
46 | 'none))
47 |
48 | (cl-defmethod treemacs-scope->current-scope-name ((_ (subclass treemacs-tab-bar-scope)) tab)
49 | "Return the name of the given TAB.
50 | Will return \"No Tab\" if no tab is active."
51 | (if (eq 'none tab)
52 | "No Tab"
53 | (format "Tab %s" tab)))
54 |
55 | (cl-defmethod treemacs-scope->setup ((_ (subclass treemacs-tab-bar-scope)))
56 | "Tabs-scope setup."
57 | (when (fboundp 'tab-bar-tabs-set)
58 | (advice-add #'tab-bar-tabs-set :after #'treemacs-tab-bar--on-tab-switch))
59 | (advice-add #'tab-bar-select-tab :after #'treemacs-tab-bar--on-tab-switch)
60 | (add-to-list 'tab-bar-tab-post-open-functions #'treemacs-tab-bar--on-tab-switch)
61 | (add-to-list 'tab-bar-tab-pre-close-functions #'treemacs-tab-bar--on-tab-close)
62 | (treemacs-tab-bar--ensure-workspace-exists))
63 |
64 | (cl-defmethod treemacs-scope->cleanup ((_ (subclass treemacs-tab-bar-scope)))
65 | "Tabs-scope tear-down."
66 | (when (fboundp 'tab-bar-tabs-set)
67 | (advice-remove #'tab-bar-tabs-set #'treemacs-tab-bar--on-tab-switch))
68 | (advice-remove #'tab-bar-select-tab #'treemacs-tab-bar--on-tab-switch)
69 | (setq tab-bar-tab-post-open-functions
70 | (delete #'treemacs-tab-bar--on-tab-switch tab-bar-tab-post-open-functions))
71 | (setq tab-bar-tab-pre-close-functions
72 | (delete #'treemacs-tab-bar--on-tab-close tab-bar-tab-pre-close-functions)))
73 |
74 | (defun treemacs-tab-bar--on-tab-close (tab &rest _)
75 | "Cleanup hook to run when a TAB is closed."
76 | (treemacs--on-scope-kill (cdr (assq 'name tab))))
77 |
78 | (defun treemacs-tab-bar--on-tab-switch (&rest _)
79 | "Hook running after the tab was switched.
80 | Will select a workspace for the now active tab, creating it if
81 | necessary."
82 | (treemacs-without-following
83 | (treemacs-tab-bar--ensure-workspace-exists)
84 | (treemacs--change-buffer-on-scope-change)))
85 |
86 | (defun treemacs-tab-bar--ensure-workspace-exists ()
87 | "Make sure a workspace exists for the given TAB-NAME.
88 | Matching happens by name. If no workspace can be found it will be created."
89 | (let* ((tab-name (treemacs-scope->current-scope-name
90 | (treemacs-current-scope-type) (treemacs-current-scope)))
91 | (workspace (or (treemacs--find-workspace-by-name tab-name)
92 | (treemacs-tab-bar--create-workspace tab-name))))
93 | (setf (treemacs-current-workspace) workspace)
94 | (treemacs--invalidate-buffer-project-cache)
95 | (run-hooks 'treemacs-switch-workspace-hook)
96 | workspace))
97 |
98 | (defun treemacs-tab-bar--create-workspace (name)
99 | "Create a new workspace for the given tab NAME.
100 | Projects will be found as per `treemacs--find-user-project-functions'. If that
101 | does not return anything the projects of the fallback workspace will be copied."
102 | (treemacs-block
103 | (let* ((ws-result (treemacs-do-create-workspace name))
104 | (ws-status (car ws-result))
105 | (ws (cadr ws-result))
106 | (root-path (treemacs--find-current-user-project))
107 | (project-list))
108 | (unless (eq ws-status 'success)
109 | (treemacs-log "Failed to create workspace for tab: %s, using fallback instead." ws)
110 | (treemacs-return (car treemacs--workspaces)))
111 | (if root-path
112 | (setf project-list
113 | (list (treemacs-project->create!
114 | :name (treemacs--filename root-path)
115 | :path root-path
116 | :path-status (treemacs--get-path-status root-path))))
117 | (-let [fallback-workspace (car treemacs--workspaces)]
118 | ;; copy the projects instead of reusing them so we don't accidentally rename
119 | ;; a project in 2 workspaces
120 | (dolist (project (treemacs-workspace->projects fallback-workspace))
121 | (push (treemacs-project->create!
122 | :name (treemacs-project->name project)
123 | :path (treemacs-project->path project)
124 | :path-status (treemacs-project->path-status project))
125 | project-list))))
126 | (setf (treemacs-workspace->projects ws) (nreverse project-list))
127 | (treemacs-return ws))))
128 |
129 | (provide 'treemacs-tab-bar)
130 |
131 | ;;; treemacs-tab-bar.el ends here
132 |
--------------------------------------------------------------------------------
/src/scripts/treemacs-count-mail.py:
--------------------------------------------------------------------------------
1 | from subprocess import Popen, PIPE
2 | import sys
3 |
4 | # Command line arguments are a list of maildirs.
5 | # The output is a list of items in the form '((P1 A1) (P2 A2))' where P is the node path for a maildir
6 | # node, and A is the mail count annotation text
7 | # Exmaple: '(((treemacs-mu4e "/web/") " (176)")((treemacs-mu4e "/web/" "/web/Inbox") " (161)"))'
8 |
9 | UNREAD_CMD = "mu find maildir:'{}' --fields 'i' flag:'unread' 2> /dev/null | wc -l"
10 | PATH_PREFIX = "treemacs-mu4e"
11 | LOCAL_PREFIX = "/" + sys.argv[1]
12 |
13 | def main():
14 | maildirs = sys.argv[2:]
15 |
16 | output = ["("]
17 | for maildir in maildirs:
18 |
19 | mu_dir = maildir
20 | is_local = False
21 | is_leaf = not maildir.endswith("/")
22 | # "Local Folders" is an artificial maildir that is used to group
23 | # otherwise free standing folders under a single header like
24 | # in thunderbird
25 | if mu_dir.startswith(LOCAL_PREFIX):
26 | is_local = True
27 | mu_dir = mu_dir.replace(LOCAL_PREFIX, "")
28 | if mu_dir == "/":
29 | continue
30 |
31 | unread = Popen(UNREAD_CMD.format(mu_dir.replace(" ", "\ ")),
32 | shell=True,
33 | stdout=PIPE,
34 | bufsize=100,
35 | encoding='utf-8'
36 | ).communicate()[0][:-1]
37 |
38 | if unread == "0":
39 | continue
40 |
41 | node_path = []
42 | path_item = "/"
43 | split_path = maildir.split("/")[1:] if is_leaf else maildir.split("/")[1:-1]
44 |
45 | # it makes difference for mu whether a maildir ends in a slash or not
46 | for i in range(0, len(split_path) - 1):
47 | path_item = path_item + split_path[i] + "/"
48 | node_path.append("\"" + path_item + "\"")
49 | final_item = "" if is_leaf else "/"
50 | node_path.append("\"" + path_item + split_path[-1] + final_item + "\"")
51 |
52 | suffix = '" ({})"'.format(unread)
53 |
54 | output.append('(({} {}) {})'.format(
55 | PATH_PREFIX, " ".join(node_path), suffix
56 | ))
57 |
58 | output.append(")")
59 | print("".join(output))
60 |
61 | main()
62 |
--------------------------------------------------------------------------------
/src/scripts/treemacs-dirs-to-collapse.py:
--------------------------------------------------------------------------------
1 | from os import listdir
2 | from os.path import isdir
3 | from posixpath import join
4 | import sys
5 | import os
6 |
7 | LIMIT = int(sys.argv[1])
8 | SHOW_ALL = sys.argv[2] == 't'
9 | ROOTS = sys.argv[3:]
10 | STDOUT = sys.stdout
11 |
12 | # special workaround for windows platforms
13 | # the default `join' implementation cannot quite deal with windows
14 | # paths in the form of "C:/A/B" & "C:/A/B/C", joining them as
15 | # "C:/A/B/C:/A/B/C"
16 | # it can, however, be "tricked" into doing the right thing by adding
17 | # a slash to the start of the paths
18 | # go figure
19 | if sys.platform == 'win32':
20 | def join_dirs(d1, d2, full_path=False):
21 | missing_slash = False
22 | if not d1.startswith("/"):
23 | missing_slash = True
24 | d1 = "/" + d1
25 | # full_path is only True when the second argument is
26 | # another absolute path
27 | if full_path and not d2.startswith("/"):
28 | missing_slash = True
29 | d2 = "/" + d2
30 | joined = join(d1, d2)
31 | if missing_slash:
32 | # still need to return the joined path without the
33 | # leading slash, the way it looked originally
34 | return joined[1:]
35 | else:
36 | return joined
37 | else:
38 | def join_dirs(d1, d2, *_):
39 | return join(d1, d2)
40 |
41 | if LIMIT <= 0:
42 | exit(0)
43 |
44 | def dir_content(path):
45 | """
46 | returns the content of given path, excluding unreadable files
47 | and dotfiles (unless SHOW_ALL is True)
48 | """
49 | ret = []
50 | for item in listdir(path):
51 | full_path = join_dirs(path, item)
52 | if os.access(full_path, os.R_OK) and (SHOW_ALL or item[0] != '.'):
53 | ret.append(full_path)
54 | return ret
55 |
56 | def main():
57 | STDOUT.write("#s(hash-table size 10 test equal rehash-size 1.5 rehash-threshold 0.8125 data (")
58 |
59 | for root in ROOTS:
60 | STDOUT.write(f'"{root}"')
61 |
62 | dirs = [d for d in dir_content(root) if isdir(d)]
63 | STDOUT.write("(")
64 | for current_dir in dirs:
65 | content = dir_content(current_dir)
66 | collapsed = current_dir
67 | steps = []
68 | depth = 0
69 | while True:
70 | if len(content) == 1 and isdir(content[0]):
71 | single_path = content[0]
72 | collapsed = join_dirs(collapsed, single_path, True)
73 | content = dir_content(collapsed)
74 | depth += 1
75 | steps.append(single_path)
76 | if depth >= LIMIT:
77 | break
78 | else:
79 | break
80 | if depth > 0 and not ('"' in collapsed or '\\' in collapsed):
81 | final_dir = steps[-1]
82 | display_suffix = final_dir[len(current_dir):]
83 | STDOUT.write("(" + '"' + display_suffix + '" ' + '"' + current_dir + '" ' + '"' + '" "'.join(steps) + '")')
84 | nothing_to_flatten = False
85 | STDOUT.write(")")
86 |
87 | # close hash table again
88 | STDOUT.write("))")
89 |
90 | main()
91 |
--------------------------------------------------------------------------------
/src/scripts/treemacs-find-ignored-files.py:
--------------------------------------------------------------------------------
1 | from subprocess import Popen, PIPE
2 | from os.path import exists
3 | import sys
4 |
5 | GIT_BIN = sys.argv[1]
6 | GIT_CMD = "{} clean -ndX".format(GIT_BIN)
7 | STDOUT = sys.stdout.buffer
8 |
9 | def quote(string):
10 | return b'"' + string + b'"'
11 |
12 | def process_git_output(root, proc):
13 | root_bytes = bytes(root, "utf-8")
14 |
15 | count = 0
16 | for line in proc.stdout:
17 | # output has the form 'Would remove /a/b/c'
18 | # final newline and final slash also need to go
19 | path = line.replace(b"Would remove ", b"")[:-1]
20 | if path.endswith(b"/"):
21 | path = path[:-1]
22 |
23 | ignored_file = root_bytes + b"/" + path
24 | ignored_file_parent = ignored_file[:ignored_file.rindex(b"/")]
25 |
26 | STDOUT.write(quote(ignored_file_parent))
27 | STDOUT.write(quote(ignored_file))
28 |
29 | # arbitrary limit of no more than 100 files
30 | count += 1
31 | if count > 100:
32 | break
33 |
34 | def main():
35 | roots = sys.argv[2:]
36 | procs = []
37 |
38 | for root in roots:
39 | if exists(root + "/.git"):
40 | proc = Popen(GIT_CMD, shell=True, stdout=PIPE, bufsize=100, cwd=root)
41 | procs.append((root, proc))
42 |
43 | STDOUT.write(b"(")
44 |
45 | for (root, proc) in procs:
46 | process_git_output(root, proc)
47 |
48 | STDOUT.write(b")")
49 |
50 | main()
51 |
--------------------------------------------------------------------------------
/src/scripts/treemacs-git-commit-diff.py:
--------------------------------------------------------------------------------
1 | from subprocess import Popen, PIPE
2 | import sys
3 |
4 | GIT_BIN = sys.argv[1]
5 | STATUS_CMD = "{} status -sb".format(GIT_BIN)
6 |
7 | def main():
8 | proc = Popen(STATUS_CMD, shell=True, stdout=PIPE, bufsize=100)
9 |
10 | if (proc.wait() != 0):
11 | sys.exit(2)
12 |
13 | line = proc.stdout.readline()
14 | i_open = line.find(b"[")
15 | i_close = line.find(b"]")
16 |
17 | if (i_open == -1):
18 | print("nil")
19 | sys.exit(0)
20 |
21 | ahead = 0
22 | ahead_len = 0
23 | behind = 0
24 | behind_len = 0
25 |
26 | for inf in line[i_open+1 : i_close].split(b", "):
27 | split = inf.split(b" ")
28 | status = split[0]
29 | text = split[1]
30 | number = int(text)
31 | if status == b"ahead":
32 | ahead = number
33 | ahead_len = len(text)
34 | elif status == b"behind":
35 | behind = number
36 | behind_len = len(text)
37 |
38 | if ahead == 0 and behind != 0:
39 | face_len = 2 + behind_len
40 | print('#(" ↓{}" 0 {} (face treemacs-git-commit-diff-face))'.format(behind, face_len))
41 | elif ahead != 0 and behind == 0:
42 | face_len = 2 + ahead_len
43 | print('#(" ↑{}" 0 {} (face treemacs-git-commit-diff-face))'.format(ahead, face_len))
44 | else:
45 | face_len = 4 + ahead_len + behind_len
46 | print('#(" ↑{} ↓{}" 0 {} (face treemacs-git-commit-diff-face))'.format(ahead, behind, face_len))
47 |
48 | main()
49 |
--------------------------------------------------------------------------------
/src/scripts/treemacs-git-status.py:
--------------------------------------------------------------------------------
1 | from subprocess import Popen, PIPE
2 | from os import listdir, environ
3 | from os.path import isdir, islink
4 | from posixpath import join
5 | import sys
6 |
7 | # The script is supplied with the followig command line arguments
8 | # 1) the repository root - used only for file-joining to an absolute path
9 | # the actual working directory is set in emacs
10 | # 2) `treemacs-max-git-entries`
11 | # 3) `treemacs-git-command-pipe`
12 | # 4) a list of expanded directories the script may recurse into to collect
13 | # an entry for every untracked/ignored file inside
14 | # this list is turned into a set since it is possible that it contains duplicates
15 | # when called for magit, see also `treemacs-magit--extended-git-mode-update`
16 |
17 | GIT_BIN = sys.argv[1]
18 | GIT_ROOT = str.encode(sys.argv[2])
19 | LIMIT = int(sys.argv[3])
20 | GIT_CMD = "{} status --porcelain --ignored=matching . ".format(GIT_BIN) + sys.argv[4]
21 | STDOUT = sys.stdout.buffer
22 | RECURSE_DIRS = set([str.encode(it[(len(GIT_ROOT)):]) + b"/" for it in sys.argv[5:]]) if len(sys.argv) > 5 else []
23 | QUOTE = b'"'
24 | output = []
25 | ht_size = 0
26 |
27 | def face_for_status(status):
28 | if status == b"M":
29 | return b"treemacs-git-modified-face"
30 | elif status == b"U":
31 | return b"treemacs-git-conflict-face"
32 | elif status == b"?":
33 | return b"treemacs-git-untracked-face"
34 | elif status == b"!":
35 | return b"treemacs-git-ignored-face"
36 | elif status == b"A":
37 | return b"treemacs-git-added-face"
38 | elif status == b"R":
39 | return b"treemacs-git-renamed-face"
40 | else:
41 | return b"font-lock-keyword-face"
42 |
43 | def find_recursive_entries(path, state):
44 | global output, ht_size
45 | for item in listdir(path):
46 | full_path = join(path, item)
47 | output.append(QUOTE + full_path + QUOTE + face_for_status(state))
48 | ht_size += 1
49 | if ht_size > LIMIT:
50 | break
51 | if isdir(full_path) and not islink(full_path):
52 | find_recursive_entries(full_path, state)
53 |
54 | def main():
55 | global output, ht_size
56 | # Don't lock Git when updating status.
57 | environ["GIT_OPTIONAL_LOCKS"] = "0"
58 | proc = Popen(GIT_CMD, shell=True, stdout=PIPE, bufsize=100)
59 | dirs_added = {}
60 |
61 | for item in proc.stdout:
62 | # remove final newline
63 | item = item[:-1]
64 |
65 | # remove leading space if item was e.g. modified only in the worktree
66 | if item.startswith(b' '):
67 | item = item[1:]
68 | state, filename = item.split(b' ', 1)
69 |
70 | # reduce the state to a single-letter-string
71 | state = state[0:1]
72 |
73 | filename = filename.strip()
74 | # sometimes git outputs quoted filesnames
75 | if filename.startswith(b'"'):
76 | filename = filename[1:-1]
77 |
78 | # find the absolute path for the current item
79 | # renames have the form STATE OLDNAME -> NEWNAME
80 | abs_path = None
81 | if state == b"R":
82 | abs_path = join(GIT_ROOT, filename.split(b' -> ')[1])
83 | else:
84 | abs_path = join(GIT_ROOT, filename.lstrip())
85 |
86 | # filename is a directory, final slash must be removed
87 | if abs_path.endswith(b'/'):
88 | abs_path = abs_path[:-1]
89 | dirs_added[abs_path] = True
90 | output.append(QUOTE + abs_path + QUOTE + face_for_status(state))
91 | ht_size += 1
92 |
93 | # for files deeper down in the file hierarchy also print all their directories
94 | # if /A/B/C/x is changed then /A and /A/B and /A/B/C must be shown as changed as well
95 | if b'/' in filename and state != b'!':
96 | name_parts = filename.split(b'/')[:-1]
97 | dirname = b''
98 | for name_part in name_parts:
99 | dirname = join(dirname, name_part)
100 | full_dirname = join(GIT_ROOT, dirname.lstrip())
101 | # directories should not be printed more than once, which would happen if
102 | # e.g. both /A/B/C/x and /A/B/C/y have changes
103 | if full_dirname not in dirs_added:
104 | output.append(QUOTE + full_dirname + QUOTE + b"treemacs-git-modified-face")
105 | ht_size += 1
106 | dirs_added[full_dirname] = True
107 | # for untracked and ignored directories we need to find an entry for every single file
108 | # they contain
109 | # however this applies only for directories that are expanded and whose content is visible
110 | if state in [b'?', b'!'] and isdir(abs_path):
111 | if filename in RECURSE_DIRS:
112 | find_recursive_entries(abs_path, state)
113 | if ht_size >= LIMIT:
114 | break
115 | STDOUT.write(
116 | b"#s(hash-table size " + \
117 | bytes(str(ht_size), 'utf-8') + \
118 | b" test equal rehash-size 1.5 rehash-threshold 0.8125 data ("
119 | )
120 | if ht_size > 0:
121 | STDOUT.write(b"".join(output))
122 | STDOUT.write(b"))")
123 |
124 | sys.exit(proc.poll())
125 |
126 | main()
127 |
--------------------------------------------------------------------------------
/src/scripts/treemacs-single-file-git-status.py:
--------------------------------------------------------------------------------
1 | from subprocess import run, Popen, PIPE, DEVNULL, check_output
2 | import sys
3 | import os
4 |
5 | # There are 3+ command line arguments:
6 | # 1) the file to update
7 | # 2) the file's previous state, to check if things changed at all
8 | # 3) the file's parents that need to be updated as well
9 |
10 | GIT_BIN = sys.argv[1]
11 | FILE = sys.argv[2]
12 | OLD_FACE = sys.argv[3]
13 | PARENTS = [p for p in sys.argv[4:]]
14 |
15 | FILE_STATE_CMD = "{} status --porcelain --ignored=matching ".format(GIT_BIN)
16 | IS_IGNORED_CMD = "{} check-ignore ".format(GIT_BIN)
17 | IS_TRACKED_CMD = "{} ls-files --error-unmatch ".format(GIT_BIN)
18 | IS_CHANGED_CMD = "{} ls-files --modified --others --exclude-standard ".format(GIT_BIN)
19 |
20 | def face_for_status(path, status):
21 | if status == "M":
22 | return "treemacs-git-modified-face"
23 | elif status == "U":
24 | return "treemacs-git-conflict-face"
25 | elif status == "?":
26 | return "treemacs-git-untracked-face"
27 | elif status == "!":
28 | return "treemacs-git-ignored-face"
29 | elif status == "A":
30 | return "treemacs-git-added-face"
31 | elif status == "R":
32 | return "treemacs-git-renamed-face"
33 | elif os.path.isdir(path):
34 | return "treemacs-directory-face"
35 | else:
36 | return "treemacs-git-unmodified-face"
37 |
38 | def main():
39 | if '"' in FILE or '\\' in FILE:
40 | sys.exit(2)
41 |
42 | new_state = determine_file_git_state()
43 |
44 | # nothing to do
45 | if OLD_FACE == face_for_status(FILE, new_state):
46 | sys.exit(2)
47 |
48 | proc_list = []
49 |
50 | # for every parent file start all necessary git processes immediately
51 | # even if we don't need them later
52 | for p in PARENTS:
53 | add_git_processes(proc_list, p)
54 |
55 | result_list = [(FILE, new_state)]
56 |
57 | # iterate through the parents and propagate ignored and untracked states downwards
58 | # the following states are possible for *directories*:
59 | # 0 -> clean
60 | # ! -> ignored
61 | # ? -> untracked
62 | # M -> modified
63 | i = 0
64 | l = len(proc_list)
65 | propagate_state = None
66 | while i < l:
67 | path, ignore_proc, tracked_proc, changed_proc = proc_list[i]
68 | if ignore_proc.communicate() and ignore_proc.returncode == 0:
69 | propagate_state = "!"
70 | result_list.append((path, propagate_state))
71 | break
72 | elif tracked_proc.communicate() and tracked_proc.returncode == 1:
73 | propagate_state = "?"
74 | result_list.append((path, propagate_state))
75 | break
76 | elif changed_proc.communicate()[0] != b'' and changed_proc.returncode == 0:
77 | result_list.append((path, "M"))
78 | else:
79 | result_list.append((path, "0"))
80 | i += 1
81 |
82 | if propagate_state:
83 | i += 1
84 | while i < l:
85 | result_list.append((proc_list[i][0], propagate_state))
86 | i += 1
87 |
88 | elisp_conses = "".join(['("{}" . {})'.format(path, face_for_status(path, state)) for path, state in result_list])
89 | elisp_alist = "({})".format(elisp_conses)
90 | print(elisp_alist)
91 |
92 | def add_git_processes(status_listings, path):
93 | ignored_proc = Popen(IS_IGNORED_CMD + path, shell=True, stdout=DEVNULL, stderr=DEVNULL)
94 | tracked_proc = Popen(IS_TRACKED_CMD + path, shell=True, stdout=DEVNULL, stderr=DEVNULL)
95 | changed_proc = Popen(IS_CHANGED_CMD + path, shell=True, stdout=PIPE, stderr=DEVNULL)
96 |
97 | status_listings.append((path, ignored_proc, tracked_proc, changed_proc))
98 |
99 | def determine_file_git_state():
100 | proc = Popen(FILE_STATE_CMD + FILE, shell=True, stdout=PIPE, stderr=DEVNULL)
101 | line = proc.stdout.readline()
102 | if line:
103 | state = line.lstrip().split(b" ")[0]
104 | return state.decode('utf-8').strip()[0]
105 | else:
106 | return "0"
107 |
108 | main()
109 |
--------------------------------------------------------------------------------
/test/checkdock.el:
--------------------------------------------------------------------------------
1 | ;;; -*- lexical-binding: t -*-
2 | ;;; Based on https://github.com/flycheck/flycheck/blob/master/maint/flycheck-checkdoc.el
3 |
4 | (require 'bytecomp)
5 | (require 'checkdoc)
6 | (require 'dash)
7 | (require 's)
8 |
9 | (defconst all-el-files (append (directory-files "./src/elisp" :full ".el")
10 | (directory-files "./src/extra" :full ".el")))
11 |
12 | (defconst valid-doc-words
13 | (append checkdoc-ispell-lisp-words
14 | '("accessor"
15 | "adoc"
16 | "api"
17 | "arg"
18 | "args"
19 | "async"
20 | "baz"
21 | "boolean"
22 | "bool"
23 | "btn"
24 | "changelog"
25 | "config"
26 | "configs"
27 | "cpp"
28 | "customisations"
29 | "debounce"
30 | "debounced"
31 | "dir"
32 | "dired"
33 | "dirs"
34 | "dir's"
35 | "dom"
36 | "Dotfiles"
37 | "dotfile"
38 | "dotfiles"
39 | "eieio"
40 | "el"
41 | "eldoc"
42 | "elisp"
43 | "elpa"
44 | "filename"
45 | "filesystem"
46 | "filetree"
47 | "FilePath"
48 | "filepath"
49 | "filepaths"
50 | "filewatch"
51 | "flycheck"
52 | "fn"
53 | "fontification"
54 | "git"
55 | "gitignore"
56 | "goto"
57 | "gui"
58 | "HashMap"
59 | "hoc"
60 | "ImageMagick"
61 | "imenu"
62 | "init"
63 | "initialiser"
64 | "inlined"
65 | "iter"
66 | "keybind"
67 | "keybinds"
68 | "keybindings"
69 | "kqueue"
70 | "leftclick"
71 | "linux"
72 | "localized"
73 | "macos"
74 | "MacOS"
75 | "magit"
76 | "maildir"
77 | "maildirs"
78 | "makefile"
79 | "metadata"
80 | "minibuffer"
81 | "modeline"
82 | "org"
83 | "org's"
84 | "persp"
85 | "Pfuture"
86 | "pfuture"
87 | "plist"
88 | "png"
89 | "plaintext"
90 | "pos"
91 | "programmatically"
92 | "propertized"
93 | "px"
94 | "py"
95 | "rebase"
96 | "recentering"
97 | "regex"
98 | "resize"
99 | "resized"
100 | "resizing"
101 | "sb"
102 | "spaceline"
103 | "splittable"
104 | "struct"
105 | "subdir"
106 | "subdirs"
107 | "subprocess"
108 | "treemacs"
109 | "tui"
110 | "txt"
111 | "unmark"
112 | "untracked"
113 | "variadic"
114 | "wayland"
115 | "whitespace"
116 | "winum"
117 | "workspace"
118 | "workspaces")))
119 |
120 | (defun checkdoc-buffer (filename)
121 | ;; output only /src/elisp/filename.el as when compiling
122 | (message "Checkdoc %s" (substring filename (1+ (s-index-of "/src" filename))))
123 | (with-temp-buffer
124 | ;; Visit the file to make sure that the filename is set, as some checkdoc
125 | ;; lints only apply for buffers with filenames
126 | (insert-file-contents filename :visit)
127 | (set-buffer-modified-p nil)
128 | (delay-mode-hooks (emacs-lisp-mode))
129 | (setf delay-mode-hooks nil
130 | ispell-dictionary "british")
131 | (let ((checkdoc-autofix-flag 'never)
132 | (checkdoc-force-docstrings-flag t)
133 | (checkdoc-force-history-flag nil)
134 | (checkdoc-permit-comma-termination-flag nil)
135 | (checkdoc-spellcheck-documentation-flag t)
136 | (checkdoc-ispell-lisp-words valid-doc-words)
137 | (checkdoc-arguments-in-order-flag t)
138 | (checkdoc-verb-check-experimental-flag t))
139 | (checkdoc-current-buffer :take-notes))
140 | (get-errors)))
141 |
142 | (defun get-errors ()
143 | (with-current-buffer checkdoc-diagnostic-buffer
144 | (goto-char (point-min))
145 | ;; Skip over the checkdoc header
146 | (re-search-forward (rx line-start "***" (1+ not-newline)
147 | ": checkdoc-current-buffer"))
148 | (forward-line 1)
149 | (prog1
150 | (let ((text (buffer-substring-no-properties (point) (point-max))))
151 | (and (not (s-blank-p text))
152 | (split-string text "\n")))
153 | (kill-buffer))))
154 |
155 | (let ((errors (-mapcat #'checkdoc-buffer all-el-files)))
156 | (-each errors #'message)
157 | (kill-emacs (if errors 1 0)))
158 |
--------------------------------------------------------------------------------
/test/testdir1/testdir2/testdir3/testfile.el:
--------------------------------------------------------------------------------
1 | (defconst FOO)
2 |
3 | (defun fn1 ())
4 |
5 | (defun fn2 ())
6 |
--------------------------------------------------------------------------------
/test/testdir1/testdir2/testdir3/testfile.org:
--------------------------------------------------------------------------------
1 | * Foo
2 | ** Foo2
3 | *** Foo3
4 | * Bar
5 |
--------------------------------------------------------------------------------