A WIP shell written in Rust.
{{{
 ▄████████    ▄████████ ███    █▄     ▄████████     ███
███    ███   ███    ███ ███    ███   ███    ███ ▀█████████▄
███    █▀    ███    ███ ███    ███   ███    █▀     ▀███▀▀██
███         ▄███▄▄▄▄██▀ ███    ███   ███            ███   ▀
███        ▀▀███▀▀▀▀▀   ███    ███ ▀███████████     ███    
███    █▄  ▀███████████ ███    ███          ███     ███    
███    ███   ███    ███ ███    ███    ▄█    ███     ███    
████████▀    ███    ███ ████████▀   ▄████████▀     ▄████▀  
             ███    ███
}}}

{{https://user-images.githubusercontent.com/44369810/136675409-34ebf5b6-16a1-4720-9a07-f0dd0fa0c650.png|crusty mascot}}

^ Say hello to crust's mascot :D ^

crust is a WIP shell written in Rust by [[https://github.com/Phate6660|Phate6660]] and [[https://github.com/TheOnAndOnlyZenomat|Zenomat]].

Some of the functionality is split off into features, to reduce the amount of crates pulled in by default. They are:
* colors (for colorized output in ls (and other builtins once implemented))
* readline (a default feature (but can be turned off), for having a nice interactible prompt)
** when disabled, you'll have very basic line input (think of shells like dash)
** NOTE: the prompt is customizable regardless of whether or not you choose to enable the feature
* time (for getting the time with the %{D12} and %{D24} variables)

If you don't want any features at all, then build or run with the arg //--no-default-features//.

== Running ==
To run an interactive shell:\\
//cargo run --release//

To run a non-interactive shell with a command:\\
//cargo run --release -- -c "echo test | sed s/test/success/g"//

== Roadmap ==
=== Shell ===
| FEATURE        | TODO  | WIP  | DONE  |
| Basic commands |       |      | X     |
| CMDs with args |       |      | X     |
| Paging         |       |      | X     |
| Piping         |       |      | X     |
| Prompt         |       |      | X     |
| Redirection    |       |      | X     |
| Builtins       |       | X    |       |
| Config file    |       | X    |       |
| Job control    |       | X    |       |
| Line editor    |       | X    |       |
| Env variables  | X     |      |       |
| Scripting      | X     |      |       |

==== Prompt ====
| FEATURE               | TODO  | WIP  | DONE  |
| Automatically update  |       |      | X     |
| Colors                |       |      | X     |
| Command output        |       |      | X     |
| File content          |       |      | X     |
| Replaceable variables |       |      | X     |
| Set via env var       |       |      | X     |

The default prompt looks like:\\
{{images/default-prompt.png|Default Prompt}}

Customize the prompt by setting the PROMPT variable in the environment or through the config.\\
What you can use in the prompt:

Information variables:
* %{CL} for the full current working directory (e.g. /home/valley/projects/crust).
* %{CS} for the short current working directory (e.g. crust).
* %{D} for the date (e.g. Wed Dec 15).
* %{H} for the current user's home directory.
* %{T12} and %{T24} for 12 and 24 hour time respectively.
* %{U} for the current user.
* %(//command//) for capturing the output of //command//.
* %[//file//] to get the contents of //file//.

Formatting:
* %{b} to make text bold.
* %{i} to italicize text.
* %{rb} to reset the background color.
* %{re} to reset all text attributes.
* %{rf} to reset the text color.
* %{u} to underline text.
* B<//COLOR//> for changing the background color.
* F<//COLOR//> for changing the text color.
* \n for newline.
* Anything else will be printed as-is.

//COLOR// should be replaced with one of:
* BLACK
* RED
* GREEN
* YELLOW
* BLUE
* MAGENTA
* CYAN
* WHITE

Example for formatting:\\
//PROMPT="%{b}F<MAGENTA>%{T24}%{re} - %{i}%{U}@%(hostname)%{re}\nB<GREEN>F<BLACK>%{CL}%{re}» "//\\
Which for me looks like this:\\
{{images/customized-prompt.png|Customized Prompt}}\\
This showcases a multiline prompt with different foreground and background colors, as well as a command substitution and shell-prompt-features, like time and user.

==== Line Editing ====
===== Basic Line Editing =====
| FEATURE       | TODO | WIP | DONE |
| Command Input |      |     | X    |
| Arrow Keys    | X    |     |      |
| Backspace     | X    |     |      |

===== Rustyline =====
| FEATURE                | TODO  | WIP  | DONE  |
| Basic line editing     |       |      | X     |
| Command history        |       |      | X     |
| Completions            | X     |      |       |
| Modifiable keybindings | X     |      |       |
| Syntax highlighting    | X     |      |       |

=== Builtins ===
==== calc ====
| FEATURE    | TODO  | WIP  | DONE  |
| Basic math |       |      | X     |
| Equations  | X     |      |       |
| PEMDAS     | X     |      |       |

==== cat ====
| FEATURE             | TODO | WIP | DONE |
| Read file           |      |     | X    |
| Print line numbers  |      |     | X    |
| Print specific line |      |     | X    |
| Paging support      | X    |     |      |
| Syntax highlighting | X    |     |      |

==== cd ====
| FEATURE        | TODO  | WIP  | DONE  |
| Exact paths    |       |      | X     |
| Relative paths |       |      | X     |
| Previous dir   |       |      | X     |

==== echo ====
| FEATURE          | TODO  | WIP  | DONE  |
| Basic output     |       |      | X     |
| Escape sequences |       | X    |       |

==== help ====
| FEATURE                     | TODO  | WIP  | DONE  |
| Invidual helps for builtins |       |      | X     |
| List builtins               |       |      | X     |
| Quick start / tutorial      | X     |      |       |

==== ls ====
| FEATURE              | TODO  | WIP  | DONE  |
| Basic colored output |       |      | X     |
| Cross-platform       |       |      | X     |
| List files           |       |      | X     |
| Additional details   | X     |      |       |

=== Config File ===
| OPTION                 | TODO | WIP | DONE |
| Edit mode              |      |     | X    |
| History auto add lines |      |     | X    |
| History file           |      |     | X    |
| History ignore spaces  |      |     | X    |
| History size           |      |     | X    |
| Prompt                 |      |     | X    |

Notes:
* A default config is created for you if non-existant, look at //example-config// in the repo for an example.
* Comments (lines that start with //*//) or ignored.
* Invalid options are ignored and a warning is issued.