---
# System prepended metadata

title: Nushell Hacks

---

# Nushell Hacks

## 1. ends-with / starts-with operators
```
❯ ls | where name ends-with .toml or name starts-with Car
╭─#─┬────────name─────────┬─type─┬───size───┬────modified────╮
│ 0 │ Cargo.lock          │ file │ 165.4 KB │ 22 minutes ago │
│ 1 │ Cargo.toml          │ file │   6.4 KB │ an hour ago    │
│ 2 │ Cross.toml          │ file │    666 B │ an hour ago    │
│ 3 │ rust-toolchain.toml │ file │   1.1 KB │ an hour ago    │
╰───┴─────────────────────┴──────┴──────────┴────────────────╯
```

## 2. easter egg

Did you know that when you start nushell, the `$env.CMD_DURATION_MS` value of 0823 is an easter egg? [It's nushell's first pubic release date month day](https://github.com/nushell/nushell/releases/tag/0.2.0).

## 3. abbr

With this menu and keybinding configured appropriately in your config.nu file, you can hit `ctrl+space` and your alias abbreviation will expand to it's non-abbreviated form.

For instance, if you have this alias
```
alias gwch = git whatchanged -p --abbrev-commit --pretty=medium
```
and then you type `gwch<ctrl+space>` it will expand on the prompt line to 
```
git whatchanged -p --abbrev-commit --pretty=medium
```

### keybinding
```js
  {
    name: abbr
    modifier: control
    keycode: space
    mode: [emacs, vi_normal, vi_insert]
    event: [
    { send: menu name: abbr_menu }
    { edit: insertchar, value: ' '}
    ]
  }
```
### menu
```js
    {
      name: abbr_menu
      only_buffer_difference: false
      marker: "👀 "
      type: {
        layout: columnar
        columns: 1
        col_width: 20
        col_padding: 2
      }
      style: {
        text: green
        selected_text: green_reverse
        description_text: yellow
      }
      source: { |buffer, position|
        scope aliases
        | where name == $buffer
        | each { |it| {value: $it.expansion }}
      }
    }
```
## 4. case-insensitive `where` with `ls`

People often forget that the `=~` and `!~` are regular expression operators, which means you can do a case-insensitive search like this.

```
❯ ls | where name =~ '(?i)car'
╭─#─┬────name────┬─type─┬───size───┬────modified────╮
│ 0 │ Cargo.lock │ file │ 160.6 KB │ 8 hours ago    │
│ 1 │ Cargo.toml │ file │   6.4 KB │ 8 hours ago    │
│ 2 │ car.txt    │ file │      0 B │ 11 seconds ago │
╰───┴────────────┴──────┴──────────┴────────────────╯
```

## 5. the magic of nushell datatype closures

In your config.nu file you can have themes that color nushell datatypes a particular color. One thing that is sometimes overlooked is that these colors can also be closures, like the one below for `string`.

```
string: {|| if $in =~ '^#[a-fA-F\d]+' { $in } else { 'default' } }
```

This allows nushell to detect anything that looks like a hex color and display that color in nushell.

This allows you to take a file like the x11 rgb.txt file and parse it into colors.

rgb.txt
```
❯ open ~/Downloads/rgb.txt | lines | last 10
╭───┬───────────────────────────────────╮
│ 0 │ 139   0   0        DarkRed        │
│ 1 │ 144 238 144        light green    │
│ 2 │ 144 238 144        LightGreen     │
│ 3 │ 220  20  60        crimson        │
│ 4 │  75   0 130        indigo         │
│ 5 │ 128 128   0        olive          │
│ 6 │ 102  51 153        rebecca purple │
│ 7 │ 102  51 153        RebeccaPurple  │
│ 8 │ 192 192 192        silver         │
│ 9 │   0 128 128        teal           │
╰───┴───────────────────────────────────╯
```
And after parsing the file looks similar to this.
![rgb](https://hackmd.io/_uploads/rkJ-n77qa.png)
