Skip to content

Instantly share code, notes, and snippets.

@ilyasotkov
Last active June 2, 2024 12:34
Show Gist options
  • Save ilyasotkov/27e77fd4a1a045bb17f5bcf7f20c1f2e to your computer and use it in GitHub Desktop.
Save ilyasotkov/27e77fd4a1a045bb17f5bcf7f20c1f2e to your computer and use it in GitHub Desktop.

Deprecation

See microsoft/vscode-remote-release#2133 (comment)

Usage

Assuming the script is named make_devcontainer_folder_uri.py, is executable, and is in your $PATH:

# Open . in dev container
code --folder-uri $(make_devcontainer_folder_uri.py)

# Open ./myapp in dev container
code --folder-uri $(make_devcontainer_folder_uri.py ./myapp)

LICENSE

MIT No Attribution

Copyright 2022 (c) Ilya Sotkov

Permission is hereby granted, free of charge, to any person obtaining a copy of this
software and associated documentation files (the "Software"), to deal in the Software
without restriction, including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#!/usr/bin/env python3
import os
import re
import sys
def main():
workspace_path = os.path.abspath(sys.argv[1] if len(sys.argv) > 1 else ".")
devcontainer_config_file_path = find_devcontainer_config_file_path(workspace_path)
remote_workspace_folder = get_remote_workspace_folder(devcontainer_config_file_path)
workspace_path_hex = workspace_path.encode().hex()
folder_uri = "vscode-remote://dev-container+" + workspace_path_hex + remote_workspace_folder
print(folder_uri)
def find_devcontainer_config_file_path(workspace_path):
paths = [
os.path.join(workspace_path, ".devcontainer.json"),
os.path.join(workspace_path, ".devcontainer", "devcontainer.json"),
]
for path in paths:
if os.path.isfile(path):
return path
raise OSError("Could not find dev container config file in any of: " + ", ".join(paths))
def get_remote_workspace_folder(config_path):
config = open(config_path).read()
pattern = r'"workspaceFolder"\s*:\s*"(.+)"'
found = re.search(pattern, config)
if not found:
raise KeyError(
"Could not find 'workspaceFolder' setting in your dev container config file!"
)
return found.group(1)
if __name__ == "__main__":
main()
@tuunit
Copy link

tuunit commented Jun 2, 2024

Hi @claudioparram,

I did something similar. On top of that I added a zsh shell completion script as well:

https://github.com/tuunit/dotfiles/blob/9ed10e4778735c395ff0d9ea1d0d18246e9e11d4/.zshrc#L63-L77

All my devcontainer specs live in a separate repository. This way when I enter devcontainer and press TAB my shell shows a list of all directories / devcontainers.

$ devcontainer <TAB>
devcon1 devcon2 devcon3

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment