Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/bbatsov/crux
A Collection of Ridiculously Useful eXtensions for Emacs
https://github.com/bbatsov/crux
emacs emacs-lisp
Last synced: 2 days ago
JSON representation
A Collection of Ridiculously Useful eXtensions for Emacs
- Host: GitHub
- URL: https://github.com/bbatsov/crux
- Owner: bbatsov
- Created: 2015-12-24T11:08:39.000Z (about 9 years ago)
- Default Branch: master
- Last Pushed: 2024-07-30T18:28:40.000Z (6 months ago)
- Last Synced: 2025-01-17T04:03:41.729Z (9 days ago)
- Topics: emacs, emacs-lisp
- Language: Emacs Lisp
- Homepage: https://emacsredux.com
- Size: 163 KB
- Stars: 929
- Watchers: 13
- Forks: 53
- Open Issues: 17
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- Funding: .github/FUNDING.yml
Awesome Lists containing this project
- my-awesome-github-stars - bbatsov/crux - A Collection of Ridiculously Useful eXtensions for Emacs (Emacs Lisp)
README
[![License GPL 3][badge-license]][copying]
[![MELPA][melpa-badge]][melpa-package]
[![MELPA Stable][melpa-stable-badge]][melpa-stable-package]# crux
A **C**ollection of **R**idiculously **U**seful e**X**tensions for Emacs.
crux bundles many useful interactive commands to enhance your
overall Emacs experience.Most of the crux commands are related to the editing experience, but
there are also a bunch of utility commands that are just very useful
to have (e.g. `crux-open-with` and `crux-reopen-as-root`).## Origins of crux
Many of the functions in crux started life as blog posts on
[Emacs Redux](https://emacsredux.com), then were included in
[Emacs Prelude](https://www.github.com/bbatsov/prelude), before finally
being [extracted](https://emacsredux.com/blog/2016/01/30/crux/)
to crux. You can see a full list of blog posts on functions
in crux on the [tags page](https://emacsredux.com/tags/#crux).## Installation
Available on all major `package.el` community maintained repos -
[MELPA Stable][] and [MELPA][] repos.MELPA Stable is recommended as it has the latest stable version.
MELPA has a development snapshot for users who don't mind breakage but
don't want to run from a git checkout.You can install `crux` using the following command:
M-x package-install [RET] crux [RET]
If the installation doesn't work try refreshing the package list:
M-x package-refresh-contents
Alternatively, you can add the following code to your Emacs config:
```el
(unless (package-installed-p 'crux)
(package-refresh-contents)
(package-install 'crux))
```## Keybindings
crux doesn't setup any keybindings for its commands out-of-the-box.
There are several reasons for this:* Most users probably won't need all the commands, so it'd be an overkill to
define a minor mode consuming a lot of valuable keybindings
* Many of the optimal keybindings are in the user space anyways (e.g. `C-c some-letter`)
* Everyone has their own preferences when it comes to keybindingsHere's the list of some suggested keybindings. Feel free to bind
individual commands to whatever keybindings you prefer.Command | Suggested Keybinding(s) | Description
----------------------------------------------------|---------------------------------|------------------------
`crux-open-with` | C-c o | Open the currently visited file with an external program.
`crux-smart-kill-line` | C-k or Super-k | First kill to end of line, then kill the whole line.
`crux-smart-open-line-above` | C-S-RET or Super-o | Insert an empty line above the current line and indent it properly.
`crux-smart-open-line` | S-RET or M-o | Insert an empty line and indent it properly (as in most IDEs).
`crux-cleanup-buffer-or-region` | C-c n | Fix indentation in buffer and strip whitespace.
`crux-recentf-find-file` | C-c f or Super-r | Open recently visited file.
`crux-recentf-find-directory` | C-c F | Open recently visited directory.
`crux-view-url` | C-c u | Open a new buffer containing the contents of URL.
`crux-eval-and-replace` | C-c e | Eval a bit of Emacs Lisp code and replace it with its result.
`crux-transpose-windows` | C-x 4 t | Transpose the buffers between two windows.
`crux-delete-file-and-buffer` | C-c D | Delete current file and buffer.
`crux-copy-file-preserve-attributes` | C-c c | Copy current file with file attributes preserved
`crux-duplicate-current-line-or-region` | C-c d | Duplicate the current line (or region).
`crux-duplicate-and-comment-current-line-or-region` | C-c M-d | Duplicate and comment the current line (or region).
`crux-rename-file-and-buffer` | C-c r | Rename the current buffer and its visiting file if any.
`crux-visit-term-buffer` | C-c t | Open a terminal emulator (`ansi-term`).
`crux-kill-other-buffers` | C-c k | Kill all open buffers except the one you're currently in.
`crux-indent-defun` | C-M z | Indent the definition at point.
`crux-indent-rigidly-and-copy-to-clipboard` | C-c TAB | Indent and copy region to clipboard
`crux-find-user-init-file` | C-c I | Open user's init file.
`crux-find-user-custom-file` | C-c , | Open user's custom file.
`crux-find-shell-init-file` | C-c S | Open shell's init file.
`crux-top-join-line` | Super-j or C-^ | Join lines
`crux-kill-whole-line` | Super-k | Kill whole line
`crux-kill-line-backwards` | C-Backspace | Kill line backwards
`crux-kill-and-join-forward` | C-S-Backspace or C-k | If at end of line, join with following; otherwise kill line.
`crux-kill-buffer-truename ` | C-c P | Kill absolute path of file visited in current buffer.
`crux-ispell-word-then-abbrev` | C-c i | Fix word using `ispell` and then save to `abbrev`.
`crux-upcase-region` | C-x C-u | `upcase-region` when `transient-mark-mode` is on and region is active.
`crux-downcase-region` | C-x C-l | `downcase-region` when `transient-mark-mode` is on and region is active.
`crux-capitalize-region` | C-x M-c | `capitalize-region` when `transient-mark-mode` is on and region is active.
`crux-other-window-or-switch-buffer` | M-o | Select other window, or switch to most recent buffer if only one windows.Here's how you'd bind some of the commands to keycombos:
```el
(global-set-key [remap move-beginning-of-line] #'crux-move-beginning-of-line)
(global-set-key (kbd "C-c o") #'crux-open-with)
(global-set-key [(shift return)] #'crux-smart-open-line)
(global-set-key (kbd "s-r") #'crux-recentf-find-file)
(global-set-key (kbd "C-") #'crux-kill-line-backwards)
(global-set-key [remap kill-whole-line] #'crux-kill-whole-line)
```For `crux-ispell-word-then-abbrev` to be most effective you'll also need to add this to your config:
```el
(setq save-abbrevs 'silently)
(setq-default abbrev-mode t)
```## Using the bundled advices
crux ships with some handy advises that can enhance the operation of existing commands.
#### `(crux-with-region-or-buffer)` ####
You can use `crux-with-region-or-buffer` to make a command acting
normally on a region to operate on the entire buffer in the absence of
a region. Here are a few examples you can stuff in your config:```el
(crux-with-region-or-buffer indent-region)
(crux-with-region-or-buffer untabify)
```#### `(crux-with-region-or-line)` ####
Likewise, you can use `crux-with-region-or-line` to make a command
alternately act on the current line if the mark is not active:```el
(crux-with-region-or-line comment-or-uncomment-region)
```#### `(crux-with-region-or-sexp-or-line)` ####
Similarly, `crux-with-region-or-sexp-or-line` makes a command that acts on the active region, or else
the current list (or string), or finally the current line:```el
(crux-with-region-or-sexp-or-line kill-region)
```#### `(crux-with-region-or-point-to-eol)` ####
Sometimes you might want to act on the point until the end of the
current line, rather than the whole line, in the absence of a region:``` el
(crux-with-region-or-point-to-eol kill-ring-save)
```## Minor modes
#### `(crux-reopen-as-root-mode)` ####
Crux provides a `crux-reopen-as-root` command for reopening a file as
root. This global minor mode changes `find-file` so all root files are
automatically opened as root.## License
Copyright © 2015-2024 Bozhidar Batsov and [contributors][].
Distributed under the GNU General Public License; type C-h C-c to view it.
[badge-license]: https://img.shields.io/badge/license-GPL_3-green.svg
[melpa-badge]: http://melpa.org/packages/crux-badge.svg
[melpa-stable-badge]: http://stable.melpa.org/packages/crux-badge.svg
[melpa-package]: http://melpa.org/#/crux
[melpa-stable-package]: http://stable.melpa.org/#/crux
[COPYING]: http://www.gnu.org/copyleft/gpl.html
[contributors]: https://github.com/bbatsov/crux/contributors
[melpa]: http://melpa.org
[melpa stable]: http://stable.melpa.org