# Changelog

<!-- Entries are one line per item and section headings repeat for every release,
     so the line-length and duplicate-heading rules don't fit this file. -->
<!-- markdownlint-disable MD013 MD024 -->

## master (unreleased)

### New features

- [#2104](https://github.com/bbatsov/projectile/pull/2104): Alien indexing now honors Projectile's ignore rules, which it previously skipped entirely.
  - The rules are pushed into the external tool (`git ls-files` exclude pathspecs, `fd --exclude`), so the filtering still happens outside Emacs.
  - Tools that can't express exclusions (svn, fossil, bzr, darcs, pijul, plain `find`) have their output filtered in Emacs Lisp instead.
  - Dirconfig `+` keep entries have no equivalent in the tools and stay `hybrid`/`native` only.
  - Alien projects will list fewer files than before; set `projectile-alien-honors-ignores` to nil for the old behavior.
- [#2096](https://github.com/bbatsov/projectile/pull/2096): Add an optional Embark/Marginalia integration, wired via `with-eval-after-load` so neither package becomes a dependency.
  - A `project-file` transformer resolves Projectile's project-relative candidates, augmenting Embark's own rather than replacing it.
  - Project prompts use a new `projectile-project` category with an action keymap (switch, vc, dired, remove) and a Marginalia annotator.

### Changes

- [#2107](https://github.com/bbatsov/projectile/pull/2107): Projectile's ignore configuration now speaks gitignore patterns everywhere, matched the same way by every indexing method.
  - `projectile-globally-ignored-directories`, `projectile-globally-ignored-files` and `projectile-globally-ignored-file-suffixes` join the `.projectile` `-` entries in one pattern language and one matcher: a slashless pattern matches at any depth, a pattern with a slash is anchored at the project root, a trailing `/` means directory-only, and `*`, `**`, `?` and `[...]` are wildcards.
  - The `*` prefix in `projectile-globally-ignored-directories` is no longer a marker meaning "at any depth" (that's now the default) - it's a plain wildcard, so `*node_modules` should become `node_modules`. The default entry `*.osc` became `.osc` accordingly.
  - A bare entry is no longer top-level-only under `hybrid`; write `/tmp` if you meant only the project root.
  - `projectile-global-ignore-file-patterns` stays what it always was - Emacs regexps - and therefore applies under `native` indexing only.
  - Dirconfig `!` ensure entries now apply under `alien` too (such a project gives up the push-down and is filtered in Emacs Lisp, since an exclusion argument can't be taken back).
  - `projectile-index-directory` no longer takes the three optional list arguments; it derives everything from the compiled patterns it is handed.
- [#2104](https://github.com/bbatsov/projectile/pull/2104): Ignore matching is now case-sensitive under every indexing method, where `native` and `hybrid` previously folded case (so `.elc` also hid `BUILD.ELC`); the external tools behind `alien` can't express that, so spell out both cases if you relied on it.
- [#2104](https://github.com/bbatsov/projectile/pull/2104): Drop `.ensime_cache` and `.eunit` from the default `projectile-globally-ignored-directories`, as ENSIME was archived in 2018 and `.eunit` is a rebar2 artifact.
- [#2104](https://github.com/bbatsov/projectile/pull/2104): Remove `projectile-warn-when-dirconfig-is-ignored`, which existed only to warn that `alien` bypassed the dirconfig.
- [#2099](https://github.com/bbatsov/projectile/pull/2099): Drop the standalone package headers (`Version`, `Package-Requires`) from `projectile-consult.el`, since the phantom `Package-Requires` made build tooling treat an in-package module as its own package (it broke `eldev` test runs on Emacs 28.x).

## 3.2.1 (2026-07-13)

### Bugs fixed

- [#2094](https://github.com/bbatsov/projectile/issues/2094): Fix a `wrong-type-argument stringp` crash when running `projectile-search` (a 3.2.0 regression): the search-prompt tool tag now accepts the backend name symbol, not just a string.
...
...
