completions/ls.ps1

<#
 # ls completion
 #>

Import-Module NativeCommandCompleter.psm -ErrorAction SilentlyContinue

$msg = data { ConvertFrom-StringData @'
    ls = list directory contents
    gnu_all = Show hidden
    gnu_almosAll = Show hidden except '.' and '..'
    gnu_author = Print author
    gnu_escape = Octal escapes for non-graphic characters
    gnu_blockSize = Set block size
    gnu_ignoreBackups = Ignore files ending with '~'
    gnu_short_ctime = Sort by changed time, (-l) show ctime
    gnu_forceMultiColumn = Force multi-column output
    gnu_color = Use colors
    gnu_directory = List directories, not their content
    gnu_dired = Generate dired output
    gnu_unsortOutput = Unsorted output, enables -a
    gnu_short_classify = Append filetype indicator (*/=>@|)
    gnu_classify = Append filetype indicator (*/=>@|)
    gnu_fileType = Append filetype indicator
    gnu_format = List format
    gnu_fullTime = Long format, full-iso time
    gnu_showGroup = Show group instead of owner in long format
    gnu_groupDirectoriesFirst = Group directories before files
    gnu_noGroup = Don't print group information
    gnu_humanReadable = Human readable sizes
    gnu_si = Human readable sizes, powers of 1000
    gnu_dereferenceCommandLine = Follow symlinks
    gnu_dereferenceCommandLineSymlinkToDir = Follow directory symlinks from command line
    gnu_hide = Do not list implied entries matching specified shell pattern
    gnu_hyperlink = Hyperlink file names
    gnu_indicatorStyle = Append filetype indicator
    gnu_indicatorStyleSlash = Append '/' indicator to directory
    gnu_inode = Print inode number of files
    gnu_ignore = Skip entries matching pattern
    gnu_kibibytes = Set blocksize to 1kB
    gnu_longListFormat = Long listing format
    gnu_dereference = Follow symlinks
    gnu_commaSeparatedFormat = Comma-separated format, fills across screen
    gnu_numericUidGid = Long format, numeric UIDs and GIDs
    gnu_literal = Print raw entry names
    gnu_hideControlChars = Replace non-graphic characters with '?'
    gnu_showControlChars = Non-graphic characters printed as-is
    gnu_quoteName = Enclose entry in quotes
    gnu_quotingStyle = Select quoting style
    gnu_reverse = Reverse sort order
    gnu_recursive = List subdirectory recursively
    gnu_size = Print size of files
    gnu_sortBySize = Sort by size
    gnu_sort = Sort criteria
    gnu_sort_none = Don't sort. Same as (-U)
    gnu_sort_size = Sort by size. Same as (-S)
    gnu_sort_time = Sort by modification time. Same as (-t)
    gnu_sort_version = Sort by version. Same as (-v)
    gnu_sort_extension = Sort by file extension. Same as (-X)
    gnu_sort_width = Sort by file width
    gnu_time = Timestamp used to display or sort
    gnu_time_accessTime = Access time
    gnu_time_changeTime = Metadata change time
    gnu_time_modifiedTime = Modified time (default)
    gnu_time_birthTime = Birth time
    gnu_timeStyle = Select time style
    gnu_sortByTime = Sort by modified time, most recent first
    gnu_tabsize = Assume tab stops at each COLS
    gnu_dontSort = Do not sort
    gnu_sortByVersion = Sort by version
    gnu_width = Assume screen width
    gnu_multiColumnOutput = Multi-column output, horizontally listed
    gnu_sortByExtension = Sort by extension
    gnu_context = Display security context so it fits on most displays
    gnu_zero = Output line with NUL, not newline
    gnu_listPerLine = List one entry per line
    gnu_help = Display help and exit
    gnu_version = Display version and exit
'@
 }
Import-LocalizedData -BindingVariable localizedMessages -ErrorAction SilentlyContinue;
foreach ($key in $localizedMessages.Keys) { $msg[$key] = $localizedMessages[$key] }

