#snippets #manager #cli

bin+lib rsnip

A universal command-line snippet manager

18 releases (5 breaking)

new 0.6.1 Feb 20, 2025
0.6.0 Feb 16, 2025
0.5.6 Jan 26, 2025
0.4.1 Jan 11, 2025
0.1.2 Jan 7, 2025

#815 in Command line utilities

Download history 261/week @ 2025-01-01 832/week @ 2025-01-08 387/week @ 2025-01-15 209/week @ 2025-01-22 22/week @ 2025-01-29 23/week @ 2025-02-05 90/week @ 2025-02-12

377 downloads per month

BSD-3-Clause

84KB
2K SLoC

rsnip

Smart Snippet Management with Template Support

A powerful command-line snippet manager that helps organize, find, and reuse text snippets with advanced templating capabilities. It features fuzzy search, intelligent shell integration, and dynamic template rendering.

Crates.io License

Fast, Reliable, Yours: Why Snippets Outshine LLMs for boring Tasks

🌟 Key Features

  • Multiple Snippet Formats:
  • Smart Organization: Categorize snippets into types (shell commands, code, notes, etc.)
  • Fuzzy Search: Lightning-fast fuzzy finding with interactive fzf-style interface
  • Deep Shell Integration (Inspired by zoxide):
    • Tab completion for snippets in bash
    • Customizable aliases per snippet type
    • Interactive fuzzy completion
  • Dynamic Templates:
    • Jinja2-style template syntax
    • Date manipulation filters
    • Environment variable access
    • Safe shell command execution
  • Flexible Configuration:
    • TOML-based configuration
    • Per-snippet-type settings
  • Developer-Friendly: Comprehensive debugging support

asciicast

🚀 Quick Start

Installation

cargo install rsnip

Basic Setup

  1. Initialize configuration:
# Generate default config
rsnip --generate-config > ~/.config/rsnip/config.toml
  1. Add shell integration to your .bashrc:
# Enable tab completion and aliases
source <(rsnip --generate bash)
  1. Create your first snippet file:
rsnip edit --ctype shell

Configuration

RSnip uses TOML configuration with rich customization options:

[snippet_types.shell]
source_file = "~/.config/rsnip/shell_snippets.txt"
description = "Shell commands and scripts"
alias = ","  # Quick access alias

[snippet_types.rust]
source_file = "~/.config/rsnip/rust_snippets.json"
description = "Rust snippets in VSCode format"
format = "vcode"

[snippet_types.python]
source_file = "~/.config/rsnip/python_snippets.toml"
description = "Python snippets in SCLS format"
format = "scls"

Configuration is searched in: ~/.config/rsnip/config.toml

Snippet Formats

RSnip supports multiple snippet formats to make it easy to integrate with existing snippet collections:

  1. Default Format - RSnip's native format with comments and template support:
: Optional file-level comments

--- snippet_name
: Comment describing the snippet (optional)
: Additional comment lines
Content goes here
Multiple lines supported
---

--- template_example
: Example using templates
Hello {{ env_USER }}!
Created on: {{ current_date|strftime('%Y-%m-%d') }}
---
  1. VSCode Format - Compatible with Visual Studio Code snippets:
{
    "Rust Hello World": {
        "prefix": "rust-hello",
        "body": [
            "fn main() {",
            "    println!(\"Hello, world!\");",
            "}"
        ],
        "description": "Insert a simple Rust Hello World program"
    },
    "Rust Function": {
        "prefix": "rust-fn",
        "body": [
            "fn ${1:function_name}(${2:params}) -> ${3:ReturnType} {",
                "    ${4:// function body}",
            "}"
        ],
        "description": "Create a Rust function template"
    }
}
  1. SCLS Format - Simple Completion Language Server format (TOML-based):
[[snippets]]
prefix = "log"
scope = ["python"]
body = "print($1)"
description = "Simple print statement"

[[snippets]]
prefix = "func"
scope = ["python", "javascript"]
body = "def ${1:name}(${2:args}):\n    ${3:pass}"

🛠️ Advanced Features

Shell Integration & Aliases

RSnip provides powerful shell integration:

  1. Type-Specific Aliases: Configure quick access aliases per snippet type:
[snippet_types.shell]
alias = ","    # Use as: , mysnippet

