A pretty shell prompt, written in rust
Go to file
2024-12-02 04:26:42 +00:00
screenshot typo 2024-08-18 11:13:29 +05:30
src updated comments 2024-12-01 21:15:46 +05:30
.gitignore commit 2024-08-14 03:19:45 +05:30
Cargo.lock Updated README 2024-11-30 14:16:14 +05:30
Cargo.toml Updated README 2024-11-30 14:16:14 +05:30
LICENSE Initial commit 2024-08-13 21:32:52 +00:00
README.md updated README 2024-12-02 09:49:45 +05:30

PrettyPrompt

A pretty shell prompt, written in rust.

Current Features

  • User indicator - Symbol with different colors for root user and normal users
  • Error indicator - Symbol with different colors to indicate if the last comment was successful
  • Git repo indicator
    • Indicates if the current directory is a repo or a regular directory
    • Branches indicated by different colors
  • SSH indicator - Symbol to indicate if the current shell is in an SSH session
  • Current directory
    • Abbreviated if the path is too long
    • Replaces the user's home directory with a ~ symbol
    • Show the repo's name if currently in a git repo

Screenshot

screenshot

Planned Features

  • Right-hand side prompt: Challenging to implement on non-zsh shells.
  • Configuration file
    • Choose only the components you need
    • Change appearance
      • Symbols and text
      • Colors
      • Order and position
    • Custom components
      • Static: Shell icon, Host name, etc.
      • Dynamic: Time & date, system stats, or any custom commands

Current Limitations

  • Hard-Coded Configuration: User customization is not available yet.
  • Exit Code Requirement: Must pass the last commands exit code as a command-line argument.

Tested on

Ubuntu 24.04

  • bash 5.2
  • zsh 5.9
  • ion 1.0.0-alpha

Installation

Step 1. Build binary from source
This requires rust installed on your system.

git clone https://git.candifloss.cc/candifloss/PrettyPrompt.git  
cd PrettyPrompt/  
cargo build --release  
# Binary location: `target/release/prettyprompt`    

Step 2. Add to $PATH

  • Option 1. Move the binary to a directory in your $PATH. Eg:
sudo mv target/release/prettyprompt /usr/bin/
  • Option 2. Add the directory containing the binary to $PATH
    System-wide: /etc/profile
    User-specific: ~/.profile
    Shell-specific: bashrc, zshrc, etc.
export PATH="$PATH:/path/where/the/binary/is/"

Usage

Configuration varies by shell, and the file location varies by distro. Refer your shell's docs or community resources for details. Note that the exit code of the last command(usually $? variable) must be passed as a command-line argument.

bash

  • The PS1 variable sets a fixed prompt string.
  • This PROMPT_COMMAND variable sets a dynamic prompt.

System-wide: /etc/bash.bashrc
User-specific: ~/.bashrc:

PS1=""  # Set it to an empty string
PROMPT_COMMAND='prettyprompt $?'  # Single quotes, not double quotes

ion

The PROMPT function is currently the only way to customize the prompt according to the ion shell docs.
User-specific config: ~/.config/ion/initrc:

fn PROMPT
    prettyprompt $?
end

zsh

Export the PS1 variable with the output of prettyprompt $? as its value.
User-specific: ~/.zshrc
System-wide: /etc/zsh/zshrc

export PS1='$(prettyprompt $?)' # Notice the single quotes

Other shells

For other shells, refer their docs to set a dynamic prompt. Ensure the last command's exit code ($? or equivalent) is passed to prettyprompt.

Changes since the last version

  • Updated Output String Type: Ansi strings improved compatibility with other shells.
  • Revamped Indicator Symbols: Enhanced the visual aspect of the prompt.
  • Removed Shell Icon: Determining the shell is practically not possible.
  • Conditional Component Inclusion: A first step towards user-configuration expected in future versions.
  • Code Improvements: readability and performance
    • Refactoring: Modular structure for better readability and maintenance.
    • Modularization: Separate modules for cleaner organization.
    • Error Handling: Improved logic to exclude error messages from the prompt.
    • Enhanced Documentation: Comments for better comprehension.

Acknowledgement

The current default (and only) theme draws inspiration from s1ck94 theme of zimfw.

Why this project?

  • Efficiency: Avoids repeated invocation of multiple binaries like tr, grep, echo, git, sed, etc., which would otherwise be used dozens of times in shell scripts just to generate a colored string.
  • Portability: Eliminates the need to write separate scripts in different shell languages for various shells.
  • Learning Rust: Serves as a fun and practical project to learn and apply Rust programming skills.