| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| README.md | 2026-08-10 | 12.3 kB | |
| v3.4.0 source code.tar.gz | 2026-08-10 | 5.1 MB | |
| v3.4.0 source code.zip | 2026-08-10 | 5.2 MB | |
| Totals: 3 Items | 10.3 MB | 1 | |
New features
- #2148: Add
projectile-switch-sibling-project(s-p n), which offers only the projects related to the one you're in, rather than every project on the machine. - Relatedness comes from
projectile-project-groupsif you've configured it, then from the owner of the upstream remote, then from the leading word of the directory name - seeprojectile-sibling-project-functions. - The remote's owner is what relates projects whose names have nothing in common; an inferred group covering more than
projectile-sibling-max-group-shareof your projects is dropped, since "we're all under the same account" relates nothing. - #2151:
projectile-switch-worktreealso offers Jujutsu workspaces, and a jj repository is now identified through its git backing store, so a workspace and the colocated git checkout agree on being the same thing and jj projects get siblings like any other. - #2147: Add
projectile-switch-worktree(s-p W), which offers the other checkouts of the current project's repository, each annotated with whatever tells it apart - the branch for git and Mercurial, the workspace name for Jujutsu. - Git worktrees and separate clones of the same upstream both count as checkouts, since they're the same workflow with and without the plumbing;
projectile-worktree-functionsis where other ways of finding them plug in. - #2138: Better support for OCaml, Erlang and F#.
projectile-run-test-at-pointlearnserlang-ts-mode(EUnit's_test/_test_functions, run asrebar3 eunit --test=module:name) andfsharp-ts-mode(bindings attributed[<Fact>],[<Theory>],[<Test>],[<TestCase>]or[<Property>], run throughdotnet test --filter).- The
ocaml-duneandrebarproject types gained their run, install, package and source/test directory attributes, and a newerlang-mktype covers the other common Erlang build tool. - OCaml deliberately gets no test-at-point rule: its tests are ordinary values registered with Alcotest or OUnit rather than anything the syntax marks out, so there is nothing to recognize.
- #2137: Ship
:file-kindstables for Phoenix, Laravel and Next.js, soprojectile-find-file-of-kind(s-p j) andprojectile-toggle-related-file(s-p J) work in those out of the box - Rails and Django were the only frameworks covered before. - Phoenix keys a resource's modules on the name they share (
user_controller.ex,user_html.ex,user_live.ex), Laravel on the model's class name, Next.js on the app router's directory. - Adds a
nextjsproject type (next.config.jsand friends) to hang the last of those on. - #2136:
projectile-run-test-at-pointnow knows Ruby (RSpec and Minitest), Rust, Elixir and Java, on top of the Python, Go and JS/TS rules it shipped with. - Ruby is written the same way whichever framework you use, so the project type picks the runner; Java's picks between Maven and Gradle, and takes the class name from the file.
- ExUnit can't select a test by name from the command line, so Elixir tests are addressed as
FILE:LINE. - #2135: Add
projectile-ignored-project-patterns, the regexp-matching sibling ofprojectile-ignored-projects(exact paths) andprojectile-ignored-project-function(a predicate), so keeping whole areas of a machine out of the known projects doesn't need a lambda. - #2134: Add
projectile-find-changed-file(s-p C), which completes over the files git reports as staged, unstaged or untracked - or, with a prefix argument, over everything that differs from a revision you pick. - #2133:
projectile-doctorfindings you can act on now carry a button that does it -[enable]for a disabledprojectile-mode,[enable caching]on a large uncached project,[open dirconfig]for a.projectilewith prefix-less lines,[edit .dir-locals.el]for an undetected project type. Pressing one regenerates the report, so the finding answers for itself; findings Projectile can't act on stay plain advice. - #2132: The dashboard gained a "Notable files" section linking the project's README, changelog, license, its type's own manifest and its
.projectile(seeprojectile-dashboard-link-files), plus a count of its open buffers and a summary of the ignore rules in effect. - A project with nothing cached now offers an
[index now]button instead of only reporting that it isn't indexed. - Both report buffers set up
outline-minor-modeover their sections, so a long report folds with the usual outline keys, and their footers derive the keys they advertise withsubstitute-command-keysrather than hardcoding them. - #2131: The
projectile-doctorandprojectile-dashboardbuffers are no longer plain text: section headers, field labels, the project's identity and the doctor's findings are faced by meaning, with the findings colored by severity and sorted so anything wanting action comes first. - All the new faces only inherit from standard ones, so themes style them without knowing about Projectile and a terminal without colors degrades to what you got before.
projectile-report-copy(win either buffer) copies the buffer as plain text, without the faces and buttons - a doctor report usually ends up in an issue.- #2130:
projectile-run-tasknow also discovers rake tasks, read out of the project'sRakefileand its.rakefiles (inrakelib,tasksandlib/tasks) rather than by runningrake -T, which would load the whole application. Tasks are qualified with theirnamespace(rake:db:migrate) and run throughbundle execwhen the project has aGemfile.
Changes
- #2152: The per-command-type histories now belong to the repository rather than the directory, so pressing
M-pat a compile or test prompt in a fresh git worktree - or in a second clone of the same upstream - offers the commands the project is actually built with instead of nothing (#1786). - What a prompt is pre-filled with, and what
projectile-repeat-last-commandreplays, stay local to the checkout you're in: both act without asking, and a remembered command can carry absolute paths back into the checkout it was typed in. - Existing histories are adopted rather than dropped, and
projectile-command-history-scopeset toprojectrestores a history per directory. - #2146: The six
projectile-<cmd>-use-comint-modeoptions fold into oneprojectile-use-comint-mode, takingtor a list of the phases to make interactive. - #2146:
projectile-per-project-compilation-bufferandprojectile-per-command-compilation-bufferfold intoprojectile-compilation-buffer-scope, a list ofprojectand/orcommand- which is what setting both booleans already meant. - #2146: Rename the options that broke their own naming schemes:
projectile-global-ignore-file-patternstoprojectile-globally-ignored-file-regexps,projectile-cmd-hist-ignoredupstoprojectile-command-history-ignore-duplicates,projectile-related-files-fn-functiontoprojectile-related-files-function,projectile-auto-discovertoprojectile-auto-discover-projects, and the three reviewable-search options named after replace (projectile-replace-max-matches,-asyncand-scan-chunk-size) to theprojectile-search-prefix their siblings already used. - #2146:
projectile-tags-file-nameandprojectile-go-project-test-functionare obsolete; both were only ever read as Projectile loaded, so setting them from your init file afterwards did nothing. List the tags file inprojectile-globally-ignored-files, and re-register thegoproject type to change how it's detected. - #2146: Every renamed or folded option is still honored under its old name, so existing configuration keeps working.
- #2146: Make the options' Customize metadata uniform - seven options that document
nilas meaningful had a:typethat rejected it, so Customize refused to edit them, and the:safepredicates now cover all the ignore lists rather than four of the nine.
Bugs fixed
- #2145: The known projects file, the frecency store and the session directory are resolved with
locate-user-emacs-filerather than expanded againstuser-emacs-directoryby hand, so they land beside the rest of your Emacs state when your configuration lives in~/.config/emacsinstead of~/.emacs.d. Nothing moves for a configuration in the usual place. - #2144: Internal: the two shapes a project type marker can take are decoded in one place now, rather than by each of the four consumers separately.
- #2142: Project types can declare
:src-extensionand:test-extension, for the languages whose tests don't carry the same extension as their sources. The bundledelixirtype sets them, so toggling fromlib/foo.exnow offers to createtest/foo_test.exs- a script ExUnit will actually run - rather thantest/foo_test.ex. - #2141: The messages Projectile emits without being asked are now prefixed with
[Projectile], so it's clear where they came from; the ones that answer a command you just invoked stay unprefixed. Five different conventions across the file (aProjectile:prefix, a bareProjectileone, the project name in brackets, plain passthrough, and no prefix at all) become one rule. - The indexing notice follows the manual's
Operating.../Operating...doneidiom, so a long index no longer leaves the echo area claiming to still be working. projectile-project-inforeadsProject: /path/ (npm, git)rather than separating its three fields with##.- #2140:
projectile-verbosenow covers five more messages Projectile emitted without being asked: caching a file thefind-filehook picked up, a search path entry that doesn't exist, an indexing command that exited non-zero but produced usable output (both the sync and async runners), and a session file from an older format version. Commands you invoke still report what they did whatever the option is set to, and the two that are also commands (projectile-cache-current-file,projectile-discover-projects-in-directory) still speak when invoked directly. - #2139: The file-notification cache updates now honor the VCS's ignore rules too, so a watched project no longer gains files a re-index would never have listed - the last place
.gitignorewas going unread, after #2126 fixed it for files opened by hand. Onegit check-ignorecovers a whole batch of events, since a batch can be an entire directory moved into the project. - #2146: The default
projectile-globally-ignored-buffersentries are matched as regexps, so*scratch*only matched by accident and*scratchhh*matched too; the asterisks are now escaped. - #2146:
projectile-svn-commandfiltered directories out ofsvn list -Rwithgrep -v '$/', where the$is a literal rather than an anchor, so it never dropped anything and svn projects listed their directories among their files.