# check whether GNU ls
ls --version 2>&1 | Out-Null
if ($LASTEXITCODE -eq 0) # GNU ls
{
    $when_arguments = "always", "auto", "never"
    $format_arguments = "across","commas","horizontal","long","single-column","verbose","vertical"
    $indicator_style_arguments = "none", "slash", "file-type", "classify"

    Register-NativeCompleter -Name ls -Description $msg.ls -Parameters @(
        New-ParamCompleter -ShortName a -LongName all -Description $msg.gnu_all
        New-ParamCompleter -ShortName A -LongName almost-all -Description $msg.gnu_almosAll
        New-ParamCompleter -LongName author -Description $msg.gnu_author
        New-ParamCompleter -ShortName b -LongName escape -Description $msg.gnu_escape
        New-ParamCompleter -LongName block-size -Description $msg.gnu_blockSize -Type Required -VariableName 'SIZE'
        New-ParamCompleter -ShortName B -LongName ignore-backups -Description $msg.gnu_ignoreBackups
        New-ParamCompleter -ShortName c -Description $msg.gnu_short_ctime
        New-ParamCompleter -ShortName C -Description $msg.gnu_forceMultiColumn
        New-ParamCompleter -LongName color -Description $msg.gnu_color -Type FlagOrValue -Arguments $when_arguments -VariableName 'WHEN'
        New-ParamCompleter -ShortName d -LongName directory -Description $msg.gnu_directory
        New-ParamCompleter -ShortName D -LongName dired -Description $msg.gnu_dired
        New-ParamCompleter -ShortName f -Description $msg.gnu_unsortOutput
        New-ParamCompleter -ShortName F -Description $msg.gnu_short_classify
        New-ParamCompleter -LongName classify -Description $msg.gnu_classify -Type FlagOrValue -Arguments $when_arguments -VariableName 'WHEN'
        New-ParamCompleter -LongName file-type -Description $msg.gnu_fileType
        New-ParamCompleter -LongName format -Description $msg.gnu_format -Arguments $format_arguments -VariableName 'WORD'
        New-ParamCompleter -LongName full-time -Description $msg.gnu_fullTime
        New-ParamCompleter -ShortName g -Description $msg.gnu_showGroup
        New-ParamCompleter -LongName group-directories-first -Description $msg.gnu_groupDirectoriesFirst
        New-ParamCompleter -ShortName G -LongName no-group -Description $msg.gnu_noGroup
        New-ParamCompleter -ShortName h -LongName human-readable -Description $msg.gnu_humanReadable
        New-ParamCompleter -LongName si -Description $msg.gnu_si
        New-ParamCompleter -ShortName H -LongName dereference-command-line -Description $msg.gnu_dereferenceCommandLine
        New-ParamCompleter -LongName dereference-command-line-symlink-to-dir -Description $msg.gnu_dereferenceCommandLineSymlinkToDir
        New-ParamCompleter -LongName hide -Description $msg.gnu_hide -Type Required -VariableName 'PATTERN'
        New-ParamCompleter -LongName hyperlink -Description $msg.gnu_hyperlink -Arguments $when_arguments -VariableName 'WHEN'
        New-ParamCompleter -LongName indicator-style -Description $msg.gnu_indicatorStyle -Arguments $indicator_style_arguments -VariableName 'WORD'
        New-ParamCompleter -ShortName i -LongName inode -Description $msg.gnu_inode
        New-ParamCompleter -ShortName I -LongName ignore -Description $msg.gnu_ignore -Type Required -VariableName 'PATTERN'
        New-ParamCompleter -ShortName k -LongName kibibytes -Description $msg.gnu_kibibytes
        New-ParamCompleter -ShortName l -Description $msg.gnu_longListFormat
        New-ParamCompleter -ShortName L -LongName dereference -Description $msg.gnu_dereference
        New-ParamCompleter -ShortName m -Description $msg.gnu_commaSeparatedFormat
        New-ParamCompleter -ShortName n -LongName numeric-uid-gid -Description $msg.gnu_numericUidGid
        New-ParamCompleter -ShortName N -LongName literal -Description $msg.gnu_literal
        New-ParamCompleter -ShortName p -Description $msg.gnu_indicatorStyleSlash
        New-ParamCompleter -ShortName q -LongName hide-control-chars -Description $msg.gnu_hideControlChars
        New-ParamCompleter -LongName show-control-chars -Description $msg.gnu_showControlChars
        New-ParamCompleter -ShortName Q -LongName quote-name -Description $msg.gnu_quoteName
        New-ParamCompleter -LongName quoting-style -Description $msg.gnu_quotingStyle -Arguments "literal","locale","shell","shell-always","c","escape" -VariableName 'WORD'
        New-ParamCompleter -ShortName r -LongName reverse -Description $msg.gnu_reverse
        New-ParamCompleter -ShortName R -LongName recursive -Description $msg.gnu_recursive
        New-ParamCompleter -ShortName s -LongName size -Description $msg.gnu_size
        New-ParamCompleter -ShortName S -Description $msg.gnu_sortBySize
        New-ParamCompleter -LongName sort -Description $msg.gnu_sort -Arguments @(
            "none `t{0}" -f $msg.gnu_sort_none
            "size `t{0}" -f $msg.gnu_sort_size
            "time `t{0}" -f $msg.gnu_sort_time
            "version `t{0}" -f $msg.gnu_sort_version
            "extension `t{0}" -f $msg.gnu_sort_extension
            "width `t{0}" -f $msg.gnu_sort_width
        ) -VariableName 'WORD'
        New-ParamCompleter -LongName time -Description $msg.gnu_time -Arguments @(
            "atime `t{0}" -f $msg.gnu_time_accessTime
            "access `t{0}" -f $msg.gnu_time_accessTime
            "use `t{0}" -f $msg.gnu_time_accessTime
            "ctime `t{0}" -f $msg.gnu_time_changeTime
            "status `t{0}" -f $msg.gnu_time_changeTime
            "mtime `t{0}" -f $msg.gnu_time_modifiedTime
            "modification `t{0}" -f $msg.gnu_time_modifiedTime
            "birth `t{0}" -f $msg.gnu_time_birthTime
            "creation `t{0}" -f $msg.gnu_time_birthTime
        ) -VariableName 'WORD'
        New-ParamCompleter -LongName time-style -Description $msg.gnu_timeStyle -Type Required -Arguments "full-iso","long-iso","iso","locale" -VariableName 'TIME_STYLE'
        New-ParamCompleter -ShortName t -Description $msg.gnu_sortByTime
        New-ParamCompleter -ShortName T -LongName tabsize -Description $msg.gnu_tabsize -Type Required -VariableName 'COLS'
        New-ParamCompleter -ShortName U -Description $msg.gnu_dontSort
        New-ParamCompleter -ShortName v -Description $msg.gnu_sortByVersion
        New-ParamCompleter -ShortName w -LongName width -Description $msg.gnu_width -Type Required -VariableName 'COLS'
        New-ParamCompleter -ShortName x -Description $msg.gnu_multiColumnOutput
        New-ParamCompleter -ShortName X -Description $msg.gnu_sortByExtension
        New-ParamCompleter -ShortName Z -LongName context -Description $msg.gnu_context
        New-ParamCompleter -LongName zero -Description $msg.gnu_zero
        New-ParamCompleter -ShortName 1 -Description $msg.gnu_listPerLine
        New-ParamCompleter -LongName help -Description $msg.gnu_help
        New-ParamCompleter -LongName version -Description $msg.gnu_version
    )
}
else
{
    Register-NativeCompleter -Name ls -Description 'list directory contents' -Parameters @(
        # TBD
    )
}