Skip to content

Commit ffd32df

Browse files
committed
completion: support fish completion
Fixes #10879. Upstream PR: iterative/shtab#195.
1 parent 2b19c72 commit ffd32df

File tree

3 files changed

+78
-8
lines changed

3 files changed

+78
-8
lines changed

dvc/cli/completion.py

Lines changed: 75 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,22 +74,72 @@
7474
}
7575
"""
7676

77+
FISH_PREAMBLE = """
78+
function __fish_complete_dvc_files
79+
__fish_complete_path | string match -re '\\*?.dvc|Dvcfile|dvc\\.yaml'
80+
end
81+
82+
function __fish_complete_dvc_stages
83+
for line in (dvc stage list -q)
84+
set -l parts (string split -m1 ' ' -- $line)
85+
set -l name $parts[1]
86+
set -l desc (string trim $parts[2])
87+
echo -e "$name $desc"
88+
end
89+
end
90+
91+
function __fish_complete_dvc_stages_and_files
92+
__fish_complete_dvc_stages
93+
__fish_complete_dvc_files
94+
end
95+
96+
function __fish_complete_dvc_experiments
97+
dvc exp list -q --all-commits --names-only
98+
end
99+
100+
function __fish_complete_dvc_remotes
101+
dvc remote list | cut -d' ' -f1
102+
end
103+
"""
104+
77105
PREAMBLE = {
78106
"bash": BASH_PREAMBLE,
79107
"zsh": ZSH_PREAMBLE,
108+
"fish": FISH_PREAMBLE,
80109
}
81110

82111
FILE = shtab.FILE
83112
DIR = shtab.DIRECTORY
84-
DVC_FILE = {"bash": "_dvc_compgen_DVCFiles", "zsh": "_dvc_compadd_DVCFiles"}
85-
STAGE = {"bash": "_dvc_compgen_stages", "zsh": "_dvc_compadd_stages"}
113+
DVC_FILE = {
114+
"bash": "_dvc_compgen_DVCFiles",
115+
"zsh": "_dvc_compadd_DVCFiles",
116+
"fish": "__fish_complete_dvc_files",
117+
}
118+
STAGE = {
119+
"bash": "_dvc_compgen_stages",
120+
"zsh": "_dvc_compadd_stages",
121+
"fish": "__fish_complete_dvc_stages",
122+
}
86123
DVCFILES_AND_STAGE = {
87124
"bash": "_dvc_compgen_stages_and_files",
88125
"zsh": "_dvc_compadd_stages_and_files",
126+
"fish": "__fish_complete_dvc_stages_and_files",
127+
}
128+
EXPERIMENT = {
129+
"bash": "_dvc_compgen_exps",
130+
"zsh": "_dvc_compadd_exps",
131+
"fish": "__fish_complete_dvc_experiments",
132+
}
133+
REMOTE = {
134+
"bash": "_dvc_compgen_remotes",
135+
"zsh": "_dvc_compadd_remotes",
136+
"fish": "__fish_complete_dvc_remotes",
137+
}
138+
CONFIG_VARS = {
139+
"bash": "_dvc_compgen_config_vars",
140+
"zsh": "_dvc_compadd_config_vars",
141+
"fish": "__fish_complete_dvc_config_vars",
89142
}
90-
EXPERIMENT = {"bash": "_dvc_compgen_exps", "zsh": "_dvc_compadd_exps"}
91-
REMOTE = {"bash": "_dvc_compgen_remotes", "zsh": "_dvc_compadd_remotes"}
92-
CONFIG_VARS = {"bash": "_dvc_compgen_config_vars", "zsh": "_dvc_compadd_config_vars"}
93143

94144

95145
def get_preamble() -> dict[str, str]:
@@ -103,7 +153,26 @@ def get_preamble() -> dict[str, str]:
103153
_dvc_config_vars=(
104154
{nl.join(config_vars)}
105155
)
156+
"""
157+
indent = "\t\t".expandtabs(4) # 8 spaces
158+
lines = (
159+
"\n".join(
160+
f"{indent}{c} \\"
161+
for c in config_vars[:-1] # all but last
162+
)
163+
+ "\n"
164+
+ f"{indent}{config_vars[-1]}"
165+
) # last line without backslash
166+
config_vars_arr_fish = f"""
167+
function __fish_complete_dvc_config_vars
168+
set -l _dvc_config_vars \\
169+
{lines}
170+
printf %s\\n $_dvc_config_vars
171+
end
106172
"""
107173
for shell, preamble in PREAMBLE.items():
108-
ret[shell] = config_vars_arr + preamble
174+
if shell != "fish":
175+
ret[shell] = config_vars_arr + preamble
176+
else:
177+
ret[shell] = config_vars_arr_fish + preamble
109178
return ret

dvc/commands/completion.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
logger = logger.getChild(__name__)
99

1010

11-
SUPPORTED_SHELLS = ["bash", "zsh"]
11+
SUPPORTED_SHELLS = ["bash", "zsh", "fish"]
1212

1313

1414
class CmdCompletion(CmdBaseNoRepo):

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,8 @@ dependencies = [
6969
"ruamel.yaml>=0.17.11",
7070
"scmrepo>=3.5.2,<4",
7171
"shortuuid>=0.5",
72-
"shtab<2,>=1.3.4",
72+
# "shtab<2,>=1.3.4",
73+
"shtab @ git+https://github.com/skshetry/shtab.git@fish-shell-v2",
7374
"tabulate>=0.8.7",
7475
"tomlkit>=0.11.1",
7576
"tqdm<5,>=4.63.1",

0 commit comments

Comments
 (0)