Skip to content

Commit 0e9b25b

Browse files
authored
shell autocomplete functions (#107)
* bash, zsh, fish autocomplete * linux install
1 parent 1ef953a commit 0e9b25b

File tree

8 files changed

+381
-4
lines changed

8 files changed

+381
-4
lines changed

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,5 @@
1616
bin/
1717
.idea/
1818
dist/
19+
20+
.DS_Store

.goreleaser.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ archives:
2424
darwin: mac
2525
files:
2626
- LICENSE
27+
- 'autocomplete/*'
2728
release:
2829
github:
2930
owner: livekit

Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,6 @@ check_lfs:
1818
exit 1; \
1919
fi \
2020
}
21+
22+
fish_autocomplete: cli
23+
./bin/livekit-cli generate-fish-completion -o autocomplete/fish_autocomplete

autocomplete/bash_autocomplete

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#! /bin/bash
2+
3+
# livekit-cli autocomplete for bash
4+
# original: https://github.com/urfave/cli/blob/main/autocomplete/bash_autocomplete
5+
6+
_cli_bash_autocomplete() {
7+
if [[ "${COMP_WORDS[0]}" != "source" ]]; then
8+
local cur opts base
9+
COMPREPLY=()
10+
cur="${COMP_WORDS[COMP_CWORD]}"
11+
if [[ "$cur" == "-"* ]]; then
12+
opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} ${cur} --generate-bash-completion )
13+
else
14+
opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-bash-completion )
15+
fi
16+
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
17+
return 0
18+
fi
19+
}
20+
21+
complete -o bashdefault -o default -o nospace -F _cli_bash_autocomplete livekit-cli

autocomplete/fish_autocomplete

+271
Large diffs are not rendered by default.

autocomplete/zsh_autocomplete

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# livekit-cli autocomplete for zsh
2+
# original: https://github.com/urfave/cli/blob/main/autocomplete/zsh_autocomplete
3+
4+
_cli_zsh_autocomplete() {
5+
local -a opts
6+
local cur
7+
cur=${words[-1]}
8+
if [[ "$cur" == "-"* ]]; then
9+
opts=("${(@f)$(${words[@]:0:#words[@]-1} ${cur} --generate-bash-completion)}")
10+
else
11+
opts=("${(@f)$(${words[@]:0:#words[@]-1} --generate-bash-completion)}")
12+
fi
13+
14+
if [[ "${opts[1]}" != "" ]]; then
15+
_describe 'values' opts
16+
else
17+
_files
18+
fi
19+
}
20+
21+
compdef _cli_zsh_autocomplete livekit-cli

cmd/livekit-cli/main.go

+36-3
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,29 @@ import (
1414

1515
func main() {
1616
app := &cli.App{
17-
Name: "livekit-cli",
18-
Usage: "CLI client to LiveKit",
17+
Name: "livekit-cli",
18+
Usage: "CLI client to LiveKit",
19+
Version: livekitcli.Version,
20+
EnableBashCompletion: true,
21+
Suggest: true,
1922
Flags: []cli.Flag{
2023
&cli.BoolFlag{
2124
Name: "verbose",
2225
},
2326
},
24-
Version: livekitcli.Version,
27+
Commands: []*cli.Command{
28+
{
29+
Name: "generate-fish-completion",
30+
Action: generateFishCompletion,
31+
Hidden: true,
32+
Flags: []cli.Flag{
33+
&cli.StringFlag{
34+
Name: "out",
35+
Aliases: []string{"o"},
36+
},
37+
},
38+
},
39+
},
2540
}
2641

2742
logger.SetLogger(stdr.New(log.Default()), "livekit-cli")
@@ -38,3 +53,21 @@ func main() {
3853
fmt.Println(err)
3954
}
4055
}
56+
57+
func generateFishCompletion(c *cli.Context) error {
58+
fishScript, err := c.App.ToFishCompletion()
59+
if err != nil {
60+
return err
61+
}
62+
63+
outPath := c.String("out")
64+
if outPath != "" {
65+
if err := os.WriteFile(outPath, []byte(fishScript), 0o644); err != nil {
66+
return err
67+
}
68+
} else {
69+
fmt.Println(fishScript)
70+
}
71+
72+
return nil
73+
}

install-cli.sh

+26-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ set -o pipefail
88

99
REPO="livekit-cli"
1010
INSTALL_PATH="/usr/local/bin"
11+
BASH_COMPLETION_PATH="/usr/share/bash-completion/completions"
12+
ZSH_COMPLETION_PATH="/usr/share/zsh/site-functions"
13+
FISH_COMPLETION_PATH="/usr/share/fish/vendor_completions.d"
1114

1215
log() { printf "%b\n" "$*"; }
1316
abort() {
@@ -82,6 +85,28 @@ fi
8285
log "Installing ${REPO} ${VERSION}"
8386
log "Downloading from ${ARCHIVE_URL}..."
8487

85-
curl -s -L "${ARCHIVE_URL}" | ${SUDO_PREFIX} tar xzf - -C "${INSTALL_PATH}" --wildcards --no-anchored "$REPO*"
88+
TEMP_DIR_PATH="$(mktemp -d)"
89+
90+
curl -s -L "${ARCHIVE_URL}" | ${SUDO_PREFIX} tar xzf - -C "${TEMP_DIR_PATH}" --wildcards --no-anchored "$REPO*"
91+
92+
mv "${TEMP_DIR_PATH}/livekit-cli" "${INSTALL_PATH}/livekit-cli"
93+
94+
if [ -d "${TEMP_DIR_PATH}/autocomplete" ]
95+
then
96+
if [ -d "${BASH_COMPLETION_PATH}" ]
97+
then
98+
mv "${TEMP_DIR_PATH}/autocomplete/bash_autocomplete" "${BASH_COMPLETION_PATH}/livekit-cli"
99+
fi
100+
101+
if [ -d "${ZSH_COMPLETION_PATH}" ]
102+
then
103+
mv "${TEMP_DIR_PATH}/autocomplete/zsh_autocomplete" "${BASH_COMPLETION_PATH}/_livekit-cli"
104+
fi
105+
106+
if [ -d "${FISH_COMPLETION_PATH}" ]
107+
then
108+
livekit-cli generate-fish-completion -o "${FISH_COMPLETION_PATH}/livekit-cli.fish"
109+
fi
110+
fi
86111

87112
log "\n$REPO is installed to $INSTALL_PATH\n"

0 commit comments

Comments
 (0)