diff --git a/docs/modules/pkl-cli/pages/index.adoc b/docs/modules/pkl-cli/pages/index.adoc index b63ecf0d..ddcb06c5 100644 --- a/docs/modules/pkl-cli/pages/index.adoc +++ b/docs/modules/pkl-cli/pages/index.adoc @@ -381,7 +381,7 @@ pkl eval -m . myFiles.pkl pkl eval -m "%{moduleName}" foo.pkl bar.pkl ---- -For additional details, see xref:language-reference:index.adoc#multiple-file-output[Multiple File Output] +For additional details, see xref:language-reference:index.adoc#multiple-file-output[Multiple File Output] in the language reference. ==== @@ -651,6 +651,22 @@ Same meaning as <> in <>. This command also takes <>. +[[command-shell-completion]] +=== `pkl shell-completion` + +*Synopsis*: `pkl shell-completion ` + +Generate shell completion script. Supported shells are: `bash`, `zsh`, `fish`. + +[source,shell] +---- +# Generate shell completion script for bash +pkl shell-completion bash + +# Generate shell completion script for zsh +pkl shell-completion zsh +---- + [[common-options]] === Common options diff --git a/pkl-cli/src/main/kotlin/org/pkl/cli/commands/RootCommand.kt b/pkl-cli/src/main/kotlin/org/pkl/cli/commands/RootCommand.kt index 4e11544e..ff077f90 100644 --- a/pkl-cli/src/main/kotlin/org/pkl/cli/commands/RootCommand.kt +++ b/pkl-cli/src/main/kotlin/org/pkl/cli/commands/RootCommand.kt @@ -15,6 +15,7 @@ */ package org.pkl.cli.commands +import com.github.ajalt.clikt.completion.CompletionCommand import com.github.ajalt.clikt.core.Context import com.github.ajalt.clikt.core.NoOpCliktCommand import com.github.ajalt.clikt.core.context @@ -48,6 +49,11 @@ class RootCommand : NoOpCliktCommand(name = "pkl") { ProjectCommand(), DownloadPackageCommand(), AnalyzeCommand(), + CompletionCommand( + name = "shell-completion", + help = "Generate a completion script for the given shell", + epilog = "For more information, visit $helpLink", + ), ) } } diff --git a/pkl-cli/src/test/kotlin/org/pkl/cli/CliShellCompletionTest.kt b/pkl-cli/src/test/kotlin/org/pkl/cli/CliShellCompletionTest.kt new file mode 100644 index 00000000..7e6c2d76 --- /dev/null +++ b/pkl-cli/src/test/kotlin/org/pkl/cli/CliShellCompletionTest.kt @@ -0,0 +1,34 @@ +/* + * Copyright © 2024-2025 Apple Inc. and the Pkl project authors. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.pkl.cli + +import com.github.ajalt.clikt.testing.test +import org.assertj.core.api.Assertions.assertThat +import org.junit.jupiter.api.Test +import org.pkl.cli.commands.RootCommand + +class CliShellCompletionTest { + @Test + fun `shell completion command supports required shells`() { + val shellList = listOf("bash", "zsh", "fish") + + for (shell in shellList) { + val result = RootCommand().test("shell-completion $shell") + + assertThat(result.stdout).contains("Command completion for pkl") + } + } +}