mirror of
				https://github.com/tailscale/tailscale.git
				synced 2025-10-31 00:01:40 +01:00 
			
		
		
		
	The approach is lifted from cobra: `tailscale completion bash` emits a bash
script for configuring the shell's autocomplete:
    . <( tailscale completion bash )
so that typing:
    tailscale st<TAB>
invokes:
    tailscale completion __complete -- st
RELNOTE=tailscale CLI now supports shell tab-completion
Fixes #3793
Signed-off-by: Paul Scott <paul@tailscale.com>
		
	
			
		
			
				
	
	
		
			73 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package cobra
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"compress/gzip"
 | |
| 	_ "embed"
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| )
 | |
| 
 | |
| //go:generate go run gen.go
 | |
| 
 | |
| //go:embed comp.bash.gz
 | |
| var compBash string
 | |
| 
 | |
| func ScriptBash(w io.Writer, name, compCmd, nameForVar string) error {
 | |
| 	return fmtgz(
 | |
| 		w, compBash,
 | |
| 		name, compCmd,
 | |
| 		ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp,
 | |
| 		ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs, ShellCompDirectiveKeepOrder,
 | |
| 	)
 | |
| }
 | |
| 
 | |
| //go:embed comp.zsh.gz
 | |
| var compZsh string
 | |
| 
 | |
| func ScriptZsh(w io.Writer, name, compCmd, nameForVar string) error {
 | |
| 	return fmtgz(
 | |
| 		w, compZsh,
 | |
| 		name, compCmd,
 | |
| 		ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp,
 | |
| 		ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs, ShellCompDirectiveKeepOrder,
 | |
| 	)
 | |
| }
 | |
| 
 | |
| //go:embed comp.fish.gz
 | |
| var compFish string
 | |
| 
 | |
| func ScriptFish(w io.Writer, name, compCmd, nameForVar string) error {
 | |
| 	return fmtgz(
 | |
| 		w, compFish,
 | |
| 		nameForVar, name, compCmd,
 | |
| 		ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp,
 | |
| 		ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs, ShellCompDirectiveKeepOrder,
 | |
| 	)
 | |
| }
 | |
| 
 | |
| //go:embed comp.ps1.gz
 | |
| var compPowershell string
 | |
| 
 | |
| func ScriptPowershell(w io.Writer, name, compCmd, nameForVar string) error {
 | |
| 	return fmtgz(
 | |
| 		w, compPowershell,
 | |
| 		name, nameForVar, compCmd,
 | |
| 		ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp,
 | |
| 		ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs, ShellCompDirectiveKeepOrder,
 | |
| 	)
 | |
| }
 | |
| 
 | |
| func fmtgz(w io.Writer, formatgz string, args ...any) error {
 | |
| 	f, err := gzip.NewReader(bytes.NewBufferString(formatgz))
 | |
| 	if err != nil {
 | |
| 		return fmt.Errorf("decompressing script: %w", err)
 | |
| 	}
 | |
| 	format, err := io.ReadAll(f)
 | |
| 	if err != nil {
 | |
| 		return fmt.Errorf("decompressing script: %w", err)
 | |
| 	}
 | |
| 	_, err = fmt.Fprintf(w, string(format), args...)
 | |
| 	return err
 | |
| }
 |