SkillAgentSearch skills...

Numr

Text calculator inspired by Numi - natural language expressions, variables, unit conversions

Install / Use

/learn @nasedkinpv/Numr
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

<p align="center"> <pre> ███ ██ ██ ██ ███ ███ ██████ ████ ██ ██ ██ ████ ████ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██ ██████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ████ ██████ ██ ██ ██ ██ </pre> </p> <p align="center"> <a href="https://github.com/nasedkinpv/numr/actions/workflows/ci.yml"><img src="https://github.com/nasedkinpv/numr/actions/workflows/ci.yml/badge.svg" alt="CI"></a> </p>

A text calculator for natural language expressions with a vim-style TUI.

<p align="center"> <strong><a href="https://numr.cc">Try it online →</a></strong> </p> <p align="center"> <img src="screenshots/numr_demo.gif" width="700" alt="numr TUI demo - calculations with variables, units, currencies, and continuation"> </p>

Features

  • Natural language expressions: 20% of 150, $100 in euros, 2 hours + 30 min
  • Variables: tax = 15% then 100 + tax
  • Unit conversions: Length, weight, time, temperature, data sizes
  • Compound units: 5 m * 10 m = 50 m², 100 km / 2 h = 50 km/h
  • Currency conversions: USD, EUR, GBP, JPY, CHF, CNY, CAD, AUD, INR, KRW, RUB, ILS, PLN, UAH + crypto (BTC, ETH, SOL, and more)
  • Number base conversions: 22 to hex, 22 to bin
  • Live exchange rates: Fetched automatically on startup
  • Dual keybinding modes: Vim (modal) or Standard (direct input) - toggle with Shift+Tab
  • Mouse support: Scroll with mouse wheel or trackpad
  • File persistence: Save with Ctrl+S, supports custom files
  • Syntax highlighting: Numbers, operators, variables, units, and currencies
  • Comments: Lines starting with # or // are treated as comments
  • Continuation: Start a line with an operator (+ 10, * 2) to continue from the previous result
  • Wrap mode: Toggle text wrapping with bottom-aligned results
  • Grouped totals: Currencies and units summed separately in footer (respects exchange rates)

Installation

macOS (Homebrew)

brew tap nasedkinpv/tap
brew install numr

Installs both binaries: numr (opens the calculator file in the TUI) and numr-cli (CLI/REPL/server).

Arch Linux (AUR)

# Using yay
yay -S numr

# Using paru
paru -S numr

Installs both binaries: numr (opens the calculator file in the TUI) and numr-cli (CLI/REPL/server).

From source

# Install the TUI binary
cargo install --path crates/numr-tui

# Install the CLI binary
cargo install --path crates/numr-cli

# Or build both from source
cargo build --release

# Binaries will be available at target/release/numr and target/release/numr-cli

Release archives also contain both binaries: numr (opens the calculator file in the TUI) and numr-cli (CLI/REPL/server).

Usage

TUI Mode

# Open default file (stored in OS config directory)
numr

# Open specific file
numr example.numr

CLI Mode

# Single expression
numr-cli "20% of 150"

# Evaluate file (aligned "input = result" output)
numr-cli -f example.numr

# Interactive REPL
numr-cli -i

# Pipe mode
echo "100 + 200" | numr-cli

# Show running total
numr-cli -t -f example.numr

# Aligned output for any mode
numr-cli --verbose "20% of 150"

By default, numr-cli prints just the result. File mode (-f) uses aligned input = result output. Use --verbose to get aligned output in other modes. Use -t to show a running total at the end.

On Linux, use rlwrap numr-cli -i for readline-style history and editing in the REPL.

JSON-RPC Server Mode

Run numr as a backend for other tools (editors, launchers, scripts):

numr-cli --server

Send JSON-RPC 2.0 requests via stdin, receive responses via stdout:

echo '{"jsonrpc":"2.0","method":"eval","params":{"expr":"20% of 150"},"id":1}' | numr-cli --server
# {"jsonrpc":"2.0","result":{"type":"number","value":"30","display":"30"},"id":1}

Available methods:

| Method | Params | Description | |--------|--------|-------------| | eval | {"expr": "..."} | Evaluate expression | | eval_lines | {"lines": [...]} | Evaluate multiple lines | | clear | none | Clear state | | get_totals | none | Get grouped totals | | get_variables | none | List variables | | reload_rates | none | Refresh exchange rates |

Keybindings (TUI)

The TUI supports two keybinding modes: Vim (default) and Standard. Press Shift+Tab to toggle between them.

Vim Mode

Normal Mode

| Key | Action | |-----|--------| | i / a | Enter Insert mode at/after cursor | | I / A | Enter Insert mode at line start/end | | o / O | New line below/above and enter Insert mode | | s | Substitute character (delete and insert) | | C | Change to end of line | | h / j / k / l | Move left/down/up/right | | w / b / e | Word forward/backward/end | | 0 / $ | Line start/end | | gg / G | First/last line | | Space | Move right | | PageUp/Down | Scroll page | | x / X | Delete char forward/backward | | dd | Delete line | | D | Delete to end of line | | J | Join lines | | W / N / H | Toggle wrap/line numbers/header | | ? / F1 | Toggle help | | Ctrl+s | Save | | Ctrl+r | Refresh rates | | F12 | Toggle debug | | Shift+Tab | Switch to Standard mode | | q | Quit |

Insert Mode

