_eza.ps1 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. using namespace System.Management.Automation
  2. using namespace System.Management.Automation.Language
  3. Register-ArgumentCompleter -Native -CommandName 'eza' -ScriptBlock {
  4. param($wordToComplete, $commandAst, $cursorPosition)
  5. $ArrayWhen = @('always', 'auto', 'never')
  6. $ArraySort = @('name', 'extension', 'size', 'type', 'created', 'modified', 'accessed', 'changed', 'inode', 'none')
  7. $ArrayColorScaleMode = @('fixed', 'gradient')
  8. $ArrayColorScale = @('all', 'age', 'size')
  9. $ArrayAbsolute = @('on', 'follow', 'off')
  10. $ArrayTime = @('modified', 'accessed', 'created')
  11. $ArrayTimeStyle = @('default', 'iso', 'long-iso', 'full-iso', 'relative', '+%Y-%m-%d %H:%M', '+%Y.%m.%d %H:$M:$s')
  12. $commandElements = $commandAst.CommandElements
  13. $command = @(
  14. 'eza'
  15. for ($i = 1; $i -lt $commandElements.Count; $i++) {
  16. $element = $commandElements[$i]
  17. if ($element -isnot [StringConstantExpressionAst] -or
  18. $element.StringConstantType -ne [StringConstantType]::BareWord -or
  19. $element.Value -eq $wordToComplete) {
  20. break
  21. }
  22. $element.Value
  23. }) -join ';'
  24. $completions = @(switch -Wildcard ($command) {
  25. '*;--help' {
  26. break
  27. }
  28. '*;--version' {
  29. break
  30. }
  31. '*;--absolute' {
  32. $ArrayAbsolute |
  33. ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", $_)}
  34. break
  35. }
  36. '*;--sort' {
  37. $ArraySort |
  38. ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", $_)}
  39. break
  40. }
  41. '*;--color-scale' {
  42. $ArrayColorScale |
  43. ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", $_)}
  44. break
  45. }
  46. '*;--color-scale-mode' {
  47. $ArrayColorScaleMode |
  48. ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", $_)}
  49. break
  50. }
  51. '*--long;*--time-style' {
  52. $ArrayTimeStyle |
  53. ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", $_)}
  54. break
  55. }
  56. '*--long;*--time' {
  57. $ArrayTime |
  58. ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", $_)}
  59. break
  60. }
  61. '*;--classify' {
  62. $ArrayWhen |
  63. ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", $_)}
  64. break
  65. }
  66. '*;--color' {
  67. $ArrayWhen |
  68. ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", $_)}
  69. break
  70. }
  71. '*;--icons' {
  72. $ArrayWhen |
  73. ForEach-Object {[System.Management.Automation.CompletionResult]::new($_, $_, "ParameterValue", $_)}
  74. break
  75. }
  76. '*;--all' {
  77. [CompletionResult]::new('--show-symlinks' ,'listfilessyl' , [CompletionResultType]::ParameterName, 'explicitly show symbolic links (for use with --only-dirs | --only-files)')
  78. [CompletionResult]::new('--no-symlinks' ,'listfilessyl' , [CompletionResultType]::ParameterName, 'do not show symbolic links')
  79. break
  80. }
  81. '*long*' {
  82. # [CompletionResult]::new('-b' ,'binary' , [CompletionResultType]::ParameterName, 'list file sizes with binary prefixes')
  83. [CompletionResult]::new('--binary' ,'binary' , [CompletionResultType]::ParameterName, 'list file sizes with binary prefixes')
  84. # [CompletionResult]::new('-B' ,'bytes' , [CompletionResultType]::ParameterName, 'list file sizes in bytes, without any prefixes')
  85. [CompletionResult]::new('--bytes' ,'bytes' , [CompletionResultType]::ParameterName, 'list file sizes in bytes, without any prefixes')
  86. # [CompletionResult]::new('-g' ,'group' , [CompletionResultType]::ParameterName, 'list each file''s group')
  87. [CompletionResult]::new('--smart-group' ,'smart-group' , [CompletionResultType]::ParameterName, 'only show group if it has a different name from owner')
  88. [CompletionResult]::new('--group' ,'group' , [CompletionResultType]::ParameterName, 'list each file''s group')
  89. # [CompletionResult]::new('-h' ,'header' , [CompletionResultType]::ParameterName, 'add a header row to each column')
  90. [CompletionResult]::new('--header' ,'header' , [CompletionResultType]::ParameterName, 'add a header row to each column')
  91. # [CompletionResult]::new('-H' ,'links' , [CompletionResultType]::ParameterName, 'list each file''s number of hard links')
  92. [CompletionResult]::new('--links' ,'links' , [CompletionResultType]::ParameterName, 'list each file''s number of hard links')
  93. # [CompletionResult]::new('-i' ,'inode' , [CompletionResultType]::ParameterName, 'list each file''s inode number')
  94. [CompletionResult]::new('--inode' ,'inode' , [CompletionResultType]::ParameterName, 'list each file''s inode number')
  95. # [CompletionResult]::new('-M' ,'mounts' , [CompletionResultType]::ParameterName, 'show mount details (Linux and Mac only)')
  96. # [CompletionResult]::new('--mounts' ,'mounts' , [CompletionResultType]::ParameterName, 'show mount details (Linux and Mac only)')
  97. # [CompletionResult]::new('-n' ,'numeric' , [CompletionResultType]::ParameterName, 'list numeric user and group IDs')
  98. [CompletionResult]::new('--numeric' ,'numeric' , [CompletionResultType]::ParameterName, 'list numeric user and group IDs')
  99. # [CompletionResult]::new('-O' ,'flags' , [CompletionResultType]::ParameterName, 'list file flags (Mac, BSD, and Windows only)')
  100. [CompletionResult]::new('--flags' ,'flags' , [CompletionResultType]::ParameterName, 'list file flags (Mac, BSD, and Windows only)')
  101. # [CompletionResult]::new('-S' ,'blocksize' , [CompletionResultType]::ParameterName, 'show size of allocated file system blocks')
  102. [CompletionResult]::new('--blocksize' ,'blocksize' , [CompletionResultType]::ParameterName, 'show size of allocated file system blocks')
  103. # [CompletionResult]::new('-t' ,'time' , [CompletionResultType]::ParameterName, 'which timestamp field to list (modified, accessed, created)')
  104. [CompletionResult]::new('--time' ,'time' , [CompletionResultType]::ParameterName, 'which timestamp field to list (modified, accessed, created)')
  105. # [CompletionResult]::new('-m' ,'modified' , [CompletionResultType]::ParameterName, 'use the modified timestamp field')
  106. [CompletionResult]::new('--modified' ,'modified' , [CompletionResultType]::ParameterName, 'use the modified timestamp field')
  107. # [CompletionResult]::new('-u' ,'accessed' , [CompletionResultType]::ParameterName, 'use the accessed timestamp field')
  108. [CompletionResult]::new('--accessed' ,'accessed' , [CompletionResultType]::ParameterName, 'use the accessed timestamp field')
  109. # [CompletionResult]::new('-U' ,'created' , [CompletionResultType]::ParameterName, 'use the created timestamp field')
  110. [CompletionResult]::new('--changed' ,'changed' , [CompletionResultType]::ParameterName, 'use the changed timestamp field')
  111. [CompletionResult]::new('--created' ,'created' , [CompletionResultType]::ParameterName, 'use the created timestamp field')
  112. [CompletionResult]::new('--time-style' ,'time-style' , [CompletionResultType]::ParameterName, 'how to format timestamps (default, iso, long-iso,full-iso, relative, or a custom style ''+<FORMAT>'' like ''+%Y-%m-%d %H:%M'')')
  113. # [CompletionResult]::new('--total-size' ,'total-size' , [CompletionResultType]::ParameterName, 'show the size of a directory as the size of all files and directories inside (unix only)')
  114. # [CompletionResult]::new('-o' ,'octal-permissions' , [CompletionResultType]::ParameterName, 'list each file''s permission in octal format')
  115. [CompletionResult]::new('--no-permissions' ,'no-permissions' , [CompletionResultType]::ParameterName, 'suppress the permissions field')
  116. [CompletionResult]::new('--octal-permissions' ,'octal-permissions' , [CompletionResultType]::ParameterName, 'list each file''s permission in octal format')
  117. [CompletionResult]::new('--no-filesize' ,'no-filesize' , [CompletionResultType]::ParameterName, 'suppress the filesize field')
  118. [CompletionResult]::new('--no-user' ,'no-user' , [CompletionResultType]::ParameterName, 'suppress the user field')
  119. [CompletionResult]::new('--no-time' ,'no-time' , [CompletionResultType]::ParameterName, 'suppress the time field')
  120. [CompletionResult]::new('--stdin' ,'stdin' , [CompletionResultType]::ParameterName, 'read file names from stdin, one per line or other separator specified in environment')
  121. [CompletionResult]::new('--git' ,'git' , [CompletionResultType]::ParameterName, 'list each file''s Git status, if tracked or ignored')
  122. [CompletionResult]::new('--no-git' ,'no-git' , [CompletionResultType]::ParameterName, 'suppress Git status (always overrides -git, --git-repos, --git-repos-no-status)')
  123. [CompletionResult]::new('--git-repos' ,'git-repos' , [CompletionResultType]::ParameterName, 'list root of git-tree status')
  124. [CompletionResult]::new('--git-repos-no-status' ,'git-repos-no-status' , [CompletionResultType]::ParameterName, 'list each git-repos branch name (much faster)')
  125. break
  126. }
  127. default {
  128. # [CompletionResult]::new('-?' ,'help' , [CompletionResultType]::ParameterName, 'show list of command-line options')
  129. [CompletionResult]::new('--help' ,'help' , [CompletionResultType]::ParameterName, 'show list of command-line options')
  130. # [CompletionResult]::new('-v' ,'version' , [CompletionResultType]::ParameterName, 'show version of eza')
  131. [CompletionResult]::new('--version' ,'version' , [CompletionResultType]::ParameterName, 'show version of eza')
  132. # [CompletionResult]::new('-1' ,'oneline' , [CompletionResultType]::ParameterName, 'display one entry per line')
  133. [CompletionResult]::new('--oneline' ,'oneline' , [CompletionResultType]::ParameterName, 'display one entry per line')
  134. # [CompletionResult]::new('-l' ,'long' , [CompletionResultType]::ParameterName, 'display extended file metadata as a table')
  135. [CompletionResult]::new('--long' ,'long' , [CompletionResultType]::ParameterName, 'display extended file metadata as a table')
  136. # [CompletionResult]::new('-G' ,'grid' , [CompletionResultType]::ParameterName, 'display entries as a grid (default)')
  137. [CompletionResult]::new('--grid' ,'grid' , [CompletionResultType]::ParameterName, 'display entries as a grid (default)')
  138. # [CompletionResult]::new('-x' ,'across' , [CompletionResultType]::ParameterName, 'sort the grid across, rather than downwards')
  139. [CompletionResult]::new('--across' ,'across' , [CompletionResultType]::ParameterName, 'sort the grid across, rather than downwards')
  140. # [CompletionResult]::new('-R' ,'recurse' , [CompletionResultType]::ParameterName, 'recurse into directories')
  141. [CompletionResult]::new('--recurse' ,'recurse' , [CompletionResultType]::ParameterName, 'recurse into directories')
  142. # [CompletionResult]::new('-T' ,'tree' , [CompletionResultType]::ParameterName, 'recurse into directories as a tree')
  143. [CompletionResult]::new('--tree' ,'tree' , [CompletionResultType]::ParameterName, 'recurse into directories as a tree')
  144. # [CompletionResult]::new('-X' ,'dereference' , [CompletionResultType]::ParameterName, 'dereference symbolic links when displaying information')
  145. [CompletionResult]::new('--dereference' ,'dereference' , [CompletionResultType]::ParameterName, 'dereference symbolic links when displaying information')
  146. # [CompletionResult]::new('-F' ,'classify' , [CompletionResultType]::ParameterName, 'display type indicator by file names (always, auto, never)')
  147. [CompletionResult]::new('--classify' ,'classify' , [CompletionResultType]::ParameterName, 'display type indicator by file names (always, auto, never)')
  148. [CompletionResult]::new('--color' ,'color' , [CompletionResultType]::ParameterName, 'when to use terminal colours (always, auto, never)')
  149. # [CompletionResult]::new('--colour' ,'color' , [CompletionResultType]::ParameterName, 'when to use terminal colours (always, auto, never)')
  150. [CompletionResult]::new('--color-scale' ,'colorscale' , [CompletionResultType]::ParameterName, 'highlight levels of ''field'' distinctly(all, age, size)')
  151. # [CompletionResult]::new('--colour-scale' ,'colorscale' , [CompletionResultType]::ParameterName, 'highlight levels of ''field'' distinctly(all, age, size)')
  152. [CompletionResult]::new('--color-scale-mode' ,'colorscalemode' , [CompletionResultType]::ParameterName, 'use gradient or fixed colors in --color-scale (fixed, gradient)')
  153. # [CompletionResult]::new('--colour-scale-mode' ,'colorscalemode' , [CompletionResultType]::ParameterName, 'use gradient or fixed colors in --color-scale (fixed, gradient)')
  154. [CompletionResult]::new('--icons' ,'icons' , [CompletionResultType]::ParameterName, 'when to display icons (always, auto, never)')
  155. [CompletionResult]::new('--no-quotes' ,'noquotes' , [CompletionResultType]::ParameterName, 'don''t quote file names with spaces')
  156. [CompletionResult]::new('--hyperlink' ,'hyperlink' , [CompletionResultType]::ParameterName, 'display entries as hyperlinks')
  157. [CompletionResult]::new('--absolute' ,'absolute' , [CompletionResultType]::ParameterName, 'display entries with their absolute path (on, follow, off)')
  158. [CompletionResult]::new('--follow-symlinks' ,'followsymlinks' , [CompletionResultType]::ParameterName, 'drill down into symbolic links that point to directories')
  159. # [CompletionResult]::new('-w' ,'widths' , [CompletionResultType]::ParameterName, 'set screen width in columns')
  160. [CompletionResult]::new('--width' ,'widths' , [CompletionResultType]::ParameterName, 'set screen width in columns')
  161. # [CompletionResult]::new('-a' ,'filter' , [CompletionResultType]::ParameterName, 'show hidden and ''dot'' files. Use this twice to also show the ''.'' and ''..'' directories')
  162. [CompletionResult]::new('--all' ,'filter' , [CompletionResultType]::ParameterName, 'show hidden and ''dot'' files. Use this twice to also show the ''.'' and ''..'' directories')
  163. # [CompletionResult]::new('-A' ,'filter' , [CompletionResultType]::ParameterName, 'equivalent to --all; included for compatibility with `ls -A`')
  164. # [CompletionResult]::new('--almost-all' ,'filter' , [CompletionResultType]::ParameterName, 'equivalent to --all; included for compatibility with `ls -A`')
  165. # [CompletionResult]::new('-d' ,'filter' , [CompletionResultType]::ParameterName, 'list directories as files; don''t list their contents')
  166. [CompletionResult]::new('--treat-dirs-as-files' ,'filter' , [CompletionResultType]::ParameterName, 'list directories as files; don''t list their contents')
  167. # [CompletionResult]::new('-D' ,'filter' , [CompletionResultType]::ParameterName, 'list only directories')
  168. [CompletionResult]::new('--only-dirs' ,'filter' , [CompletionResultType]::ParameterName, 'list only directories')
  169. # [CompletionResult]::new('-f' ,'filter' , [CompletionResultType]::ParameterName, 'list only files')
  170. [CompletionResult]::new('--only-files' ,'filter' , [CompletionResultType]::ParameterName, 'list only files')
  171. # [CompletionResult]::new('-L' ,'level' , [CompletionResultType]::ParameterName, 'limit the depth of recursion')
  172. [CompletionResult]::new('--level' ,'level' , [CompletionResultType]::ParameterName, 'limit the depth of recursion')
  173. # [CompletionResult]::new('-r' ,'reverse' , [CompletionResultType]::ParameterName, 'reverse the sort order')
  174. [CompletionResult]::new('--reverse' ,'reverse' , [CompletionResultType]::ParameterName, 'reverse the sort order')
  175. # [CompletionResult]::new('-s' ,'sort' , [CompletionResultType]::ParameterName, 'which field to sort by SORT_FIELD')
  176. [CompletionResult]::new('--sort' ,'sort' , [CompletionResultType]::ParameterName, 'which field to sort by SORT_FIELD')
  177. [CompletionResult]::new('--group-directories-first' ,'gdf' , [CompletionResultType]::ParameterName, 'list directories before other files')
  178. [CompletionResult]::new('--group-directories-last' ,'gdl' , [CompletionResultType]::ParameterName, 'list directories after other files')
  179. # [CompletionResult]::new('-I' ,'ignore-glob' , [CompletionResultType]::ParameterName, 'glob patterns (pipe-separated) of files to ignore GLOBS')
  180. [CompletionResult]::new('--ignore-glob' ,'ignore-glob' , [CompletionResultType]::ParameterName, 'glob patterns (pipe-separated) of files to ignore GLOBS')
  181. [CompletionResult]::new('--git-ignore' ,'git-ignore' , [CompletionResultType]::ParameterName, 'ignore files mentioned in ''.gitignore''')
  182. break
  183. }
  184. })
  185. $completions.Where{ $_.CompletionText -like "$wordToComplete*" } |
  186. Sort-Object -Property completionText
  187. }