nushell-show youtube.com/@nushell-prophet
Random videos about Nushell and materials related to them. All of the videos and materials are available for free reuse anywhere, including in other videos. Let's popularize Nushell!
- 001 - Keeping Nushell settings up to date with new releases (outdated after 0.100)
 - 002 - How to Install Nushell on macOS: A Step-by-Step Guide for Newbies
 - 003 - Version Control for Nushell Configs: Setting Up a Git Repository
 - 004 - Setting $env.XDG_CONFIG_HOME
 - 005 - nu-history-tools - benchmark your commands usage against of other users
 - 006 - Navigating file paths in Nushell using internal functionality, FZF, or Broot
 - 007 - topiary-nushell
 
We can use the VS Code diff function to conveniently find new and outdated lines of settings in Nushell.
To do so, we can use the following commands:
config nu --default | code --diff - $nu.config-path
config env --default | code --diff - $env.config-path
The next step after opening files should be cmd + shift + P and then >Compare: swap left and Right Editor Side
# Change directory to the path stored in the environment variable '$nu.default-config-dir'
> cd $nu.default-config-dir
# Initialize a new Git repository in the current directory
> git init
# Stage the files 'config.nu', 'env.nu', and 'history.txt' for commit
> git add config.nu env.nu history.txt
# Commit the staged files with the message 'initial commit'
> git commit -m 'initial commit'
# open config.nu file in the default editor
> config nu
# Show the status of the repository (which files are staged, modified, or untracked)
> git status
# Stage the file 'config.nu' for commit (potentially after making changes to it)
> git add config.nu
# Commit the staged file with the message 'update'
> git commit -m 'update'
On macOS, the default location for Nushell configurations is ~/Library/Application Support/nushell. The issue with this path is that it contains a space, which can lead to problems and inconveniences later.
In Linux, the XDG_CONFIG_HOME environment variable is part of the XDG Base Directory Specification, which defines standard locations for various types of configuration files. However, on macOS, the XDG_CONFIG_HOME variable is not set by default, as macOS uses its own conventions for handling configuration files.
In this video, we will manually set the XDG_CONFIG_HOME environment variable so that Nushell and other applications can use it to locate configuration files. The Nushell Book has some details on setting XDG_CONFIG_HOME too.
# Start Nushell without using history so it won't interact with the data folder during our operations
# To avoid problems, do not launch or use another instance of Nushell during this session
> nu --no-history
# See that the current path contains space and might cause inconvenience and even problems
> $nu.default-config-dir
# Let's fix it
# Ensure that you have a `.config` directory in your home directory
> mkdir ~/.config
# Move Nushell's config files and history to the appropriate folder
> mv $nu.default-config-dir ~/.config
# Verify that the files have been moved correctly
> ls ~/.config/nushell
# Create a symlink from the new config location to the default location
> ln -s ~/.config/nushell $nu.default-config-dir
# Check that the symlink was created successfully
> ls $nu.default-config-dir
# Add the XDG_CONFIG_HOME variable to your .zshrc file
> (char nl) + 'export XDG_CONFIG_HOME="$HOME/.config"' + (char nl) | save --append ~/.zshrc
# Verify the current config path
> $nu.default-config-dir
# Log out, log back in, and verify the config path again
> $nu.default-config-dir
A Nushell module to analyze the command frequencies in Nushell history, generate cool graphs, benchmark statistics with other users, and generate a file with statistics to share with the community.
https://github.com/nushell-prophet/nu-history-tools
# analyze your current commands history
> nu-history-tools analyze-history
# interactively select users to use for benchmarks in the analysis
> nu-history-tools analyze-history --pick_users
# parse submitted stats from a folder and aggregates them for benchmarking
> nu-history-tools aggregate-submissions
# parse .nu scripts
> glob **/*.nu --exclude ['**/themes/**/' '**/before_v0.60/**' '**/custom-completions/**'] | nu-history-tools analyze-nu-files
# list the history of Nushell commands with information about their crates and the Nushell versions (git tags) when they appeared.
> nu-history-tools list-all-commandsNushell, by default, provides a powerful and convenient way to navigate through file paths that can be launched with the TAB key.
If a user needs to look for paths of files or folders in their current directory, they can simply type the quote character " and then hit tab.
Additionally, a user might find the following setting, which is inactive by default, useful:
$env.config.completions.algorithm = "Fuzzy"Here is the keybinding that allows you to paste paths of recently visited directories.
# make sure that you use sqlite nushell history
$env.config.history.file_format = "Sqlite"
$env.config.menus ++= [
    {
        # List all unique successful commands
        name: working_dirs_cd_menu
        only_buffer_difference: true
        marker: "? "
        type: {
            layout: list
            page_size: 23
        }
        style: {
            text: green
            selected_text: green_reverse
        }
        source: {|buffer, position|
            open $nu.history-path
            | query db "SELECT DISTINCT(cwd) FROM history ORDER BY id DESC"
            | get CWD
            | into string
            | where $it =~ $buffer
            | compact --empty
            | each {
                if ($in has ' ') { $'"($in)"' } else {}
                | {value: $in}
            }
        }
    }
]
$env.config.keybindings ++= [
    {
        name: "working_dirs_cd_menu"
        modifier: alt_shift
        keycode: char_r
        mode: emacs
        event: { send: menu name: working_dirs_cd_menu}
    }
]homepage: https://junegunn.github.io/fzf github: https://github.com/junegunn/fzf
# I found the code below here: https://discord.com/channels/601130461678272522/615253963645911060/1209827461496569876
$env.config.keybindings ++= [
    {
        name: fzf_files
        modifier: control
        keycode: char_t
        mode: [emacs, vi_normal, vi_insert]
        event: [
          {
            send: executehostcommand
            cmd: "
              let fzf_ctrl_t_command = \"fd --type=file | fzf --preview 'bat --color=always --style=full --line-range=:500 {}'\";
              let result = nu -c $fzf_ctrl_t_command;
              commandline edit --append $result;
              commandline set-cursor --end
            "
          }
        ]
    }
]Broot is a better way to navigate directories, find files, and launch commands.
homepage: https://dystroy.org/broot github: https://github.com/Canop/broot
Save this configuration to enable Broot to output directory paths on alt + enter.
Later this config will be used in the keybindings.
let $config_path = $env.XDG_CONFIG_HOME? | default '~/.config' | path join broot select.toml
mkdir ($config_path | path dirname) 
{
    verbs: [
        [invocation, key,       leave_broot, execution,     apply_to];
        [ok,         enter,     true,        ":print_path", file    ],
        [ok,         alt-enter, true,        ":print_path", any     ]
    ]
} | save -f $config_pathadd the code below to your config.nu
# I use the `broot-source` command to enable syntax highlighting in edit mode.
def broot-source [] {
    let $broot_closure = {
        let $cl = commandline
        let $pos = commandline get-cursor
        let $element = ast --flatten $cl
            | flatten
            | where start <= $pos and end >= $pos
            | get content.0 -i
            | default ''
        let $path_exp = $element
            | str trim -c '"'
            | str trim -c "'"
            | str trim -c '`'
            | if $in =~ '^~' { path expand } else {}
            | if ($in | path exists) {} else {'.'}
        let $config_path = $env.XDG_CONFIG_HOME? | default '~/.config' | path join broot select.toml
        let $broot_path = ^broot $path_exp --conf $config_path
            | if ' ' in $in { $"`($in)`" } else {}
        if $path_exp == '.' {
            commandline edit --insert $broot_path
        } else {
            $cl | str replace $element $broot_path | commandline edit -r $in
        }
    }
    view source $broot_closure | lines | skip | drop | to text
}
$env.config.keybindings ++= [
    {
         name: broot_path_completion
         modifier: control
         keycode: char_t
         mode: [emacs, vi_normal, vi_insert]
         event: [
            {
                send: ExecuteHostCommand
                cmd: (broot-source)
            }
        ]
    }
]- Topiary: tree-sitter based uniform formatter
 - Topiary-nushell: configuration files that enable nushell code formatting
 
- Install 
rustandcargousing the instructions found at https://doc.rust-lang.org/cargo/getting-started/installation.html. - Check the installation:
 
# Restart Nushell
nu
# Make sure that .cargo/bin is in your $env.PATH
$env.PATH | find 'cargo'- Follow the installation instructions for 
topiary-nushellat https://github.com/blindFS/topiary-nushell?tab=readme-ov-file#setup. 
Just add indent = "    " to the nu field of your languages.ncl, like I did here.
topiary format shows/007-topiary-demo/topiary-demo.nuAs of now, topiary-nushell cares the most about indentations and adds new lines only if some of them are present in the original code. I wrote a simple custom command that uses the built-in ast command, finds pipe symbols and let/mut keywords, and inserts new lines before them, allowing topiary to take care of removing redundant new lines.
This command allows formatting one-liners that I write quite often. This is a copy of the command from my nu-goodies module.
# Insert new lines before the pipe symbol and let/mut
def 'insert-new-lines' [] {
    let $cmd = $in
    ast --flatten $cmd
    | filter {|it|
        $it.shape == shape_pipe or (
            $it.shape == 'shape_internalcall' and $it.content in [let mut]
        )
    }
    | insert new_lines {|i| if $i.shape == shape_pipe { "\n" } else { "\n\n" } }
    | update span { get start }
    | select span new_lines
    | reverse
    | reduce --fold (
        $cmd
        | split chars
    ) {|i| insert $i.span $i.new_lines }
    | str join
}
# Format piped in Nushell code or previous command from history using Topiary.
export def 'nu-format' [
    --no-new-lines (-n) # don't insert new lines
]: [nothing -> nothing string -> string] {
    let input = $in
    let cmd = if $input == null {
        history
        | last 2
        | first
        | get command
    } else { $input }
    $cmd
    | if $no_new_lines { } else {
        insert-new-lines
    }
    | topiary format --language nu
    | if $input == null {
        commandline edit -r $in
        return
    } else { }
}