Files
noil/README.md
2025-07-26 15:34:29 +02:00

3.3 KiB
Raw Permalink Blame History

noil

noil is a structured, text-buffer-based file operation tool think of it like oil.nvim, but for any editor, terminal, or automated process.

Edit filesystem operations like it's plain text, and then apply them in a controlled, explicit way.

demo


Interactive Mode (TBA)

I am planning an interactive TUI mode, where you don't have to care about tags, like in oil. For now the normal editor is quite useful though, and allows all types of editors to easily move, edit files and so on.


Features

  • Edit your file tree like a normal buffer
  • Preview, format, and apply changes
  • Integrates with $EDITOR
  • CLI first, editor agnostic
  • No surprises: nothing is applied until you say so

🛠️ Usage

1. Basic CLI

# Preview file tree and tags
noil . 

# Edit in your $EDITOR
noil edit .

# Format an existing buffer (e.g. from within your editor)
cat something.noil | noil fmt > something.noil

# Apply changes from a buffer
cat something.noil | noil apply

noil will always ask you if you want to apply your changes before doing any operations.


✍️ Syntax

Each line follows this format:

<operation> <tag?> : <filepath>

Supported operations:

Operation Meaning Tag Required?
ADD Add new file No
COPY Copy file with given tag Yes
DELETE Delete file with given tag Yes
MOVE Move file with given tag Yes
(blank) Reference existing file (default) Yes

Example

         abc   :   /etc/nginx
COPY     abc   :   /tmp/nginx-copy
DELETE   123   :   /etc/nginx
ADD            :   /new/file.txt

You can use short, unique tags (like abc, ng1, etc.) to refer to files. noil will generate these tags when you run noil ..


🧽 Formatting

Want to clean up alignment and spacing?

cat my-buffer.noil | noil fmt

Or automatically format inside your editor with the following config for Helix:

[[language]]
name = "noil"
scope = "source.noil"
injection-regex = "noil"
file-types = ["noil"]
auto-format = true
indent = { tab-width = 3, unit = "  " }
formatter = { command = "noil", args = ["fmt"] }

[[grammar]]
name = "noil"
source = { git = "https://git.kjuulh.io/kjuulh/tree-sitter-noil.git", rev = "2f295629439881d0b9e89108a1296881d0daf7b9" }

🔒 Safety First

No changes are ever made unless you explicitly apply them with:

# Closing the file, will trigger an apply, asking for prompt like normal
noil edit .

noil apply < my-buffer.noil

You will be prompted before anything is modified.


🧠 Philosophy

noil gives you full control over file operations in a composable and editor-friendly way. Think Git index, but for actual file moves and deletions — human-editable, patchable, and grep-able.


📦 Installation

Build from crates:

cargo install noil

Build from source:

cargo install --git https://git.kjuulh.io/kjuulh/noil.git

Or clone locally and run with cargo run.


📋 License

MIT