summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorOpportunityLiu <[email protected]>2019-06-05 14:17:11 +0800
committerOpportunityLiu <[email protected]>2019-06-05 14:17:11 +0800
commit1b5017a88667c5af7a4afd4311d4861eb540b1bb (patch)
tree926c7a07f0bae03d9c78dd94350834227828321d /scripts
parent06dba0daf4968b9632ebc00a9018c6af044422df (diff)
tab completion
Diffstat (limited to 'scripts')
-rw-r--r--scripts/get.ps1249
-rwxr-xr-xscripts/get.sh36
-rw-r--r--scripts/register-completions.bash16
-rw-r--r--scripts/register-completions.ps18
-rw-r--r--scripts/register-completions.zsh10
5 files changed, 225 insertions, 94 deletions
diff --git a/scripts/get.ps1 b/scripts/get.ps1
index fc35a9023..4b186c23f 100644
--- a/scripts/get.ps1
+++ b/scripts/get.ps1
@@ -9,105 +9,166 @@ param (
& {
-Function myExit($code){
- if($code -is [int] -and $code -ne 0){
- throw $Error[0]
- }else{
- break
+ function myExit($code) {
+ if ($code -is [int] -and $code -ne 0) {
+ throw $Error[0]
+ } else {
+ break
+ }
}
-}
-Function writeErrorTip($msg){
- Write-Host $msg -BackgroundColor Red -ForegroundColor White
-}
+ function writeErrorTip($msg) {
+ Write-Host $msg -BackgroundColor Red -ForegroundColor White
+ }
-Function writeLogoLine($msg){
- Write-Host $msg -BackgroundColor White -ForegroundColor DarkBlue
-}
+ function writeLogoLine($msg) {
+ Write-Host $msg -BackgroundColor White -ForegroundColor DarkBlue
+ }
-writeLogoLine ' _ '
-writeLogoLine ' __ ___ __ __ __ _| | ______ '
-writeLogoLine ' \ \/ / | \/ |/ _ | |/ / __ \ '
-writeLogoLine ' > < | \__/ | /_| | < ___/ '
-writeLogoLine ' /_/\_\_|_| |_|\__ \|_|\_\____| getter '
-writeLogoLine ' '
-writeLogoLine ' '
+ function registerTabCompletion {
-if($PSVersionTable.PSVersion.Major -lt 5){
- writeErrorTip 'Sorry but PowerShell v5+ is required'
- throw 'PowerShell''s version too low'
-}
-$temppath=($env:TMP,$env:TEMP,'.' -ne $null)[0]
-$outfile=$temppath+"\$pid-xmake-installer.exe"
-try{
- Write-Output "$pid"|Out-File -FilePath "$outfile"
- Remove-Item "$outfile"
-}catch{
- writeErrorTip 'Cannot write to temp path'
- writeErrorTip 'Please set environment var "TMP" to another path'
- myExit 1
-}
-Write-Host "Start downloading https://github.com/xmake-io/xmake/releases/download/$version/xmake-$branch.exe .."
-try{
- [Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
- Invoke-Webrequest "https://github.com/xmake-io/xmake/releases/download/$version/xmake-$branch.exe" -OutFile "$outfile"
-}catch{
- writeErrorTip 'Download failed!'
- writeErrorTip 'Check your network or... the news of S3 break'
- myExit 1
-}
-Write-Host 'Start installation... Hope your antivirus doesn''t trouble'
-$installdir=$HOME+'\xmake'
-Write-Host "Install to $installdir"
-try{
- Start-Process -FilePath "$outfile" -ArgumentList "/S /D=$installdir" -Wait
-}catch{
+ function writeDataToFile($file) {
+ $encoding = [text.encoding]::UTF8
+ if (Test-Path $file -PathType Leaf) {
+ #Create a stream reader to get the file's encoding and contents.
+ $sr = New-Object System.IO.StreamReader($file, $true)
+ [char[]] $buffer = new-object char[] 3
+ $sr.Read($buffer, 0, 3) | Out-Null
+ $encoding = $sr.CurrentEncoding
+ $sr.Close() | Out-Null
+
+ if ($(Get-Content $file) -imatch "Register-ArgumentCompleter -Native -CommandName xmake -ScriptBlock") {
+ Write-Host "Seems the tab completion of xmake has installed here..."
+ return
+ }
+ }
+
+ try {
+ [IO.File]::AppendAllText($file, "`n", $encoding)
+ } catch {
+ writeErrorTip "Failed to append to profile!"
+ writeErrorTip "Please try again as administrator"
+ return
+ }
+ try {
+ $content = (Invoke-Webrequest 'https://raw.githubusercontent.com/xmake-io/xmake/master/scripts/register-completions.ps1' -UseBasicParsing).Content
+ } catch {
+ writeErrorTip 'Download failed!'
+ writeErrorTip 'Check your network or... the news of S3 break'
+ return
+ }
+ [IO.File]::AppendAllText($file, $content, $encoding)
+ [IO.File]::AppendAllText($file, "`n", $encoding)
+ }
+ $message = 'Tab completion service'
+ $question = 'Would you like to install tab completion service of xmake to your profile?'
+
+ $choices = @(
+ (New-Object Management.Automation.Host.ChoiceDescription -ArgumentList @(
+ 'For &all users',
+ "Install for all users, writes to $($PROFILE.AllUsersAllHosts), admin privilege is needed.")),
+ (New-Object Management.Automation.Host.ChoiceDescription -ArgumentList @(
+ 'Just for &me',
+ "Install for current user, writes to $($PROFILE.CurrentUserAllHosts).")),
+ (New-Object Management.Automation.Host.ChoiceDescription -ArgumentList @(
+ 'Just for this &host',
+ "Install for current user current host, writes to $($PROFILE.CurrentUserCurrentHost).")),
+ (New-Object Management.Automation.Host.ChoiceDescription -ArgumentList @(
+ '&No',
+ "Do not install xmake's tab completion service."))
+ )
+ switch ($Host.UI.PromptForChoice($message, $question, $choices, 1)) {
+ 0 { writeDataToFile($PROFILE.AllUsersAllHosts) }
+ 1 { writeDataToFile($PROFILE.CurrentUserAllHosts) }
+ 2 { writeDataToFile($PROFILE.CurrentUserCurrentHost) }
+ }
+ }
+
+ writeLogoLine ' _ '
+ writeLogoLine ' __ ___ __ __ __ _| | ______ '
+ writeLogoLine ' \ \/ / | \/ |/ _ | |/ / __ \ '
+ writeLogoLine ' > < | \__/ | /_| | < ___/ '
+ writeLogoLine ' /_/\_\_|_| |_|\__ \|_|\_\____| getter '
+ writeLogoLine ' '
+ writeLogoLine ' '
+
+ if ($PSVersionTable.PSVersion.Major -lt 5) {
+ writeErrorTip 'Sorry but PowerShell v5+ is required'
+ throw 'PowerShell''s version too low'
+ }
+ $temppath = ($env:TMP, $env:TEMP, '.' -ne $null)[0]
+ $outfile = $temppath + "\$pid-xmake-installer.exe"
+ try {
+ Write-Output "$pid" | Out-File -FilePath "$outfile"
+ Remove-Item "$outfile"
+ } catch {
+ writeErrorTip 'Cannot write to temp path'
+ writeErrorTip 'Please set environment var "TMP" to another path'
+ myExit 1
+ }
+ Write-Host "Start downloading https://github.com/xmake-io/xmake/releases/download/$version/xmake-$branch.exe .."
+ try {
+ [Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
+ Invoke-Webrequest "https://github.com/xmake-io/xmake/releases/download/$version/xmake-$branch.exe" -OutFile "$outfile"
+ } catch {
+ writeErrorTip 'Download failed!'
+ writeErrorTip 'Check your network or... the news of S3 break'
+ myExit 1
+ }
+ Write-Host 'Start installation... Hope your antivirus doesn''t trouble'
+ $installdir = $HOME + '\xmake'
+ Write-Host "Install to $installdir"
+ try {
+ Start-Process -FilePath "$outfile" -ArgumentList "/S /D=$installdir" -Wait
+ } catch {
+ Remove-Item "$outfile"
+ writeErrorTip 'Install failed!'
+ writeErrorTip 'Close your antivirus then try again'
+ myExit 1
+ }
Remove-Item "$outfile"
- writeErrorTip 'Install failed!'
- writeErrorTip 'Close your antivirus then try again'
- myExit 1
-}
-Remove-Item "$outfile"
-Write-Host 'Adding to PATH... almost done'
-$env:Path+=";$installdir"
-[Environment]::SetEnvironmentVariable("Path",[Environment]::GetEnvironmentVariable("Path",[System.EnvironmentVariableTarget]::User)+";$installdir",[System.EnvironmentVariableTarget]::User) # this step is optional because installer writes path to regedit
-try{
- xmake --version
-}catch{
- writeErrorTip 'Everything is showing installation has finished'
- writeErrorTip 'But xmake could not run... Why?'
- myExit 1
-}
-Write-Host "Pulling xmake from branch $branch"
-$outfile=$temppath+"\$pid-xmake-repo.zip"
-try{
- Invoke-Webrequest "https://github.com/xmake-io/xmake/archive/$branch.zip" -OutFile "$outfile"
-}catch{
- writeErrorTip 'Pull Failed!'
- writeErrorTip 'xmake is now available but may not be newest'
- myExit
-}
-Write-Host 'Expanding archive...'
-New-Item -Path "$temppath" -Name "$pid-xmake-repo" -ItemType "directory" -Force
-$oldpwd=$pwd
-$repodir=$temppath+"\$pid-xmake-repo"
-try{
- Expand-Archive "$outfile" "$repodir" -Force
- Write-Host 'Self-building...'
- Set-Location ($repodir+"\xmake-$branch\core")
- xmake
- Write-Host 'Copying new files...'
- Copy-Item 'build\xmake.exe' "$installdir" -Force
- Set-Location '..\xmake'
- Copy-Item * "$installdir" -Recurse -Force
- xmake --version
-}catch{
- writeErrorTip 'Update Failed!'
- writeErrorTip 'xmake is now available but may not be newest'
-}finally{
- Set-Location "$oldpwd" -ErrorAction SilentlyContinue
- Remove-Item "$outfile" -ErrorAction SilentlyContinue
- Remove-Item "$repodir" -Recurse -Force -ErrorAction SilentlyContinue
-}
+ Write-Host 'Adding to PATH... almost done'
+ $env:Path += ";$installdir"
+ [Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path", [System.EnvironmentVariableTarget]::User) + ";$installdir", [System.EnvironmentVariableTarget]::User) # this step is optional because installer writes path to regedit
+ try {
+ xmake --version
+ } catch {
+ writeErrorTip 'Everything is showing installation has finished'
+ writeErrorTip 'But xmake could not run... Why?'
+ myExit 1
+ }
+ Write-Host "Pulling xmake from branch $branch"
+ $outfile = $temppath + "\$pid-xmake-repo.zip"
+ try {
+ Invoke-Webrequest "https://github.com/xmake-io/xmake/archive/$branch.zip" -OutFile "$outfile"
+ } catch {
+ writeErrorTip 'Pull Failed!'
+ writeErrorTip 'xmake is now available but may not be newest'
+ myExit
+ }
+ Write-Host 'Expanding archive...'
+ New-Item -Path "$temppath" -Name "$pid-xmake-repo" -ItemType "directory" -Force
+ $oldpwd = $pwd
+ $repodir = $temppath + "\$pid-xmake-repo"
+ try {
+ Expand-Archive "$outfile" "$repodir" -Force
+ Write-Host 'Self-building...'
+ Set-Location ($repodir + "\xmake-$branch\core")
+ xmake
+ Write-Host 'Copying new files...'
+ Copy-Item 'build\xmake.exe' "$installdir" -Force
+ Set-Location '..\xmake'
+ Copy-Item * "$installdir" -Recurse -Force
+ xmake --version
+ } catch {
+ writeErrorTip 'Update Failed!'
+ writeErrorTip 'xmake is now available but may not be newest'
+ } finally {
+ Set-Location "$oldpwd" -ErrorAction SilentlyContinue
+ Remove-Item "$outfile" -ErrorAction SilentlyContinue
+ Remove-Item "$repodir" -Recurse -Force -ErrorAction SilentlyContinue
+ }
+
+ registerTabCompletion
}
diff --git a/scripts/get.sh b/scripts/get.sh
index 98a59ec2a..164ec9c48 100755
--- a/scripts/get.sh
+++ b/scripts/get.sh
@@ -147,6 +147,42 @@ install_profile()
{
if [ ! -d ~/.xmake ]; then mkdir ~/.xmake; fi
echo "export PATH=$prefix/bin:\$PATH" > ~/.xmake/profile
+ echo '
+if [[ "$SHELL" = */zsh ]]; then
+
+ # zsh parameter completion for xmake
+
+ _xmake_zsh_complete()
+ {
+ local completions=("$(xmake lua private.utils.complete 0 "$words")")
+
+ reply=( "${(ps:\n:)completions}" )
+ }
+
+ compctl -K _xmake_zsh_complete xmake
+
+elif [[ "$SHELL" = */bash ]]; then
+
+# bash parameter completion for xmake
+
+ _xmake_bash_complete()
+ {
+ local word=${COMP_WORDS[COMP_CWORD]}
+
+ local completions
+ completions="$(xmake lua private.utils.complete "${COMP_POINT}" "${COMP_LINE}" 2>/dev/null)"
+ if [ $? -ne 0 ]; then
+ completions=""
+ fi
+
+ COMPREPLY=( $(compgen -W "$completions" -- "$word") )
+ }
+
+ complete -f -F _xmake_bash_complete xmake
+
+fi
+' >> ~/.xmake/profile
+
if [[ "$SHELL" = */zsh ]]; then write_profile ~/.zshrc
elif [[ "$SHELL" = */ksh ]]; then write_profile ~/.kshrc
elif [[ "$SHELL" = */bash ]]; then write_profile ~/.bashrc
diff --git a/scripts/register-completions.bash b/scripts/register-completions.bash
new file mode 100644
index 000000000..11cadedf3
--- /dev/null
+++ b/scripts/register-completions.bash
@@ -0,0 +1,16 @@
+# bash parameter completion for xmake
+
+_xmake_bash_complete()
+{
+ local word=${COMP_WORDS[COMP_CWORD]}
+
+ local completions
+ completions="$(xmake lua private.utils.complete "${COMP_POINT}" "${COMP_LINE}" 2>/dev/null)"
+ if [ $? -ne 0 ]; then
+ completions=""
+ fi
+
+ COMPREPLY=( $(compgen -W "$completions" -- "$word") )
+}
+
+complete -f -F _xmake_bash_complete xmake
diff --git a/scripts/register-completions.ps1 b/scripts/register-completions.ps1
new file mode 100644
index 000000000..58e11320a
--- /dev/null
+++ b/scripts/register-completions.ps1
@@ -0,0 +1,8 @@
+# PowerShell parameter completion shim for xmake
+
+Register-ArgumentCompleter -Native -CommandName xmake -ScriptBlock {
+ param($commandName, $wordToComplete, $cursorPosition)
+ xmake lua private.utils.complete "$cursorPosition" "$wordToComplete" | ForEach-Object {
+ [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
+ }
+}
diff --git a/scripts/register-completions.zsh b/scripts/register-completions.zsh
new file mode 100644
index 000000000..ff019569f
--- /dev/null
+++ b/scripts/register-completions.zsh
@@ -0,0 +1,10 @@
+# zsh parameter completion for xmake
+
+_xmake_zsh_complete()
+{
+ local completions=("$(xmake lua private.utils.complete 0 "$words")")
+
+ reply=( "${(ps:\n:)completions}" )
+}
+
+compctl -K _xmake_zsh_complete xmake