Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/Wilfred/refine

interactive value editing in emacs lisp
https://github.com/Wilfred/refine

Last synced: about 10 hours ago
JSON representation

interactive value editing in emacs lisp

Awesome Lists containing this project

README

        

# Refine
[![Build Status](https://travis-ci.org/Wilfred/refine.svg?branch=master)](https://travis-ci.org/Wilfred/refine)
[![Coverage Status](https://coveralls.io/repos/github/Wilfred/refine/badge.svg?branch=master)](https://coveralls.io/github/Wilfred/refine?branch=master)
[![MELPA](http://melpa.org/packages/refine-badge.svg)](http://melpa.org/#/refine)
[![MELPA Stable](http://stable.melpa.org/packages/refine-badge.svg)](http://stable.melpa.org/#/refine)

***inspect and modify elisp variables***

Refine provides a convenient UI for editing variables. Refine is not
for editing files, but for changing elisp variables, particularly
lists.

**Table of Contents**

- [Refine](#refine)
- [Usage examples](#usage-examples)
- [Limitations](#limitations)
- [Keybindings](#keybindings)
- [Installation](#installation)
- [Tests](#tests)
- [Related projects](#related-projects)

## Usage examples

![edit_hook](edit_hook.gif)

Refine is great for editing large lists, such as hooks. In the above
example, I insert and edit values in `prog-mode-hook`.

![kill_ring](kill_ring.gif)

Refine is also a valuable debugging tool. In this example, I reorder
items in the `kill-ring` so I paste the value I want.

## Limitations

Refine deliberately **modifies values in place**. This is useful if
you're working with a list that's shared between multiple variables,
such as `font-lock-defaults`.

In some cases, this isn't possible (e.g. inserting into an empty
list). In these cases, refine will overwrite your variable.

## Keybindings

Editing:

| command | binding |
|------------------------|-------------------|
| `refine-edit` | e or RET |
| `refine-cycle` | c |
| `refine-insert` | i |
| `refine-insert-after` | a |
| `refine-delete` | k |
| `refine-move-forward` | s or <M-up> |
| `refine-move-backward` | w or <M-down> |

Moving around:

| command | binding |
|------------------------|-------------------|
| `refine-next` | n |
| `refine-previous` | p |

Buffer commands:

| command | binding |
|------------------------|-------------------|
| `refine-update` | g |
| `kill-this-buffer` | q |

## Installation

Install from MELPA (recommended), or add refine.el to `load-path`.

## Tests

You can run tests inside Emacs by just opening the test files and
doing `M-x eval-buffer` `M-x ert RET t RET`.

Alternatively, you can run the test from a shell:

```
$ cask install
$ cask exec ert-runner
```

Note that refine has had infinite loop bugs during development, so you
may need to press Ctrl-C if tests don't terminate.

## Related projects

`counsel-set-variable` (part of
[ivy](https://github.com/abo-abo/swiper)) is also an excellent way of
editing variables in Emacs.

[edit-list](https://github.com/emacsmirror/edit-list) provides list
editing in a very similar style to refine. It doesn't edit in-place,
nor work as well for hooks, but does provide an elegant, Emacsy UI.