For every alias an associated "edit" alias will be generated automatically (prefix e): e,.

  1. Smart Tab Completion:
  • Works with both full command and aliases
  • Supports fuzzy matching
  • Shows preview window with snippet content

Example usage:

# Using alias
, back<tab>   # Fuzzy finds 'backup' snippet and copies to clipboard
e, back<tab>  # Fuzzy finds 'backup' snippet and edits it

# Using full command
rsnip copy --ctype shell --input back<tab>
rsnip edit --ctype shell --input back<tab>
  1. Interactive Selection:
  • FZF-style interface
  • Live preview
  • Fuzzy search
  • Vim-style navigation
  1. Shell Support: Currently supports bash. PRs welcome for other shells!

Template System

RSnip implements a template engine with:

  1. Built-in Filters:
# Date formatting
{{ current_date|strftime('%Y-%m-%d') }}

# Date arithmetic
{{ current_date|add_days(7) }}
{{ current_date|subtract_days(7) }}

# Safe shell execution
{{ 'git rev-parse --short HEAD'|shell }}
  1. Environment Variables:
{{ env_HOME }}     # Access $HOME
{{ env_USER }}     # Access $USER
{{ env_PATH }}     # Access $PATH
  1. Dynamic Content:
--- git-commit
: Create a dated commit
git commit -m "Update: {{ current_date|strftime('%Y-%m-%d') }} - {{ 'git status -s|wc -l'|shell }} files"
---
  1. Snippets to be handled as Literal Text:

If you have snippets which happen to contain Jinja2-style template syntax, you can escape them like:

{% raw %}
gh run list --workflow "$workflow" \
    --status success --json name,startedAt,headBranch,databaseId,status \
    --template '{{range .}}{{tablerow (autocolor "white+h" .name) (autocolor "blue+h" .startedAt) .headBranch (autocolor "cyan" .databaseId) (autocolor "grey+h" .status)}}{{end}}' \
    --limit 20
{% endraw %}

Command Reference

A universal command-line snippet manager

Usage: rsnip [OPTIONS] [COMMAND]

Commands:
  types     List available snippet types
  list      List all snippets
  edit      Edit snippet in system editor
  complete  Find completions with optional interactive selection
  copy      Copy text to clipboard

Options:
  -d, --debug...              Enable debug logging. Multiple flags (-d, -dd, -ddd) increase verbosity
      --generate <GENERATOR>  Generate shell completion scripts [possible values: bash, elvish, fish, powershell, zsh]
      --generate-config       Print default configuration to stdout
      --info                  Display version and configuration information
  -h, --help                  Print help
  -V, --version               Print version

Debug Support

Multiple verbosity levels for troubleshooting:

rsnip -d    # Info level
rsnip -dd   # Debug level
rsnip -ddd  # Trace level

View system information:

rsnip --info

🔍 Usage Examples

Managing Shell Commands

  1. Create shell snippets:
--- aws-profile
: Switch AWS profile
export AWS_PROFILE={{ env_AWS_PROFILE|default('default') }}
---

--- docker-clean
: Remove unused Docker resources
docker system prune -af
---
  1. Use with aliases:
, aws<tab>     # Fuzzy finds aws-profile
,d clean<tab>  # Finds docker-clean using docker alias

Git Workflows

  1. Create git snippets:
--- commit-wip
: Create WIP commit with date
git commit -m "WIP: {{ current_date|strftime('%Y-%m-%d %H:%M') }}"
---
  1. Use with dedicated alias:
,g wip<tab>  # Finds and applies commit-wip

🤝 Contributing

Contributions welcome! Please check our Contributing Guide.

Development Setup

# Clone repository
git clone https://github.com/yourusername/rsnip
cd rsnip

# Run tests
cargo test

# Build release
cargo build --release

📄 License

BSD 3-Clause License - see LICENSE for details.

🙏 Acknowledgments

Built with excellent Rust crates:

  • clap: Command line parsing
  • minijinja: Template engine
  • skim: Fuzzy finder
  • anyhow/thiserror: Error handling
  • crossterm: Terminal UI

Similar Work

GitHub - knqyf263/pet: Simple command-line snippet manager

Shell integration inspired by: GitHub - ajeetdsouza/zoxide: A smarter cd command. Supports all major shells.

Dependencies

~21–36MB
~593K SLoC