about_Cd-Extras.help.txt
[![Coverage Status](https://coveralls.io/repos/github/nickcox/cd-extras/badge.svg?branch=master)](https://coveralls.io/github/nickcox/cd-extras?branch=master)
# cd-extras <!-- TOC --> - [Navigation helpers](#navigation-helpers) - [Navigate by `n` steps](#navigate-by-n-steps) - [Navigate by name](#navigate-by-name) - [AUTO_CD](#auto_cd) - [CD_PATH](#cd_path) - [CDABLE_VARS](#cdable_vars) - [No argument cd](#no-argument-cd) - [Two argument cd](#two-argument-cd) - [Expansion](#expansion) - [Enhanced expansion for built-ins](#enhanced-expansion-for-built-ins) - [Navigation helper expansions](#navigation-helper-expansions) - [Multi-dot and variable based expansions](#multi-dot-and-variable-based-expansions) - [Path shortening](#path-shortening) - [Additional helpers](#additional-helpers) - [Note on compatibility](#note-on-compatibility) - [Alternative providers](#alternative-providers) - [OS X & Linux](#os-x--linux) - [Install](#install) - [Configure](#configure) - [_cd-extras_ options](#_cd-extras_-options) - [Using a different alias](#using-a-different-alias) <!-- /TOC --> # What is it? general conveniences for the `cd` command in PowerShell stolen from bash and zsh ![Basic Navigation](./basic-navigation.gif) ## Navigation helpers Provides the following aliases (and corresponding functions): - `up`, `..` (`Step-Up`) - `cd-` (`Undo-Location`) - `cd+` (`Redo-Location`) - `cdb` (`Step-Back`) Examples: ```sh [C:\Windows\System32]> up # or .. [C:\Windows]> cd- [C:\Windows\System32]> cd+ [C:\Windows]> _ ``` Note that the aliases are `cd-` and `cd+` _not_ `cd -` and `cd +`. Repeated uses of `cd-` will keep moving backwards towards the beginning of the stack rather than toggling between the two most recent directories as in vanilla bash. Use `Step-Back` (`cdb`) if you want to toggle between two directories. ```sh [C:\Windows\System32]> .. [C:\Windows]> .. [C:\]> cd- [C:\Windows]> cd- [C:\Windows\System32]> cd+ [C:\Windows]> cd+ [C:\]> cdb [C:\Windows]> cdb [C:\]> _ ``` ### Navigate by `n` steps `up`, `cd+` and `cd-` each take a single optional parameter: either a number, `n`, specifying how many steps to traverse... ```sh [C:\Windows\System32]> .. 2 # or `up 2` [C:\]> cd temp [C:\temp]> cd- 2 [C:\Windows\System32]> cd+ 2 [C:\temp]> _ ``` ### Navigate by name ...or a string, `NamePart`, used to change to the nearest directory whose name matches the given argument. Given a `NamePart`, _cd-extras_ will search, starting at the current location, for directories whose _leaf_ name contains the given string. If none is found then it will attempt to match against the full path instead. [Tab completion](#navigation-helper-expansions) is available for these three helpers. ```sh [C:\Windows]> cd system32 [C:\Windows\System32]> cd drivers [C:\Windows\System32\drivers]> cd- sys [C:\Windows\System32]> cd+ [C:\Windows\System32\drivers]> cd- win [C:\Windows\]> cd+ 32/dr [C:\Windows\System32\drivers]> up win [C:\Windows\]> _ ``` When the [AUTO_CD](#auto_cd) option is enabled, multiple dot syntax is supported as an alternative to `up [n]` with [tab completions](#multi-dot-and-variable-based-expansions) available. ```sh [C:\Windows\System32\drivers\etc]> ... # same as `up 2` or `.. 2` [C:\Windows\System32]> cd- [C:\Windows\System32\drivers\etc>] .... # same as `up 3` or `.. 3` [C:\Windows]> _ ``` ## AUTO_CD Change directory without typing `cd`. ```sh [~]> projects [~/projects]> cd-extras [~/projects/cd-extras]> _ ``` As with the `cd` command, [abbreviated paths](#path-shortening) are supported. ```sh [~]> pr [~/projects]> cd-e [~/projects/cd-extras]> _ ``` ## CD_PATH Search additional locations for candidate directories. [Tab-expansion](#enhanced-expansion-for-built-ins) into `CD_PATH` directories is provided. ```sh [~]> $cde.CD_PATH = @('~/documents') [~]> # or Set-CdExtrasOption CD_PATH @('~/documents') [~]> cd WindowsPowerShell [~/documents/WindowsPowerShell]> _ ``` Note that `CD_PATH`s are _not_ searched when an absolute or relative path is given. ```sh [~]> $cde.CD_PATH = @('~/documents') [~]> cd ./WindowsPowerShell Set-Location : Cannot find path '~\WindowsPowerShell' because it does not exist. ``` ## CDABLE_VARS Save yourself a `$` when cding into folders using a variable name and enable [completion](#multi-dot-and-variable-based-expansions) for child directories. Given a variable containing the path to a folder (configured, perhaps, in your `$PROFILE` or by invoking [`Export-Up`](#multi-dot-and-variable-based-expansions)), you can `cd` into it using the name of the variable. ```sh [~]> $power = '~/projects/powershell' [~]> cd power [~/projects/powershell]> _ ``` This works with relative paths too, so if you find yourself frequently `cd`ing into the same subdirectories you could create a corresponding variable. ```sh [~/projects/powershell]> $gh = './.git/hooks' [~/projects/powershell]> cd gh [~/projects/powershell/.git/hooks]> _ ``` CDABLE_VARS is off by default. Enable it with: `Set-CdExtrasOption CDABLE_VARS $true`. ## No argument cd If the option `$cde.NOARG_CD` is defined then `cd` with no arguments will move into the nominated directory. Defaults to `'~'`. ```sh [~/projects/powershell]> cd [~]> Set-CdExtrasOption NOARG_CD / [~]> cd [C:]> ``` ## Two argument cd Replaces all instances of the first argument in the current path with the second argument, changing to the resulting directory if it exists. Uses the `Switch-LocationPart` function. You can also use the alias `cd:` or the explicit `ReplaceWith` parameter. ```sh [~\Modules\Unix\Microsoft.PowerShell.Utility]> cd unix shared [~\Modules\Shared\Microsoft.PowerShell.Utility]> cd: shared unix [~\Modules\Unix\Microsoft.PowerShell.Utility]> cd unix -ReplaceWith shared [~\Modules\Shared\Microsoft.PowerShell.Utility]>_ ``` ## Expansion ### Enhanced expansion for built-ins `cd`, `pushd` and `ls` (by default) provide enhanced tab completions, expanding all path segments so that you don't have to individually tab through each one. ```sh [~]> cd /w/s/set<[Tab]><[Tab]> [~]> cd C:\Windows\SysWOW64\setup\_ C:\Windows\System32\setup\ C:\Windows\SysWOW64\setup\ ────────────────────────── ``` Periods (`.`) are expanded around so, for example, a segment containing `.sdk` is expanded into `*.sdk*`. ```sh [~]> cd proj/pow/s/.sdk<[Tab]> [~]> cd ~\projects\powershell\src\Microsoft.PowerShell.SDK_ ``` You can change the list of commands that participate in enhanced directory completion using the `DirCompletions` [option](#configure): ```sh [~]> $cde.DirCompletions += 'mkdir' [~]> # or Set-CdExtrasOption DirCompletions ($cde.DirCompletions + 'mkdir') [~]> mkdir ~/pow/src<[Tab]> [~]> mkdir ~\powershell\src\_ ``` It's also possible to opt into enhanced file-only or general (file & directory) completion using the `FileCompletions` and `PathCompletions` options respectively. Note that the `FileCompletions` option is often less useful than the others as you won't be able to tab through directories to get to the file you're looking for. ```sh [~]> $cde.PathCompletions += 'Invoke-Item' [~]> # or Set-CdExtrasOption PathCompletions ($cde.PathCompletions + 'Invoke-Item') [~]> ii /t/<[Tab]> [~]> C:\temp\subdir_ C:\temp\subdir C:\temp\txtFile.txt C:\temp\txtFile2.txt ────────────── ``` In each case, expansions work against the target's `Path` parameter. If you want enhanced completion for a native executable or a cmdlet without a `Path` parameter then you'll need to provide a wrapper. Either the wrapper or the target itself should handle expanding `~` where necessary. e.g: ```sh [~]> function Invoke-VSCode($path) { &code (Resolve-Path $path) } [~]> $cde.DirCompletions += 'Invoke-VSCode' [~]> Set-Alias co Invoke-VSCode [~]> co ~/pr/po<[Tab]> [~]> co ~\projects\powershell_ ``` Paths within the `$cde.CD_PATH` array are included for all completion types. ```sh [~]> $cde.CD_PATH += '~\Documents\' [~]> cd win/mod<[Tab]> [~]> ~\Documents\WindowsPowerShell\Modules_ ``` ### Navigation helper expansions Expansions are provided for the `cd+`, `cd-` and `up` (_aka_ `..`) aliases. When the `MenuCompletion` option is set to `$true` and more than one completion is available, the completions offered are the indexes of each corresponding directory; the full path is displayed in the menu below. _cd-extras_ will attempt to detect `PSReadLine` in order to set this option appropriately at start-up. For example: ```sh [C:\Windows\System32\drivers\etc]> up <[Tab]> [C:\Windows\System32\drivers\etc]> up 1 1. drivers 2. System32 3. Windows ────────── [C:\Windows\System32\drivers\etc]> up 3 3. Windows ────────── ``` It's also possible tab-complete these three commands (`cd+`, `cd-`, `up`) using a partial directory name (the [`NamePart` parameter](#navigate-by-name)). ```sh [~\projects\PowerShell\src\Modules\Shared]> up pr<[Tab]> [~\projects\PowerShell\src\Modules\Shared]> up '~\projects' [~\projects]> _ ``` ### Multi-dot and variable based expansions The multi-dot syntax provides tab completion into ancestor directories. ```sh [C:\projects\powershell\docs\git]> cd ...<[Tab]> [C:\projects\powershell\docs\git]> cd C:\projects\powershell\_ ``` ```sh [C:\projects\powershell\docs\git]> cd .../<[Tab]> C:\projects\powershell\.git C:\projects\powershell\.vscode ─────────────────────────── C:\projects\powershell\demos C:\projects\powershell\docs C:\projects\powershell\test C:\projects\powershell\.github C:\projects\powershell\assets C:\projects\powershell\docker C:\projects\powershell\src C:\projects\powershell\tools ``` `Export-Up` (`xup`) recursively expands each parent path into a global variable with a corresponding name. Why? In combination with [CDABLE_VARS](#cdable_vars), it can be useful for navigating a deeply nested folder structure without needing to count `..`s. For example: ```sh [C:\projects\powershell\src\Modules\Unix]> xup Name Value ---- ----- Unix C:\projects\powershell\src\Modules\Unix Modules C:\projects\powershell\src\Modules src C:\projects\powershell\src powershell C:\projects\powershell projects C:\projects [C:\projects\powershell\src\Modules\Unix]> cd po<[Tab]> [C:\projects\powershell\src\Modules\Unix]> cd C:\projects\powershell\_ ``` might be easier than: ```sh [C:\projects\powershell\src\Modules\Unix]> cd ....<[Tab]> # or cd ../../../<[Tab]> [C:\projects\powershell\src\Modules\Unix]> cd C:\projects\powershell\_ ``` You can combine `CDABLE_VARS` with [AUTO_CD](#auto_cd) for great good: ```sh [C:\projects\powershell\src\Modules\Unix]> projects [C:\projects]> src [C:\projects\powershell\src]> _ ``` ## Path shortening If an unambiguous match is available then `cd` can be used directly, without first invoking tab expansion. ```sh [~]> cd /w/s/d/et [C:\Windows\System32\drivers\etc]> cd ~/pr/pow/src [~\projects\PowerShell\src]> cd .sdk [~\projects\PowerShell\src\Microsoft.PowerShell.SDK]> _ ``` `AUTO_CD` works the same way if enabled. ```sh [~]> /w/s/d/et [C:\Windows\System32\drivers\etc]> ~/pr/pow/src [~\projects\PowerShell\src]> .sdk [~\projects\PowerShell\src\Microsoft.PowerShell.SDK]> _ ``` ## Additional helpers - Get-Stack - view contents of undo (`cd-`) and redo (`cd+`) stacks; limit output with the `-Undo` or `-Redo` switches - Get-Up - get the path of an ancestor directory, either by name or by traversing upwards `n` levels - Expand-Path - expand a candidate path by inserting wildcards between each segment - Set-CdExtrasOption - [configure](#configure) cd-extras ## Note on compatibility ### Alternative providers _cd-extras_ is primarily intended to work against the filesystem provider. Most things should work with other providers too though. ```sh [~]> cd hklm:\ [HKLM:]> cd so/mic/win/cur/windowsupdate [HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate]> .. [HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion]> cd- [HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate]> cd- 2 [~]> _ ``` ### OS X & Linux Functionality is tested and should work on non-Windows operating systems. It's entirely possible you'll encounter some rough edges, though. In particular you'll notice that _cd-extras_ is quite permissive with respect to the casing of paths; this means path shortening won't work in cases where multiple possible path abbreviations differ only by case. # Get started ## Install ```sh Install-Module cd-extras Import-Module cd-extras # add to profile. e.g: Add-Content $PROFILE @("`n", "Import-Module cd-extras") ``` ## Configure ### _cd-extras_ options - _AUTO_CD_: `[bool] = $true` - Any truthy value enables auto_cd. - _CD_PATH_: `[array] = @()` - Paths to be searched by `cd` and tab expansion. Note: this is an array, not a delimited string. - _CDABLE_VARS_: `[bool] = $false` - `cd` and tab-expand into directory paths stored in variables without prefixing the variable name with `$`. - _NOARG_CD_: `[string] = '~'` - If specified, `cd` command with no arguments will change to this directory. - _MenuCompletion_: `[bool] = $true` (if PSReadLine available) - If truthy, indexes are offered as completions for `up`, `cd+` and `cd-` with full paths displayed in the menu - _DirCompletions_: `[array] = @('Push-Location', 'Set-Location', 'Get-ChildItem')` - Commands that participate in enhanced tab expansion for directories. - _FileCompletions_: `[array] = @()` - Commands that participate in enhanced tab expansion for files. - _PathCompletions_: `[array] = @()` - Commands that participate in enhanced tab expansion for any type of path (files & directories). Either create a hashtable, `cde`, with one or more of these keys _before_ importing the `cd-extras` module: ```sh $global:cde = @{ AUTO_CD = $false CD_PATH = @('~\Documents\', '~\Downloads') } Import-Module cd-extras ``` or call the `Set-CdExtrasOption` function after importing the module: ```sh Import-Module cd-extras Set-CdExtrasOption AUTO_CD $false Set-CdExtrasOption NOARG_CD '/' ``` Note: if you want to opt out of the default `DirCompletions` then you should do it before _cd-extras_ is loaded since PowerShell doesn't provide any way of unregistering argument completers. ### Using a different alias _cd-extras_ aliases `cd` to its proxy command, `Set-LocationEx`, by default. If you want to use a different alias then you'll probably want to restore the default `cd` alias at the same time. ```sh [~]> set-alias cd set-location -Option AllScope [~]> set-alias cde set-locationex [~]> cde /w/s/d/et [C:\Windows\System32\drivers\etc]> cd- # note: still cd-, not cde- [~]> _ ``` `cd-extras` will only remember locations visited via `Set-LocationEx` or its alias. |