diff --git a/modules/cli/src/main/scala/scala/cli/commands/installcompletions/InstallCompletions.scala b/modules/cli/src/main/scala/scala/cli/commands/installcompletions/InstallCompletions.scala index 2b01f9c82a..836068aeee 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/installcompletions/InstallCompletions.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/installcompletions/InstallCompletions.scala @@ -1,7 +1,7 @@ package scala.cli.commands.installcompletions import caseapp.* -import caseapp.core.complete.{Bash, Zsh} +import caseapp.core.complete.{Bash, Fish, Zsh} import caseapp.core.help.HelpFormat import java.io.File @@ -47,6 +47,7 @@ object InstallCompletions extends ScalaCommand[InstallCompletionsOptions] { ) System.err.println(s"$name install completions --shell zsh") System.err.println(s"$name install completions --shell bash") + System.err.println(s"$name install completions --shell fish") sys.exit(1) } } @@ -76,6 +77,10 @@ object InstallCompletions extends ScalaCommand[InstallCompletionsOptions] { "compinit" ).map(_ + System.lineSeparator()).mkString (script, defaultRcFile) + case Fish.id | "fish" => + val script = Fish.script(name) + val defaultRcFile = os.home / ".config" / "fish" / "config.fish" + (script, defaultRcFile) case _ => System.err.println(s"Unrecognized or unsupported shell: $format") sys.exit(1) @@ -118,6 +123,7 @@ object InstallCompletions extends ScalaCommand[InstallCompletionsOptions] { EnvVar.Misc.shell.valueOpt.map(_.split("[\\/]+").last).map { case "bash" => Bash.id case "zsh" => Zsh.id + case "fish" => Fish.id case other => other } } diff --git a/modules/cli/src/main/scala/scala/cli/commands/uninstallcompletions/UninstallCompletions.scala b/modules/cli/src/main/scala/scala/cli/commands/uninstallcompletions/UninstallCompletions.scala index d3f701c83b..5b77346ec5 100644 --- a/modules/cli/src/main/scala/scala/cli/commands/uninstallcompletions/UninstallCompletions.scala +++ b/modules/cli/src/main/scala/scala/cli/commands/uninstallcompletions/UninstallCompletions.scala @@ -37,7 +37,8 @@ object UninstallCompletions extends ScalaCommand[UninstallCompletionsOptions] { .getOrElse(os.home) val rcFiles = options.shared.rcFile.map(file => Seq(os.Path(file, os.pwd))).getOrElse(Seq( zDotDir / ".zshrc", - os.home / ".bashrc" + os.home / ".bashrc", + os.home / ".config" / "fish" / "config.fish" )).filter(os.exists(_)) rcFiles.foreach { rcFile => diff --git a/modules/integration/src/test/scala/scala/cli/integration/InstallAndUninstallCompletionsTests.scala b/modules/integration/src/test/scala/scala/cli/integration/InstallAndUninstallCompletionsTests.scala index d8b49bfd8c..aeac07e646 100644 --- a/modules/integration/src/test/scala/scala/cli/integration/InstallAndUninstallCompletionsTests.scala +++ b/modules/integration/src/test/scala/scala/cli/integration/InstallAndUninstallCompletionsTests.scala @@ -8,18 +8,21 @@ import scala.util.Properties class InstallAndUninstallCompletionsTests extends ScalaCliSuite { val zshRcFile: String = ".zshrc" val bashRcFile: String = ".bashrc" + val fishRcFile: String = "config.fish" val rcContent: String = s""" |dummy line |dummy line""".stripMargin val testInputs: TestInputs = TestInputs( - os.rel / zshRcFile -> rcContent, - os.rel / bashRcFile -> rcContent + os.rel / zshRcFile -> rcContent, + os.rel / bashRcFile -> rcContent, + os.rel / ".config" / "fish" / fishRcFile -> rcContent ) def runInstallAndUninstallCompletions(): Unit = { testInputs.fromRoot { root => val zshRcPath = root / zshRcFile val bashRcPath = root / bashRcFile + val fishRcPath = root / ".config" / "fish" / fishRcFile // install completions to the dummy rc files os.proc(TestUtil.cli, "install-completions", "--rc-file", zshRcPath, "--shell", "zsh").call( cwd = root @@ -27,13 +30,19 @@ class InstallAndUninstallCompletionsTests extends ScalaCliSuite { os.proc(TestUtil.cli, "install-completions", "--rc-file", bashRcPath, "--shell", "bash").call( cwd = root ) + os.proc(TestUtil.cli, "install-completions", "--rc-file", fishRcPath, "--shell", "fish").call( + cwd = root + ) expect(os.read(bashRcPath).contains(bashRcScript)) expect(os.read(zshRcPath).contains(zshRcScript)) + expect(os.read(fishRcPath).contains(fishRcScript)) // uninstall completions from the dummy rc files os.proc(TestUtil.cli, "uninstall-completions", "--rc-file", zshRcPath).call(cwd = root) os.proc(TestUtil.cli, "uninstall-completions", "--rc-file", bashRcPath).call(cwd = root) + os.proc(TestUtil.cli, "uninstall-completions", "--rc-file", fishRcPath).call(cwd = root) expect(os.read(zshRcPath) == rcContent) expect(os.read(bashRcPath) == rcContent) + expect(os.read(fishRcPath) == rcContent) } } @@ -57,6 +66,15 @@ class InstallAndUninstallCompletionsTests extends ScalaCliSuite { addTags(script) } + lazy val fishRcScript: String = { + val progName = "scala-cli" + val script = + s""" + complete $progName -a '($progName complete fish-v1 (math 1 + (count (__fish_print_cmd_args))) (__fish_print_cmd_args))' + |""".stripMargin + addTags(script) + } + lazy val zshRcScript: String = { val projDirs = ProjectDirectories.from(null, null, "ScalaCli") val dir = os.Path(projDirs.dataLocalDir, TestUtil.pwd) / "completions" / "zsh" diff --git a/website/docs/_advanced_install.mdx b/website/docs/_advanced_install.mdx index 5b99ef7c64..9bc762820c 100644 --- a/website/docs/_advanced_install.mdx +++ b/website/docs/_advanced_install.mdx @@ -447,9 +447,11 @@ Alternatively, you can directly download it from the Maven repository [here](htt values={[ {label: 'Bash', value: 'bash'}, {label: 'zsh', value: 'zsh'}, + {label: 'fish', value: 'fish'}, ]}> + @@ -463,6 +465,7 @@ Try the completions with values={[ {label: 'Bash', value: 'bash'}, {label: 'zsh', value: 'zsh'}, + {label: 'fish', value: 'fish'}, ]}> @@ -479,6 +482,15 @@ eval "$(scala-cli install completions --env --shell zsh)" scala-cli -- ``` + + + +``` +eval "$(scala-cli install completions --env --shell fish)" +fish +scala-cli -- +``` + @@ -493,6 +505,7 @@ with `--shell` values={[ {label: 'Bash', value: 'bash'}, {label: 'zsh', value: 'zsh'}, + {label: 'fish', value: 'fish'}, ]}> @@ -507,6 +520,13 @@ scala-cli install completions --shell bash scala-cli install completions --shell zsh ``` + + + +```bash +scala-cli install completions --shell fish +``` +