| Key | Action | |-----|--------| | Esc | Return to Normal mode | | Type | Insert text | | Backspace / Delete | Delete char backward/forward | | Enter | New line | | Arrows / PageUp/Down | Navigate | | Home / End | Line start/end | | Ctrl+s | Save |

Standard Mode

Direct input like traditional editors - no modal switching required.

| Key | Action | |-----|--------| | Type | Insert text directly | | Arrow keys | Move cursor | | Home / End | Line start/end | | PageUp/Down | Scroll page | | Ctrl+a / Ctrl+e | Line start/end | | Ctrl+g | Go to first line | | Backspace / Delete | Delete char | | Ctrl+k | Delete line | | Enter | New line | | Ctrl+w/l/h | Toggle wrap/line numbers/header | | ? / F1 | Toggle help | | Ctrl+s | Save | | Ctrl+r | Refresh rates | | Shift+Tab | Switch to Vim mode | | Ctrl+q | Quit |

Supported Operations

| Category | Examples | |----------|----------| | Arithmetic | 10 + 20, 6 * 7, 2 ^ 8 | | Percentages | 20% of 150, $50 - 10%, 100 + 15% | | Variables | tax = 8% then price + tax | | Continuation | $100+ $50* 2 (chains from previous) | | Functions | sum(), avg(), min(), max(), sqrt(), abs(), round(), floor(), ceil() | | Base conversion | 22 to hex0x16, 22 to bin0b10110 | | Unit conversion | 5 km in miles, 22 C in F, 1 TB in GB | | Compound units | 5 m * 10 m50 m², 100 km / 2 h50 km/h | | Currency | $100 in eur, 1 BTC in USD | | Comments | # comment or // comment | | Reference previous | _ or ANS for last result |

Compound unit aliases: kph (km/h), mph (mi/h), mps (m/s), m2 (m²), km2 (km²), ft2 (ft²)

<details> <summary>Full examples</summary>

Arithmetic

10 + 20           → 30
100 - 25          → 75
6 * 7             → 42
100 / 4           → 25
2 ^ 8             → 256

Number Base Conversions

22 to hex         → 0x16
22 to bin         → 0b10110
-42 to hex        → -0x2a

Percentages

20% of 150        → 30
100 + 15%         → 115
$50 - 10%         → $45

Variables

price = $100
tax = 8%
price + tax       → $108

Comments

# This is a comment
// This is also a comment
Groceries         $45.00

Continuation

$100              → $100
+ $50             → $150 (continues from previous)
* 2               → $300
- 10%             → $270
total = _         → $270 (_ or ANS references previous result)

Functions

sum(10, 20, 30)   → 60
avg(10, 20, 30)   → 20
min(5, 3, 8)      → 3
max(5, 3, 8)      → 8
sqrt(16)          → 4
abs(-5)           → 5
round(3.7)        → 4
floor(3.7)        → 3
ceil(3.2)         → 4

Compound Units

5 m * 10 m        → 50 m²
100 km / 2 h      → 50 km/h
50 kph * 2 h      → 100 km
50 kph in mps     → 13.89 m/s
25 km / 100 km    → 0.25 (dimensionless)
</details>

Supported Units

| Category | Units | |----------|-------| | Length | km, m, cm, mm, mi/miles, ft/feet, in/inches | | Area | /m2, km²/km2, ft²/ft2, acre, hectare/ha | | Speed | m/s/mps, km/h/kph, mph, knot | | Weight | kg, g, mg, lb/lbs, oz, ton | | Volume | L, mL, gal, /m3 | | Time | months/mo, weeks/wk, days/d, hours/hr/h, minutes/min, seconds/sec/s | | Energy | J, kJ, cal, kcal, kWh | | Power | W, kW | | Temperature | K/Kelvin, C/Celsius, F/Fahrenheit | | Data | TB, GB, MB, KB, bytes | | Fiat | $/USD, /EUR, £/GBP, ¥/JPY, CHF, CNY, CAD, AUD, /INR, /KRW, /RUB, /ILS, /PLN, /UAH | | Crypto | /BTC, Ξ/ETH, /SOL, /USDT, USDC, BNB, XRP, /ADA, Ð/DOGE, DOT, Ł/LTC, LINK, AVAX, MATIC, TON |

Architecture

graph TB
    subgraph Frontends
        CLI[numr-cli<br/>CLI · REPL · JSON-RPC]
        TUI[numr-tui<br/>Terminal UI · Vim/Standard]
        Web[numr-web<br/>WASM web app]
    end

    Editor[numr-editor<br/>Syntax highlighting]

    subgraph Core[numr-core]
        Engine[Engine]
        Engine --> Parser[PEG Parser]
        Parser --> Eval[Evaluator]
        Eval --> Types[Currency · Units · Values]
        Eval --> Cache[(Rate Cache)]
    end

    Fiat[open.er-api.com]
    Crypto[CoinGecko]

    CLI --> Engine
    TUI --> Engine
    TUI --> Editor
    Web --> Engine
    Web --> Editor
    Cache -.-> Fiat
    Cache -.-> Crypto
numr/
├── crates/
│   ├── numr-core/      # Core evaluation engine (WASM-compatible)
│   │   ├── parser/     # Pest PEG grammar and AST builder
│   │   ├── eval/       # Expression evaluation with unit/currenc

Related Skills

View on GitHub
GitHub Stars229
CategoryDevelopment
Updated1h ago
Forks5

Languages

Rust

Security Score

95/100

Audited on Apr 3, 2026

No findings