Last active
July 10, 2017 09:02
-
-
Save Bak-Jin-Hyeong/056a397763fcf584d9ca346e099313a9 to your computer and use it in GitHub Desktop.
ripgrep (https://github.com/BurntSushi/ripgrep) tab completion in powershell
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| function Get-AliasPattern($exe) { | |
| $aliases = @($exe) + @(Get-Alias | Where-Object { $_.Definition -eq $exe } | Select-Object -Exp Name) | |
| "($($aliases -join '|'))" | |
| } | |
| $options = @( | |
| @(@('-A', '--after-context'), @('<NUM>')), | |
| @(@('-B', '--before-context'), @('<NUM>')), | |
| @(@('-S', '--case-sensitive'), @()), | |
| @(@('', '--color'), @('never', 'auto', 'always', 'ansi')), | |
| @(@('', '--colors'), @('{type}:{attribute}:{value}')), | |
| @(@('', '--column'), @()), | |
| @(@('-C', '--context'), @('<NUM>')), | |
| @(@('', '--context-separator'), @('<SEPARATOR>')), | |
| @(@('-c', '--count'), @()), | |
| @(@('', '--debug'), @()), | |
| @(@('', '--dfa-size-limit'), @('<NUM+SUFFIX?>')), | |
| @(@('-E', '--encoding'), @( | |
| 'auto', | |
| 'unicode-1-1-utf-8', | |
| 'utf-8', | |
| '866', | |
| 'cp866', | |
| 'csibm866', | |
| 'ibm866', | |
| 'csisolatin2', | |
| 'iso-8859-2', | |
| 'iso-ir-101', | |
| 'iso8859-2', | |
| 'iso88592', | |
| 'iso_8859-2', | |
| 'iso_8859-2:1987', | |
| 'l2', | |
| 'latin2', | |
| 'csisolatin3', | |
| 'iso-8859-3', | |
| 'iso-ir-109', | |
| 'iso8859-3', | |
| 'iso88593', | |
| 'iso_8859-3', | |
| 'iso_8859-3:1988', | |
| 'l3', | |
| 'latin3', | |
| 'csisolatin4', | |
| 'iso-8859-4', | |
| 'iso-ir-110', | |
| 'iso8859-4', | |
| 'iso88594', | |
| 'iso_8859-4', | |
| 'iso_8859-4:1988', | |
| 'l4', | |
| 'latin4', | |
| 'csisolatincyrillic', | |
| 'cyrillic', | |
| 'iso-8859-5', | |
| 'iso-ir-144', | |
| 'iso8859-5', | |
| 'iso88595', | |
| 'iso_8859-5', | |
| 'iso_8859-5:1988', | |
| 'arabic', | |
| 'asmo-708', | |
| 'csiso88596e', | |
| 'csiso88596i', | |
| 'csisolatinarabic', | |
| 'ecma-114', | |
| 'iso-8859-6', | |
| 'iso-8859-6-e', | |
| 'iso-8859-6-i', | |
| 'iso-ir-127', | |
| 'iso8859-6', | |
| 'iso88596', | |
| 'iso_8859-6', | |
| 'iso_8859-6:1987', | |
| 'csisolatingreek', | |
| 'ecma-118', | |
| 'elot_928', | |
| 'greek', | |
| 'greek8', | |
| 'iso-8859-7', | |
| 'iso-ir-126', | |
| 'iso8859-7', | |
| 'iso88597', | |
| 'iso_8859-7', | |
| 'iso_8859-7:1987', | |
| 'sun_eu_greek', | |
| 'csiso88598e', | |
| 'csisolatinhebrew', | |
| 'hebrew', | |
| 'iso-8859-8', | |
| 'iso-8859-8-e', | |
| 'iso-ir-138', | |
| 'iso8859-8', | |
| 'iso88598', | |
| 'iso_8859-8', | |
| 'iso_8859-8:1988', | |
| 'visual', | |
| 'csiso88598i', | |
| 'iso-8859-8-i', | |
| 'logical', | |
| 'csisolatin6', | |
| 'iso-8859-10', | |
| 'iso-ir-157', | |
| 'iso8859-10', | |
| 'iso885910', | |
| 'l6', | |
| 'latin6', | |
| 'iso-8859-13', | |
| 'iso8859-13', | |
| 'iso885913', | |
| 'iso-8859-14', | |
| 'iso8859-14', | |
| 'iso885914', | |
| 'csisolatin9', | |
| 'iso-8859-15', | |
| 'iso8859-15', | |
| 'iso885915', | |
| 'iso_8859-15', | |
| 'l9', | |
| 'iso-8859-16', | |
| 'cskoi8r', | |
| 'koi', | |
| 'koi8', | |
| 'koi8-r', | |
| 'koi8_r', | |
| 'koi8-ru', | |
| 'koi8-u', | |
| 'csmacintosh', | |
| 'mac', | |
| 'macintosh', | |
| 'x-mac-roman', | |
| 'dos-874', | |
| 'iso-8859-11', | |
| 'iso8859-11', | |
| 'iso885911', | |
| 'tis-620', | |
| 'windows-874', | |
| 'cp1250', | |
| 'windows-1250', | |
| 'x-cp1250', | |
| 'cp1251', | |
| 'windows-1251', | |
| 'x-cp1251', | |
| 'ansi_x3.4-1968', | |
| 'ascii', | |
| 'cp1252', | |
| 'cp819', | |
| 'csisolatin1', | |
| 'ibm819', | |
| 'iso-8859-1', | |
| 'iso-ir-100', | |
| 'iso8859-1', | |
| 'iso88591', | |
| 'iso_8859-1', | |
| 'iso_8859-1:1987', | |
| 'l1', | |
| 'latin1', | |
| 'us-ascii', | |
| 'windows-1252', | |
| 'x-cp1252', | |
| 'cp1253', | |
| 'windows-1253', | |
| 'x-cp1253', | |
| 'cp1254', | |
| 'csisolatin5', | |
| 'iso-8859-9', | |
| 'iso-ir-148', | |
| 'iso8859-9', | |
| 'iso88599', | |
| 'iso_8859-9', | |
| 'iso_8859-9:1989', | |
| 'l5', | |
| 'latin5', | |
| 'windows-1254', | |
| 'x-cp1254', | |
| 'cp1255', | |
| 'windows-1255', | |
| 'x-cp1255', | |
| 'cp1256', | |
| 'windows-1256', | |
| 'x-cp1256', | |
| 'cp1257', | |
| 'windows-1257', | |
| 'x-cp1257', | |
| 'cp1258', | |
| 'windows-1258', | |
| 'x-cp1258', | |
| 'x-mac-cyrillic', | |
| 'x-mac-ukrainian', | |
| 'chinese', | |
| 'csgb2312', | |
| 'csiso58gb231280', | |
| 'gb2312', | |
| 'gb_2312', | |
| 'gb_2312-80', | |
| 'gbk', | |
| 'iso-ir-58', | |
| 'x-gbk', | |
| 'gb18030', | |
| 'big5', | |
| 'big5-hkscs', | |
| 'cn-big5', | |
| 'csbig5', | |
| 'x-x-big5', | |
| 'cseucpkdfmtjapanese', | |
| 'euc-jp', | |
| 'x-euc-jp', | |
| 'csiso2022jp', | |
| 'iso-2022-jp', | |
| 'csshiftjis', | |
| 'ms932', | |
| 'ms_kanji', | |
| 'shift-jis', | |
| 'shift_jis', | |
| 'sjis', | |
| 'windows-31j', | |
| 'x-sjis', | |
| 'cseuckr', | |
| 'csksc56011987', | |
| 'euc-kr', | |
| 'iso-ir-149', | |
| 'korean', | |
| 'ks_c_5601-1987', | |
| 'ks_c_5601-1989', | |
| 'ksc5601', | |
| 'ksc_5601', | |
| 'windows-949', | |
| 'csiso2022kr', | |
| 'hz-gb-2312', | |
| 'iso-2022-cn', | |
| 'iso-2022-cn-ext', | |
| 'iso-2022-kr', | |
| 'utf-16be', | |
| 'utf-16', | |
| 'utf-16le', | |
| 'x-user-defined' | |
| )), | |
| @(@('-f', '--file'), @('<FILE>')), | |
| @(@('', '--files'), @()), | |
| @(@('-l', '--files-with-matches'), @()), | |
| @(@('-l', '--files-without-match'), @()), | |
| @(@('-F', '--fixed-strings'), @()), | |
| @(@('-L', '--follow'), @()), | |
| @(@('-g', '--glob'), @('<GLOB>')), | |
| @(@('-h', '--help'), @()), | |
| @(@('', '--heading'), @()), | |
| @(@('', '--hidden'), @()), | |
| @(@('-i', '--ignore-case'), @()), | |
| @(@('', '--ignore-file'), @('<FILE>')), | |
| @(@('-v', '--invert-match'), @()), | |
| @(@('-n', '--line-number'), @()), | |
| @(@('-M', '--max-columns'), @('<NUM>')), | |
| @(@('-m', '--max-count'), @('<NUM>')), | |
| @(@('-m', '--max-count'), @('<NUM>')), | |
| @(@('', '--max-filesize'), @('<NUM+SUFFIX?>')), | |
| @(@('', '--maxdepth'), @('<NUM>')), | |
| @(@('', '--mmap'), @()), | |
| @(@('', '--no-filename'), @()), | |
| @(@('', '--no-heading'), @()), | |
| @(@('', '--no-ignore'), @()), | |
| @(@('', '--no-ignore-parent'), @()), | |
| @(@('', '--no-ignore-vcs'), @()), | |
| @(@('-N', '--no-line-number'), @()), | |
| @(@('', '--no-messages'), @()), | |
| @(@('', '--no-mmap'), @()), | |
| @(@('-0', '--null'), @()), | |
| @(@('-o', '--only-matching'), @()), | |
| @(@('', '--path-separator'), @('"/"', '"\"')), | |
| @(@('-p', '--pretty'), @()), | |
| @(@('-q', '--quiet'), @()), | |
| @(@('', '--regex-size-limit'), @('<NUM+SUFFIX?>')), | |
| @(@('-e', '--regexp'), @('<PATTERN>')), | |
| @(@('-r', '--replace'), @('<ARG>')), | |
| @(@('-S', '--smart-case'), @()), | |
| @(@('', '--sort-files'), @()), | |
| @(@('-a', '--text'), @()), | |
| @(@('-j', '--threads'), @('<NUM>')), | |
| @(@('-t', '--type'), @('<TYPE>')), | |
| @(@('', '--type-add'), @('"src:include:cpp,py,md"', '"foo:*.foo"')), | |
| @(@('', '--type-clear'), @('<TYPE>')), | |
| @(@('', '--type-list'), @()), | |
| @(@('-T', '--type-not'), @('<TYPE>')), | |
| @(@('-u', '--unrestricted'), @()), | |
| @(@('-V', '--version'), @()), | |
| @(@('', '--vimgrep'), @()), | |
| @(@('-H', '--with-filename'), @()), | |
| @(@('-w', '--word-regexp'), @()) | |
| ) | |
| $colors_value = @('red', 'blue', 'green', 'cyan', 'magenta', 'yellow', 'white', 'black') | |
| $colors_style = @('nobold', 'bold', 'nointense', 'intense') | |
| $colors_attribute = @('fg', 'bg', 'none', 'style') | |
| $colors_type = @('path', 'line', 'column', 'match') | |
| function parse_option($parameters) { | |
| if (!($parameters -match '(^|\s+)(?<lastOption>\-\S+)\s+(?<lastToken>\S*)$')) { | |
| return @(@(), @(), '') | |
| } | |
| $lastOption = $Matches['lastOption'] | |
| $options | Where-Object { | |
| $_[0] -ccontains $lastOption | |
| } | Select-Object -First 1 | ForEach-Object { | |
| $option = $_[0] | |
| $completionList = $_[1] | |
| $wordToComplete = $Matches['lastToken'] | |
| return @($option, $completionList, $wordToComplete) | |
| } | |
| } | |
| function RipgrepTabExpansion($lastBlock) { | |
| $parameters = ($lastBlock -replace "^$(Get-AliasPattern rg)(\.exe)?\s+","") | |
| $parsed = (parse_option $parameters) | |
| $option = $parsed[0] | |
| $completionList = $parsed[1] | |
| $wordToComplete = $parsed[2] | |
| if ($option -and $completionList) { | |
| if ($completionList[0] -eq '<ARG>') { | |
| $completionList = $completionList + @('""') | |
| } | |
| elseif ($completionList[0] -eq '<FILE>') { | |
| $completionList = @() | |
| } | |
| elseif ($completionList[0] -eq '<GLOB>') { | |
| $completionList = $completionList + @('""') | |
| } | |
| elseif ($completionList[0] -eq '<NUM+SUFFIX?>') { | |
| $completionList = $completionList + @(0 .. 9) | |
| } | |
| elseif ($completionList[0] -eq '<NUM>') { | |
| $completionList = $completionList + @(0 .. 9) | |
| } | |
| elseif ($completionList[0] -eq '<PATTERN>') { | |
| $completionList = $completionList + @('""') | |
| } | |
| elseif ($completionList[0] -eq '<SEPARATOR>') { | |
| $completionList = $completionList + @('""', '"--"', '"\t"', '"\x7F"') | |
| } | |
| elseif ($completionList[0] -eq '<TYPE>') { | |
| $completionList = $completionList + ( | |
| rg --type-list | ForEach-Object { | |
| $_.SubString(0, $_.IndexOf(':')) | |
| } | |
| ) | |
| } | |
| elseif ($option -eq '--colors') { | |
| $tokens = $wordToComplete -split ':' | |
| if ($tokens.Count -eq 1) { | |
| $completionList = $completionList + $colors_type | |
| } | |
| elseif ($tokens.Count -eq 2) { | |
| $completionList = $completionList + ( | |
| $colors_attribute | ForEach-Object { | |
| $tokens[0] + ':' + $_ | |
| } | |
| ) | |
| } | |
| elseif ($tokens.Count -eq 3 -and $tokens[1] -eq 'style') { | |
| $completionList = $completionList + ( | |
| $colors_style | ForEach-Object { | |
| $tokens[0] + ':' + $tokens[1] + ':' + $_ | |
| } | |
| ) | |
| } | |
| else { | |
| $completionList = $completionList + ( | |
| $colors_value | ForEach-Object { | |
| $tokens[0] + ':' + $tokens[1] + ':' + $_ | |
| } | |
| ) | |
| } | |
| } | |
| $completionList | Where-Object { $_ -like "${wordToComplete}*" } | |
| } | |
| elseif ($parameters -match '(^|\s+)(?<lastToken>\S*)$') { | |
| $completionList = $options | ForEach-Object { $_[0] } | Where-Object { $_ } | |
| $wordToComplete = $Matches['lastToken'] | |
| $completionList | Where-Object { $_ -like "${wordToComplete}*" } | |
| } | |
| } | |
| $PowerTab_RegisterTabExpansion = if (Get-Module -Name powertab) { Get-Command Register-TabExpansion -Module powertab -ErrorAction SilentlyContinue } | |
| if ($PowerTab_RegisterTabExpansion) | |
| { | |
| & $PowerTab_RegisterTabExpansion "rg" -Type Command { | |
| param($Context, [ref]$TabExpansionHasOutput, [ref]$QuoteSpaces) # 1: | |
| $line = $Context.Line | |
| $lastBlock = [regex]::Split($line, '[|;]')[-1].TrimStart() | |
| $TabExpansionHasOutput.Value = $true | |
| RipgrepTabExpansion $lastBlock | |
| } | |
| return | |
| } | |
| if (Test-Path Function:\TabExpansion) { | |
| Rename-Item Function:\TabExpansion TabExpansionBackup | |
| } | |
| function TabExpansion($line, $lastWord) { | |
| $lastBlock = [regex]::Split($line, '[|;]')[-1].TrimStart() | |
| switch -regex ($lastBlock) { | |
| # Execute rg tab completion for all rg-related commands | |
| "^$(Get-AliasPattern rg)(\.exe)? (.*)" { | |
| RipgrepTabExpansion $lastBlock | |
| } | |
| # Fall back on existing tab expansion | |
| default { if (Test-Path Function:\TabExpansionBackup) { TabExpansionBackup $line $lastWord } } | |
| } | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| if (Get-Module RipgrepTabExpansion) { return } | |
| $thisDirectory = (Split-Path -parent $MyInvocation.MyCommand.Definition) | |
| . $thisDirectory\RipgrepTabExpansion.ps1 | |
| Export-ModuleMember -Function 'TabExpansion' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment