This is currently a very simple (though functional) clone of the Unix 'ls' command written in Rust. It is a learning project for me to learn Rust so probably contains many inefficiencies and bad practices. I'll get better with time! 😁
This project is currently only compatible with Unix-like systems (Linux, MacOs, etc.). Windows support is planned to be added very soon.
To display the folder and file icons, you need to first install a 'Nerd Font' for your terminal. You can find a great selection of Nerd Fonts from the Nerd Fonts website
My personal favourite is MesoLG Nerd Font, but there are many others to choose
from. You will also need to set up your terminal to use that font.
If you DO NOT want to install a Nerd Font, pass the --no-icons switch to
the program (or no_icons=true in the config file).
For Linux and Mac you can download the latest binary files from the release
page. Unpack the archive
and move the single file lsp to somewhere in your path so it can be located.
Ensure it is set as executable (though it already should be).
These binaries are auto-generated for each release.
If you have rust installed, you can install the latest release of this package, using the following command:
cargo install lsplusThis will install the lsp binary into your ~/.cargo/bin directory. Make
sure that this directory is in your PATH environment variable so that you
can run the lsp command from anywhere.
You can also install the package from the GitHub repository by running the following command:
cargo install --git https://github.com/seapagan/lsplus.gitRun this command in your terminal to list files in the current directory:
lsp <options> <path | file>Both the options and the path are optional. If no path is provided, the current
directory will be listed. If no options are provided, the default options will
be used which are similar to the ls command.
Curently, only a sub-set of the standard ls options are supported. These are:
-a/--all- Show hidden files-A/--almost-all- Show hidden files, but don't show.and..-p/--slash-dirs- Append a '/' to directories--file-type- Append type indicators except*for executables-F/--classify- Append type indicators, including*for executables--no-indicators- Disable file type indicators-l/--long- Show long format listing-h/--human-readable- Human readable file sizes-D/--sort-dirs- Sort directories first-I/--gitignore- Dim entries matched by Git ignore rules-N/--no-color- Disable colored and styled output--no-icons- don't show file or folder icons-V/--version- Print version information and exit-Z/--fuzzy-time- Show fuzzy time for file modification times
You can combine the short options together, e.g. -laph will show a long format
listing with hidden files, append a '/' to directories, and show human-readable
file sizes.
Use the --help option to see the full list of options.
The indicator characters are:
/for directories@for symlinks|for FIFOs=for sockets*for executables, but only with-F/--classify
In long format, native mode omits the symlink @ marker because name -> target and the symlink styling already make the type clear. This also matches
GNU ls, which does not append @ to symlink names in long format.
When -I is enabled, lsp checks the same ignore sources Git normally uses:
merged .gitignore files in the worktree, .git/info/exclude, and the
configured global Git excludes file.
Styled output is enabled automatically when writing to a terminal. Captured,
piped, and redirected output is plain by default. You can also disable styled
output explicitly with --no-color, no_color = true in the config file, or
the NO_COLOR environment variable.
The -Z option will show a fuzzy time for file modification times. This will
show the time in a human-readable format, e.g. '2 hours ago', 'yesterday', etc.
Icons are added to folders, files, and links. There is only a limited set of mappings implemented at the moment, but more will be added in the future. Add an issue if you have a specific icon you would like to see - even better, add a Pull Request implementing it! 😁
You can disable the icons by using the --no-icons option.
lsp has two CLI modes:
native- the defaultlspluscommand-line interfacegnu- a GNUlscompatibility mode intended for aliases and scripts
You can enable GNU compatibility mode in either of these ways:
compat_mode = "gnu"or:
LSP_COMPAT_MODE=gnu lspThe LSP_COMPAT_MODE environment variable takes precedence over the config
file.
At the moment, compatibility mode only changes the CLI surface and help output.
It does not yet implement the missing GNU meanings for the conflicting short
flags -D, -I, -N, and -Z; those flags are reserved in gnu mode and
will error until their GNU behavior is implemented.
The current lsplus features behind those four native short flags are still
available in gnu mode through their long forms only:
--group-directories-first(replaces the original--sort-dirs)--gitignore--no-color--fuzzy-time
GNU indicator options are also available in gnu mode:
-p/--indicator-style=slash--file-type/--indicator-style=file-type-F/--indicator-style=classify--indicator-style=none
You can set options using the configuration file so they will apply to every run and not need to be specified on the command line. See the relevant section on the website for full details.
The lsp command can be aliased to ls by adding the following line to your
.bashrc, .zshrc or similar file:
alias ls='lsp'If you want that alias to behave more like GNU ls, enable gnu
compatibility mode in your config file or set LSP_COMPAT_MODE=gnu in your
shell environment.
You will need to restart your shell or source your configuration file for the alias to take effect.
The example below shows an alias for ls that uses many of the current options:
alias ls='lsp -laph'This will show a long format listing with hidden files, append a '/' to directories, and show human readable file sizes, as in the image above.
This repo uses husky-rs to manage local Git hooks for contributors. After
cloning the repo, run:
cargo testThat installs the versioned hooks from .husky/ for this checkout. The hooks
currently run:
cargo fmt --checkcargo clippy --all-targets --all-features -- -D warningscargo testonpre-push
cargo-make and cargo-deny are separate Cargo subcommands, so contributors
who want the full local tooling workflow should install them explicitly. They
are used for the repo's preferred task aliases such as cargo make test,
cargo make test-html, cargo make audit, and cargo make deny. Install
them with:
cargo install cargo-make
cargo install cargo-denyI am planning to add many more features to this project in the future. Check out the TODO file for a list of planned features and improvements.

