├── .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 | folder_type_docs -------------------------------------------------------------------------------- /icons/default/svgrepo/dir-docs-open.svg: -------------------------------------------------------------------------------- 1 | 2 | folder_type_docs_opened -------------------------------------------------------------------------------- /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 | folder_type_git -------------------------------------------------------------------------------- /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 | folder_type_git_opened -------------------------------------------------------------------------------- /icons/default/svgrepo/dir-github-closed.svg: -------------------------------------------------------------------------------- 1 | 2 | folder_type_github_opened -------------------------------------------------------------------------------- /icons/default/svgrepo/dir-github-open.svg: -------------------------------------------------------------------------------- 1 | 2 | folder_type_github -------------------------------------------------------------------------------- /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 | folder_type_src -------------------------------------------------------------------------------- /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 | folder_type_src_opened -------------------------------------------------------------------------------- /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 | folder_type_test -------------------------------------------------------------------------------- /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 | folder_type_test_opened -------------------------------------------------------------------------------- /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 | folder_type_binary -------------------------------------------------------------------------------- /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 | folder_type_binary_opened -------------------------------------------------------------------------------- /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 | folder_type_docs -------------------------------------------------------------------------------- /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 | folder_type_docs_opened -------------------------------------------------------------------------------- /icons/default/vsc/dir-git-closed.svg: -------------------------------------------------------------------------------- 1 | folder_type_git -------------------------------------------------------------------------------- /icons/default/vsc/dir-git-open.svg: -------------------------------------------------------------------------------- 1 | folder_type_git_opened -------------------------------------------------------------------------------- /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 | folder_type_github -------------------------------------------------------------------------------- /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 | folder_type_github_opened -------------------------------------------------------------------------------- /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 | folder_type_images -------------------------------------------------------------------------------- /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 | folder_type_images_opened -------------------------------------------------------------------------------- /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 | folder_type_private -------------------------------------------------------------------------------- /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 | folder_type_private_opened -------------------------------------------------------------------------------- /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 | folder_type_public -------------------------------------------------------------------------------- /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 | folder_type_public_opened -------------------------------------------------------------------------------- /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 | folder_type_services -------------------------------------------------------------------------------- /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 | folder_type_services_opened -------------------------------------------------------------------------------- /icons/default/vsc/dir-src-closed.svg: -------------------------------------------------------------------------------- 1 | folder_type_src -------------------------------------------------------------------------------- /icons/default/vsc/dir-src-open.svg: -------------------------------------------------------------------------------- 1 | folder_type_src_opened -------------------------------------------------------------------------------- /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 | folder_type_temp -------------------------------------------------------------------------------- /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 | folder_type_temp_opened -------------------------------------------------------------------------------- /icons/default/vsc/dir-test-closed.svg: -------------------------------------------------------------------------------- 1 | folder_type_test -------------------------------------------------------------------------------- /icons/default/vsc/dir-test-open.svg: -------------------------------------------------------------------------------- 1 | folder_type_test_opened -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------