# Changelog

## master (unreleased)

## 0.6.1 (2026-10-02)

### Bugs fixed

* [#112](https://github.com/bbatsov/crux/issues/112): Don't ship the test suite in the NonGNU ELPA package, where byte-compiling it on install failed because Buttercup isn't available.

## 0.6.0 (2026-10-01)

### New features

* [#101](https://github.com/bbatsov/crux/pull/101): Add `crux-find-current-directory-dir-locals-file`.
* [#104](https://github.com/bbatsov/crux/pull/104): Add `crux-keyboard-quit-dwim`.

### Changes

* [#110](https://github.com/bbatsov/crux/pull/110): Require Emacs 28.1.
* The `crux-with-region-or-*` macros use `advice-add` instead of `defadvice`, which was removed in Emacs 31.
* [#110](https://github.com/bbatsov/crux/pull/110): Don't load TRAMP when crux is loaded.
* [#110](https://github.com/bbatsov/crux/pull/110): Mark `crux-recompile-init` as obsolete.
* [#110](https://github.com/bbatsov/crux/pull/110): The `crux-with-region-or-*` macros and the line duplication commands check `use-region-p`, so an empty region, or any region with Transient Mark mode off, no longer counts as active.
* [#110](https://github.com/bbatsov/crux/pull/110): `crux-cleanup-buffer-or-region` also skips modes derived from the ones in `crux-indent-sensitive-modes` and `crux-untabify-sensitive-modes`, and the former now includes `python-ts-mode` and `yaml-ts-mode`.
* [#110](https://github.com/bbatsov/crux/pull/110): `crux-transpose-windows` keeps each window's point and scroll position.
* [#110](https://github.com/bbatsov/crux/pull/110): Mark `crux-term-buffer-name` and `crux-shell-buffer-name` as safe directory-local variables.
* [#111](https://github.com/bbatsov/crux/pull/111): Use `tramp-file-name-with-sudo` for remote files in `crux-sudo-edit` and `crux-reopen-as-root-mode` when it's available (Emacs 30.1+), and honor a customized `tramp-file-name-with-method` for local files.
* [#111](https://github.com/bbatsov/crux/pull/111): Make `crux-reopen-as-root-mode` leave Emacs's own files and packages on `load-path` alone.

### Bugs fixed

* [#102](https://github.com/bbatsov/crux/pull/102): Create nonexistent parent directories in `crux-copy-file-preserve-attributes`.
* [#110](https://github.com/bbatsov/crux/pull/110): Fix byte-compilation on Emacs 31.
* [#110](https://github.com/bbatsov/crux/pull/110): Fix `crux-cleanup-buffer-or-region` erroring or cleaning the wrong text unless `untabify` and `indent-region` had been advised with `crux-with-region-or-buffer`.
* [#110](https://github.com/bbatsov/crux/pull/110): Fix `crux-rename-file-and-buffer` renaming remote version-controlled files to their old name, renaming after the user declined to save, and ignoring buffers without a file.
* [#110](https://github.com/bbatsov/crux/pull/110): Fix `crux-sudo-edit` and `crux-reopen-as-root-mode` logging in as root over SSH for remote files, and expanding `~` to root's home directory.
* [#110](https://github.com/bbatsov/crux/pull/110): Fix `crux-duplicate-current-line-or-region` duplicating an extra line when the region ends at the start of a line.
* [#110](https://github.com/bbatsov/crux/pull/110): Fix `crux-duplicate-and-comment-current-line-or-region` uncommenting already commented text and misplacing point.
* [#110](https://github.com/bbatsov/crux/pull/110): Fix `crux-eval-and-replace` ignoring `lexical-binding`.
* [#110](https://github.com/bbatsov/crux/pull/110): Fix `crux-recentf-find-file` and `crux-recentf-find-directory` failing when `recentf` wasn't loaded yet.
* [#110](https://github.com/bbatsov/crux/pull/110): Fix `crux-indent-defun` leaving the region active.
* [#110](https://github.com/bbatsov/crux/pull/110): Fix `crux-open-with` failing on commands with arguments.
* [#110](https://github.com/bbatsov/crux/pull/110): Fix the case region commands erroring when the mark was never set.
* [#110](https://github.com/bbatsov/crux/pull/110): Fix `crux-find-user-init-file` and `crux-find-shell-init-file` crashing when there's no init file.
* [#111](https://github.com/bbatsov/crux/pull/111): Fix `crux-view-url` erroring on failed fetches and cutting off content for URLs without HTTP headers.
...
...
