diff --git a/README.md b/README.md index 43a730f..46a3aa6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,25 @@ # Dockerfile Zed Extension -- Tree Sitter: [tree-sitter-dockerfile](https://github.com/camdencheek/tree-sitter-dockerfile) -- Language Server: [dockerfile-language-server](https://github.com/rcjsuen/dockerfile-language-server) +- Tree Sitter: [tree-sitter-dockerfile](https://github.com/camdencheek/tree-sitter-dockerfile), [tree-sitter-yaml](https://github.com/zed-industries/tree-sitter-yaml) +- Language Server: [dockerfile-language-server](https://github.com/rcjsuen/dockerfile-language-server), [docker-language-server](https://github.com/docker/docker-language-server) + +## Docker Compose + +Compose files are given their own `Docker Compose` language, matched on +`compose.yaml`, `compose.yml`, `docker-compose.yaml` and `docker-compose.yml`. +Plain YAML files are unaffected. + +Each entry under `services:` gets runnables, so a single service can be brought +up, run and taken down from the gutter: + +| Task | Effect | +| --- | --- | +| `up` | starts the service and its dependencies, attached so logs appear in the terminal | +| `run` | starts a one-off container for the service | +| `down` | stops and removes the service's containers | + +Each is offered for `docker compose`, `docker-compose`, `podman compose` and +`podman-compose`. ## Configuration diff --git a/extension.toml b/extension.toml index e39466c..e2eeb4c 100644 --- a/extension.toml +++ b/extension.toml @@ -1,6 +1,6 @@ id = "dockerfile" name = "Dockerfile" -description = "Dockerfile support." +description = "Dockerfile and Docker Compose support." version = "0.2.1" schema_version = 1 authors = ["d1y ", "joshmeads "] @@ -17,11 +17,17 @@ languages = ["Dockerfile", "Docker Compose"] [language_servers.docker-language-server.language_ids] "Dockerfile" = "dockerfile" -"Docker Compose" = "docker-compose" +"Docker Compose" = "dockercompose" [grammars.dockerfile] repository = "https://github.com/camdencheek/tree-sitter-dockerfile" commit = "868e44ce378deb68aac902a9db68ff82d2299dd0" +# Registered as `yaml` rather than `docker-compose` so the id is snake_case and +# matches the `tree_sitter_yaml` symbol the parser exports. +[grammars.yaml] +repository = "https://github.com/zed-industries/tree-sitter-yaml" +commit = "baff0b51c64ef6a1fb1f8390f3ad6015b83ec13a" + [debug_adapters.buildx-dockerfile] schema_path = "./debug_adapter_schemas/buildx-dockerfile.json" diff --git a/languages/docker-compose/brackets.scm b/languages/docker-compose/brackets.scm new file mode 100644 index 0000000..edeb53a --- /dev/null +++ b/languages/docker-compose/brackets.scm @@ -0,0 +1,13 @@ +("[" @open + "]" @close) + +("{" @open + "}" @close) + +(("\"" @open + "\"" @close) + (#set! rainbow.exclude)) + +(("'" @open + "'" @close) + (#set! rainbow.exclude)) diff --git a/languages/docker-compose/config.toml b/languages/docker-compose/config.toml new file mode 100644 index 0000000..ed48298 --- /dev/null +++ b/languages/docker-compose/config.toml @@ -0,0 +1,30 @@ +# Adjusted from Zed's own YAML config, crates/grammars/src/yaml/config.toml, +# since this language shares the grammar Zed uses for YAML. +name = "Docker Compose" +grammar = "yaml" +path_suffixes = [ + "docker-compose.yml", + "docker-compose.yaml", + "compose.yaml", + "compose.yml", +] +line_comments = ["# "] +autoclose_before = ",]}" +brackets = [ + { start = "{", end = "}", close = true, newline = true }, + { start = "[", end = "]", close = true, newline = true }, + { start = "\"", end = "\"", close = true, newline = false, not_in = [ + "string", + ] }, + { start = "'", end = "'", close = true, newline = false, not_in = [ + "string", + ] }, +] + +auto_indent_on_paste = false +auto_indent_using_last_non_empty_line = false +# 1st block matches basic elements followed by ':', e.g. 'test: ' +# 2nd block matches the first element of an array when it's an object +increase_indent_pattern = "(:?^[^#]*:\\s*[|>]?\\s*$)|(:?^\\s*-[^#]*:\\s*(:?#+.*)$)" +prettier_parser_name = "yaml" +tab_size = 2 diff --git a/languages/docker-compose/highlights.scm b/languages/docker-compose/highlights.scm new file mode 100644 index 0000000..246e241 --- /dev/null +++ b/languages/docker-compose/highlights.scm @@ -0,0 +1,54 @@ +; Taken from https://github.com/zed-industries/zed/blob/f2ab00cec7545ffb7d8d75e4ccab74d5fccccf9b/crates/languages/src/yaml/highlights.scm +; as the "Docker Compose" language shares the grammar zed uses for YAML +(boolean_scalar) @boolean + +(null_scalar) @constant.builtin + +[ + (double_quote_scalar) + (single_quote_scalar) + (block_scalar) + (string_scalar) +] @string + +(escape_sequence) @string.escape + +[ + (integer_scalar) + (float_scalar) +] @number + +(comment) @comment + +[ + (anchor_name) + (alias_name) + (tag) +] @type + +key: (flow_node + (plain_scalar + (string_scalar) @property)) + +[ + "," + "-" + ":" + ">" + "?" + "|" +] @punctuation.delimiter + +[ + "[" + "]" + "{" + "}" +] @punctuation.bracket + +[ + "*" + "&" + "---" + "..." +] @punctuation.special diff --git a/languages/docker-compose/outline.scm b/languages/docker-compose/outline.scm new file mode 100644 index 0000000..a41447b --- /dev/null +++ b/languages/docker-compose/outline.scm @@ -0,0 +1,7 @@ +(block_mapping_pair + key: (flow_node + (plain_scalar + (string_scalar) @name)) + value: (flow_node + (plain_scalar + (string_scalar) @context))?) @item diff --git a/languages/docker-compose/overrides.scm b/languages/docker-compose/overrides.scm new file mode 100644 index 0000000..99c991e --- /dev/null +++ b/languages/docker-compose/overrides.scm @@ -0,0 +1,6 @@ +(comment) @comment.inclusive + +[ + (single_quote_scalar) + (double_quote_scalar) +] @string diff --git a/languages/docker-compose/redactions.scm b/languages/docker-compose/redactions.scm new file mode 100644 index 0000000..56c7415 --- /dev/null +++ b/languages/docker-compose/redactions.scm @@ -0,0 +1,2 @@ +(block_mapping_pair + value: (flow_node) @redact) diff --git a/languages/docker-compose/runnables.scm b/languages/docker-compose/runnables.scm new file mode 100644 index 0000000..177404e --- /dev/null +++ b/languages/docker-compose/runnables.scm @@ -0,0 +1,11 @@ +(document + (block_node + (block_mapping + (block_mapping_pair + key: _ @_services + value: (block_node + (block_mapping + (block_mapping_pair + key: _ @service @run))) + (#eq? @_services "services") + (#set! tag docker-compose-service))))) diff --git a/languages/docker-compose/tasks.json b/languages/docker-compose/tasks.json new file mode 100644 index 0000000..688d813 --- /dev/null +++ b/languages/docker-compose/tasks.json @@ -0,0 +1,62 @@ +[ + { + "label": "docker-compose up", + "command": "docker-compose -f $ZED_FILE up $ZED_CUSTOM_service", + "tags": ["docker-compose-service"] + }, + { + "label": "docker-compose run", + "command": "docker-compose -f $ZED_FILE run $ZED_CUSTOM_service", + "tags": ["docker-compose-service"] + }, + { + "label": "docker-compose down", + "command": "docker-compose -f $ZED_FILE down $ZED_CUSTOM_service", + "tags": ["docker-compose-service"] + }, + { + "label": "docker compose up", + "command": "docker compose -f $ZED_FILE up $ZED_CUSTOM_service", + "tags": ["docker-compose-service"] + }, + { + "label": "docker compose run", + "command": "docker compose -f $ZED_FILE run $ZED_CUSTOM_service", + "tags": ["docker-compose-service"] + }, + { + "label": "docker compose down", + "command": "docker compose -f $ZED_FILE down $ZED_CUSTOM_service", + "tags": ["docker-compose-service"] + }, + { + "label": "podman-compose up", + "command": "podman-compose -f $ZED_FILE up $ZED_CUSTOM_service", + "tags": ["docker-compose-service"] + }, + { + "label": "podman-compose run", + "command": "podman-compose -f $ZED_FILE run $ZED_CUSTOM_service", + "tags": ["docker-compose-service"] + }, + { + "label": "podman-compose down", + "command": "podman-compose -f $ZED_FILE down $ZED_CUSTOM_service", + "tags": ["docker-compose-service"] + }, + { + "label": "podman compose up", + "command": "podman compose -f $ZED_FILE up $ZED_CUSTOM_service", + "tags": ["docker-compose-service"] + }, + { + "label": "podman compose run", + "command": "podman compose -f $ZED_FILE run $ZED_CUSTOM_service", + "tags": ["docker-compose-service"] + }, + { + "label": "podman compose down", + "command": "podman compose -f $ZED_FILE down $ZED_CUSTOM_service", + "tags": ["docker-compose-service"] + } +]