# The next gen ls command


# LSD (LSDeluxe)

[![image](https://raw.githubusercontent.com/lsd-rs/lsd/assets/screen_lsd.png align="left")](https://raw.githubusercontent.com/lsd-rs/lsd/assets/screen_lsd.png)

This project is a rewrite of GNU `ls` with lots of added features like colors, icons, tree-view, more formatting options etc. The project is heavily inspired by the super [colorls](https://github.com/athityakumar/colorls) project.

## Installation

<details><summary>Packaging status</summary><a href="https://repology.org/project/lsd/versions"><img src="https://camo.githubusercontent.com/5e80faab95714fa8d285deca6a1146a9bde47a034701c7909cc2b2465506fbe6/68747470733a2f2f7265706f6c6f67792e6f72672f62616467652f766572746963616c2d616c6c7265706f732f6c73642e7376673f636f6c756d6e733d33" alt="Packaging status" /></a></details>

### Prerequisites

Install the patched fonts of powerline nerd-font and/or font-awesome. Have a look at the [Nerd Font README](https://github.com/ryanoasis/nerd-fonts/blob/master/readme.md) for more installation instructions. Don't forget to setup your terminal in order to use the correct font.

| OS/Distro | Command |
| --- | --- |
| Archlinux | `pacman -S lsd` |
| Fedora | `dnf install lsd` |
| Gentoo | `sudo emerge sys-apps/lsd` |
| macOS | `brew install lsd` or `sudo port install lsd` |
| NixOS | `nix-env -iA nixos.lsd` |
| FreeBSD | `pkg install lsd` |
| NetBSD or any `pkgsrc` platform | `pkgin install lsd` or `cd /usr/pkgsrc/sysutils/lsd && make install` |
| OpenBSD | `pkg_add lsd` |
| Windows | `scoop install lsd` or `winget install --id lsd-rs.lsd` or `choco install lsd` |
| Android (via Termux) | `pkg install lsd` |
| Debian sid and bookworm | `apt install lsd` |
| Ubuntu 23.04 (Lunar Lobster) | `apt install lsd` |
| Earlier Ubuntu/Debian versions | **snap discontinued**, use [From Binaries](https://github.com/lsd-rs/lsd#from-binaries) |
| Solus | `eopkg it lsd` |
| Void Linux | `sudo xbps-install lsd` |
| openSUSE | `sudo zypper install lsd` |

### From source

With Rust's package manager cargo, you can install lsd via:

```basic
cargo install lsd
```

If you want to install the latest master branch commit:

```basic
cargo install --git https://github.com/lsd-rs/lsd.git --branch master
```

### From Binaries

The [release page](https://github.com/lsd-rs/lsd/releases) includes precompiled binaries for Linux, macOS and Windows for every release. You can also get the latest binary of `master` branch from the [GitHub action build artifacts](https://github.com/lsd-rs/lsd/actions?query=branch%3Amaster+is%3Asuccess+event%3Apush) (choose the top action and scroll down to the artifacts section).

## Configuration

`lsd` can be configured with a configuration file to set the default options. Check [Config file content](https://github.com/lsd-rs/lsd#config-file-content) for details.

### Config file location

### Non-Windows

On non-Windows systems `lsd` follows the [XDG Base Directory Specification](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html) convention for the location of the configuration file. A `config.yaml` or `config.yml` file will be searched for in these locations, in order:

* `$HOME/.config/lsd`
    
* `$XDG_CONFIG_HOME/lsd`
    

On most systems these are mapped to the same location, which is `~/.config/lsd/config.yaml`.

### Windows

On Windows systems `lsd` searches for `config.yaml` or `config.yml` in the following locations, in order:

* `%USERPROFILE%\.config\lsd`
    
* `%APPDATA%\lsd`
    

These are usually something like `C:\Users\username\AppData\Roaming\lsd\config.yaml` and `C:\Users\username\.config\lsd\config.yaml` respectively.

### Custom

You can also provide a configuration file from a non-standard location: `lsd --config-file [PATH]`

### Config file content

<details><summary>This is an example config file with the default values and some additional remarks.</summary><div class="highlight highlight-source-yaml notranslate position-relative overflow-auto"><pre><span class="pl-c"><span class="pl-c">#</span> == Classic ==</span>
<span class="pl-c"><span class="pl-c">#</span> This is a shorthand to override some of the options to be backwards compatible</span>
<span class="pl-c"><span class="pl-c">#</span> with `ls`. It affects the "color"->"when", "sorting"->"dir-grouping", "date"</span>
<span class="pl-c"><span class="pl-c">#</span> and "icons"->"when" options.</span>
<span class="pl-c"><span class="pl-c">#</span> Possible values: false, true</span>
<span class="pl-ent">classic</span>: <span class="pl-c1">false</span>
<p><span class="pl-c"><span class="pl-c">#</span> == Blocks ==</span>
<span class="pl-c"><span class="pl-c">#</span> This specifies the columns and their order when using the long and the tree</span>
<span class="pl-c"><span class="pl-c">#</span> layout.</span>
<span class="pl-c"><span class="pl-c">#</span> Possible values: permission, user, group, context, size, date, name, inode, links, git</span>
<span class="pl-ent">blocks</span>:</p>
<ul>
<li><span class="pl-s">permission</span></li>
<li><span class="pl-s">user</span></li>
<li><span class="pl-s">group</span></li>
<li><span class="pl-s">size</span></li>
<li><span class="pl-s">date</span></li>
<li><span class="pl-s">name</span></li>
</ul>
<p><span class="pl-c"><span class="pl-c">#</span> == Color ==</span>
<span class="pl-c"><span class="pl-c">#</span> This has various color options. (Will be expanded in the future.)</span>
<span class="pl-ent">color</span>:
<span class="pl-c"><span class="pl-c">#</span> When to colorize the output.</span>
<span class="pl-c"><span class="pl-c">#</span> When "classic" is set, this is set to "never".</span>
<span class="pl-c"><span class="pl-c">#</span> Possible values: never, auto, always</span>
<span class="pl-ent">when</span>: <span class="pl-s">auto</span>
<span class="pl-c"><span class="pl-c">#</span> How to colorize the output.</span>
<span class="pl-c"><span class="pl-c">#</span> When "classic" is set, this is set to "no-color".</span>
<span class="pl-c"><span class="pl-c">#</span> Possible values: default, custom</span>
<span class="pl-c"><span class="pl-c">#</span> When "custom" is set, lsd will look in the config directory for <code>colors.yaml</code>.</span>
<span class="pl-ent">theme</span>: <span class="pl-s">default</span></p>
<p><span class="pl-c"><span class="pl-c">#</span> == Date ==</span>
<span class="pl-c"><span class="pl-c">#</span> This specifies the date format for the date column. The freeform format</span>
<span class="pl-c"><span class="pl-c">#</span> accepts a strftime like string.</span>
<span class="pl-c"><span class="pl-c">#</span> When "classic" is set, this is set to "date".</span>
<span class="pl-c"><span class="pl-c">#</span> Possible values: date, locale, relative,</span></p>
<h2>Theme</h2>
<p><code>lsd</code> can be configured with theme files to set the colors or icons.</p>
<h3>Color Theme</h3>
<p>Color theme can be configured in the <a href="https://github.com/lsd-rs/lsd#configuration">configuration file</a>(color.theme). The valid theme configurations are:</p>
<ul>
<li>
<p><code>default</code>: the default color scheme shipped in <code>lsd</code></p>
</li>
<li>
<p><code>custom</code>: use a custom color scheme defined in <code>colors.yaml</code></p>
</li>
<li>
<p><em>(deprecated) theme_file_name(yaml): use the theme file to specify colors (without the</em> <code>yaml</code> extension)</p>
</li>
</ul>
<p>When set to <code>custom</code>, <code>lsd</code> will look for <code>colors.yaml</code> in the XDG Base Directory, e.g. ~/.config/lsd/colors.yaml</p>
<p>When configured with the <code>theme-file-name</code> which is a <code>yaml</code> file, <code>lsd</code> will look up the theme file in the following way:</p>
<ul>
<li>
<p>relative name: check the XDG Base Directory, e.g. ~/.config/lsd/themes/.yaml</p>
</li>
<li>
<p>absolute name: use the file path and name to find theme file</p>
</li>
</ul>
<p>Check <a href="https://github.com/lsd-rs/lsd#color-theme-file-content">Color Theme file content</a> for details.</p>
<h4>Color Theme file content</h4>
<p>Theme file use the <a href="https://crates.io/crates/crossterm">crossterm</a> to configure the colors, check <a href="https://docs.rs/crossterm/0.20.0/crossterm/style/enum.Color.html">crossterm</a> for supported colors.</p>
<p>Color table: <a href="https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg">https://upload.wikimedia.org/wikipedia/commons/1/15/Xterm_256color_chart.svg</a></p>
<p>Please notice that color values would ignore the case, both lowercase and UPPERCASE is supported.</p>
<p>This is the default theme scheme shipped with <code>lsd</code>.</p>
<pre><code class="language-basic">user: 230
group: 187
permission:
  read: dark_green
  write: dark_yellow
  exec: dark_red
  exec-sticky: 5
  no-access: 245
  octal: 6
  acl: dark_cyan
  context: cyan
date:
  hour-old: 40
  day-old: 42
  older: 36
size:
  none: 245
  small: 229
  medium: 216
  large: 172
inode:
  valid: 13
  invalid: 245
links:
  valid: 13
  invalid: 245
tree-edge: 245
git-status:
  default: 245
  unmodified: 245
  ignored: 245
  new-in-index: dark_green
  new-in-workdir: dark_green
  typechange: dark_yellow
  deleted: dark_red
  renamed: dark_green
  modified: dark_yellow
  conflicted: dark_red</code></pre>
<p>When creating a theme for <code>lsd</code>, you can specify any part of the default theme, and then change its colors, the items missed would fall back to use the default colors.</p>
<h3>Icon Theme</h3>
<p>Icon theme can be configured in a fixed location, <code>$XDG_CONFIG_DIR/lsd/icons.yaml</code>, for example, <code>~/.config/lsd/icons.yaml</code> on macOS, please check <a href="https://github.com/lsd-rs/lsd#config-file-location">Config file location</a> to make sure where is <code>$XDG_CONFIG_DIR</code>.</p>
<p>As the file name indicated, the icon theme file is a <code>yaml</code> file.</p>
<p>Check <a href="https://github.com/lsd-rs/lsd#icon-theme-file-content">Icon Theme file content</a> for details.</p>
<h4>Icon Theme file content</h4>
<p><code>lsd</code> support 3 kinds of icon overrides, by <code>name</code>, by <code>filetype</code> and by <code>extension</code>. The final set of icons used will be a combination of what is shipped with in <code>lsd</code> with overrides from config applied on top of it. <em>You can find the default set of icons</em> <a href="https://github.com/lsd-rs/lsd/blob/master/src/theme/icon.rs"><em>here</em></a><em>.</em></p>
<p>Both nerd font glyphs and Unicode emojis can be used for icons. You can find an example of icons customization below.</p>
<pre><code class="language-basic">name:
  .trash: 
  .cargo: 
  .emacs.d: 
  a.out: 
extension:
  go: 
  hs: 
  rs: 🦀
filetype:
  dir: 📂
  file: 📄
  pipe: 📩
  socket: 󰆨
  executable: 
  symlink-dir: 
  symlink-file: 
  device-char: 
  device-block: 󰜫
  special: </code></pre>
<h2>External Configurations</h2>
<h3>Required</h3>
<p>Enable nerd fonts for your terminal, URxvt for example in <code>.Xresources</code>:</p>
<pre><code class="language-basic">URxvt*font:    xft:Hack Nerd Font:style=Regular:size=11</code></pre>
<h3>Optional</h3>
<p>In order to use lsd when entering the <code>ls</code> command, you need to add this to your shell configuration file (~/.bashrc, ~/.zshrc, etc.):</p>
<pre><code class="language-basic">alias ls=
