From 641227a31667e9ab633bcefe32ee47a7ae97babc Mon Sep 17 00:00:00 2001 From: Daylin Morgan Date: Fri, 5 Aug 2022 11:42:07 -0500 Subject: [PATCH] simplify/complicate vscode ext wrapper --- vscode/extensions.yml | 43 ------ vscode/generate_install_scripts.py | 66 --------- vscode/generate_install_scripts.sh | 45 ------- vscode/install-extensions.bat | 39 ------ vscode/install-extensions.sh | 39 ------ vscode/spec.md | 53 ++++++++ vscode/vsext | 206 +++++++++++++++++++++++++++++ 7 files changed, 259 insertions(+), 232 deletions(-) delete mode 100644 vscode/extensions.yml delete mode 100644 vscode/generate_install_scripts.py delete mode 100755 vscode/generate_install_scripts.sh delete mode 100644 vscode/install-extensions.bat delete mode 100755 vscode/install-extensions.sh create mode 100644 vscode/spec.md create mode 100755 vscode/vsext diff --git a/vscode/extensions.yml b/vscode/extensions.yml deleted file mode 100644 index 800429f..0000000 --- a/vscode/extensions.yml +++ /dev/null @@ -1,43 +0,0 @@ -general: - - ms-vscode-remote.remote-ssh - - ms-vscode-remote.remote-ssh-edit - - ms-vscode-remote.remote-wsl - - vscodevim.vim -misc-tools: - - Shan.code-settings-sync - - janisdd.vscode-edit-csv - - cssho.vscode-svgviewer - - naumovs.color-highlight - - antfu.slidev -web-dev: - - bradlc.vscode-tailwindcss - - ritwickdey.liveserver -styling: - - johnpapa.vscode-peacock - - PKief.material-icon-theme - - Thomaz.preparing - - dracula-theme.theme-dracula -code-help: - - christian-kohler.path-intellisense - - aaron-bond.better-comments - - streetsidesoftware.code-spell-checker - - vsls-contrib.gistfs - - mhutchie.git-graph - - Github.copilot -python: - - ms-python.python - - ms-toolsai.jupyter - - njpwerner.autodocstring - - snakemake.snakemake-lang -language-support: - - lextudio.restructuredtext - - Ikuyadeu.r - - James-Yu.latex-workshop - - budparr.language-hugo-vscode - - tht13.rst-vscode - - skellock.just - - neilding.language-liquid - - snakemake.snakemake-lang - - voorjaar.windicss-intellisense - - eww-yuck.yuck - - bungcip.better-toml diff --git a/vscode/generate_install_scripts.py b/vscode/generate_install_scripts.py deleted file mode 100644 index 745716d..0000000 --- a/vscode/generate_install_scripts.py +++ /dev/null @@ -1,66 +0,0 @@ -import yaml -from pathlib import Path - -FRONTMATTER = """ -VS Code Extensions install script - -Author: Daylin Morgan - -DO NOT EDIT MANUALLY! -Regenerate with generate_install_scripts.py -""" - -FILE_DIR = Path(__file__).parent - - -def shell_script_writer(extensions_dict, filename): - with Path(filename).open("w") as f: - f.write("#!/bin/bash\n") - f.write(FRONTMATTER.replace("\n", "\n# ")[:-2]) - f.write('\n\necho "Installing VS Code Extensions"\n') - - for section, extensions in extensions_dict.items(): - f.write(f"\n# {section} extensions") - f.write("\n# " + "-" * len(section) + "-" * 11) - - for extension in extensions: - f.write(f"\ncode --install-extension {extension} --force") - - f.write("\n") - - f.write('\necho "Extension installation compeleted!"') - - -def batch_script_writer(extensions_dict, filename): - with Path(filename).open("w") as f: - f.write("echo off\n") - f.write(FRONTMATTER.replace("\n", "\n:: ")[:-3]) - f.write('\n\necho "Installing VS Code Extensions"\necho.\n') - - for section, extensions in extensions_dict.items(): - f.write(f"\n:: {section} extensions") - f.write("\n:: " + "-" * len(section) + "-" * 11) - - for extension in extensions: - f.write(f"\ncall code --install-extension {extension} --force") - - f.write("\n") - - f.write('\necho "Extension installation compeleted!"') - - -def main(): - print("Generating shell and batch scripts with extensions.yml") - - extensions_yml = FILE_DIR / "extensions.yml" - - with extensions_yml.open("r") as f: - extensions_dict = yaml.load(f, Loader=yaml.FullLoader) - - shell_script_writer(extensions_dict, "install-extensions.sh") - - batch_script_writer(extensions_dict, "install-extensions.bat") - - -if __name__ == "__main__": - main() diff --git a/vscode/generate_install_scripts.sh b/vscode/generate_install_scripts.sh deleted file mode 100755 index 8ace32a..0000000 --- a/vscode/generate_install_scripts.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/env bash - -YAMLDOC="extensions.yml" - -# check for yq -if ! command -v yq &>/dev/null; then - echo "yq could not be found" - echo "to install w/ eget" - echo "eget mikefarah/yq" - exit -fi - -readarray sections < <(yq e 'keys | .[]' $YAMLDOC) - -get_extensions() { - for section in "${sections[@]}"; do - echo $section - readarray exts < <(key=$section yq e '.[env(key)] | .[]' $YAMLDOC) - echo ${exts[@]} - for ext in "${exts[@]}"; do - write_bat $ext - write_sh $ext - done - done -} - -write_bat() { - echo "call code --install-extension $1 --force" >>install-extensions.bat -} - -write_sh() { - echo "code --install-extension $1 --force" >>install-extensions.sh -} - -# clean up old files -rm -f install-extensions.{sh,bat} -echo "echo off" >install-extensions.bat -echo >>install-extensions.bat -echo "echo Installing VSCode extensions" >>install-extensions.bat -echo "#!/usr/bin/env bash" >install-extensions.sh -echo >>install-extensions.sh -echo "echo Installing VSCode extensions" >>install-extensions.sh - -# read extensions and write install scripts -get_extensions diff --git a/vscode/install-extensions.bat b/vscode/install-extensions.bat deleted file mode 100644 index 81a0b81..0000000 --- a/vscode/install-extensions.bat +++ /dev/null @@ -1,39 +0,0 @@ -echo off - -echo Installing VSCode extensions -call code --install-extension ms-vscode-remote.remote-ssh --force -call code --install-extension ms-vscode-remote.remote-ssh-edit --force -call code --install-extension ms-vscode-remote.remote-wsl --force -call code --install-extension vscodevim.vim --force -call code --install-extension Shan.code-settings-sync --force -call code --install-extension janisdd.vscode-edit-csv --force -call code --install-extension cssho.vscode-svgviewer --force -call code --install-extension naumovs.color-highlight --force -call code --install-extension antfu.slidev --force -call code --install-extension bradlc.vscode-tailwindcss --force -call code --install-extension ritwickdey.liveserver --force -call code --install-extension johnpapa.vscode-peacock --force -call code --install-extension PKief.material-icon-theme --force -call code --install-extension Thomaz.preparing --force -call code --install-extension dracula-theme.theme-dracula --force -call code --install-extension christian-kohler.path-intellisense --force -call code --install-extension aaron-bond.better-comments --force -call code --install-extension streetsidesoftware.code-spell-checker --force -call code --install-extension vsls-contrib.gistfs --force -call code --install-extension mhutchie.git-graph --force -call code --install-extension Github.copilot --force -call code --install-extension ms-python.python --force -call code --install-extension ms-toolsai.jupyter --force -call code --install-extension njpwerner.autodocstring --force -call code --install-extension snakemake.snakemake-lang --force -call code --install-extension lextudio.restructuredtext --force -call code --install-extension Ikuyadeu.r --force -call code --install-extension James-Yu.latex-workshop --force -call code --install-extension budparr.language-hugo-vscode --force -call code --install-extension tht13.rst-vscode --force -call code --install-extension skellock.just --force -call code --install-extension neilding.language-liquid --force -call code --install-extension snakemake.snakemake-lang --force -call code --install-extension voorjaar.windicss-intellisense --force -call code --install-extension eww-yuck.yuck --force -call code --install-extension bungcip.better-toml --force diff --git a/vscode/install-extensions.sh b/vscode/install-extensions.sh deleted file mode 100755 index 063ac07..0000000 --- a/vscode/install-extensions.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/usr/bin/env bash - -echo Installing VSCode extensions -code --install-extension ms-vscode-remote.remote-ssh --force -code --install-extension ms-vscode-remote.remote-ssh-edit --force -code --install-extension ms-vscode-remote.remote-wsl --force -code --install-extension vscodevim.vim --force -code --install-extension Shan.code-settings-sync --force -code --install-extension janisdd.vscode-edit-csv --force -code --install-extension cssho.vscode-svgviewer --force -code --install-extension naumovs.color-highlight --force -code --install-extension antfu.slidev --force -code --install-extension bradlc.vscode-tailwindcss --force -code --install-extension ritwickdey.liveserver --force -code --install-extension johnpapa.vscode-peacock --force -code --install-extension PKief.material-icon-theme --force -code --install-extension Thomaz.preparing --force -code --install-extension dracula-theme.theme-dracula --force -code --install-extension christian-kohler.path-intellisense --force -code --install-extension aaron-bond.better-comments --force -code --install-extension streetsidesoftware.code-spell-checker --force -code --install-extension vsls-contrib.gistfs --force -code --install-extension mhutchie.git-graph --force -code --install-extension Github.copilot --force -code --install-extension ms-python.python --force -code --install-extension ms-toolsai.jupyter --force -code --install-extension njpwerner.autodocstring --force -code --install-extension snakemake.snakemake-lang --force -code --install-extension lextudio.restructuredtext --force -code --install-extension Ikuyadeu.r --force -code --install-extension James-Yu.latex-workshop --force -code --install-extension budparr.language-hugo-vscode --force -code --install-extension tht13.rst-vscode --force -code --install-extension skellock.just --force -code --install-extension neilding.language-liquid --force -code --install-extension snakemake.snakemake-lang --force -code --install-extension voorjaar.windicss-intellisense --force -code --install-extension eww-yuck.yuck --force -code --install-extension bungcip.better-toml --force diff --git a/vscode/spec.md b/vscode/spec.md new file mode 100644 index 0000000..9f46f48 --- /dev/null +++ b/vscode/spec.md @@ -0,0 +1,53 @@ +# VS Code Extensions + +## general +ms-vscode-remote.remote-ssh +ms-vscode-remote.remote-ssh-edit +ms-vscode-remote.remote-wsl +vscodevim.vim + +## misc-tools +Shan.code-settings-sync +janisdd.vscode-edit-csv +naumovs.color-highlight +davidhouchin.whitespace-plus +dlasagno.rasi +antfu.slidev + +## web-dev +bradlc.vscode-tailwindcss +ritwickdey.liveserver +esbenp.prettier-vscode + +## styling +johnpapa.vscode-peacock +PKief.material-icon-theme +Thomaz.preparing +catppuccin.catppuccin-vsc + +## code-help +metaseed.metajump +christian-kohler.path-intellisense +aaron-bond.better-comments +streetsidesoftware.code-spell-checker +eamodio.gitlens +vsls-contrib.gistfs +mhutchie.git-graph + +## python +ms-python.python +ms-toolsai.jupyter +ms-python.vscode-pylance +ms-toolsai.jupyter-keymap +ms-toolsai.jupyter-renderers +njpwerner.autodocstring +quarto.quarto + +## language-support +budparr.language-hugo-vscode +skellock.just +snakemake.snakemake-lang +voorjaar.windicss-intellisense +eww-yuck.yuck +bungcip.better-toml + diff --git a/vscode/vsext b/vscode/vsext new file mode 100755 index 0000000..76eae26 --- /dev/null +++ b/vscode/vsext @@ -0,0 +1,206 @@ +#!/usr/bin/env python3 + +import argparse +import shlex +import subprocess +import sys +from pathlib import Path +from shutil import which + + +def is_tool(name): + """Check whether `name` is on PATH and marked as executable.""" + if not which(name): + print(f"ERROR: {name} is not found in your PATH") + sys.exit(1) + + +def run(cmd, capture=True, returncode=False): + result = subprocess.run( + shlex.split(cmd), + stdout=subprocess.PIPE if capture else None, + text=True, + shell=False, + ) + + if returncode: + return result.returncode + elif capture: + return result.stdout.strip() + + +class Gum: + def __init__(self): + is_tool("gum") + + def confirm(self, question): + return not run( + "gum confirm " + "--selected.bold " + "--selected.background 11 " + "--selected.foreground 8 " + f"'{question}'", + returncode=True, + ) + + def color(self, text, color): + return run(f'gum style --foreground {color} "{text}"') + + def header(self, text, color=11): + run( + "gum style " + "--foreground 212 --border-foreground 212 --border rounded " + '--align center --width 30 --margin "1 4" ' + f"'{self.color(text,color)}'", + capture=False, + ) + + def choose(self, options): + if isinstance(options, str): + options = options.split("") + if isinstance(options, list): + options = "".join([f"'{i}'" for i in options]) + return run(f"gum choose {options}") + + def input(self, placeholder, value): + run( + "gum input" + f"--placeholder {placeholder}" + if placeholder + else "" + f"--value {value}" + if value + else "" + ) + + def spinner(self, placeholder, cmd): + run(f"gum spin -s points --title '{placeholder}'" + cmd) + + +gum = Gum() + + +def pprint(text, color): + print(gum.color(text, color)) + + +def parse_exts(mdfile): + + with Path(mdfile).open("r") as f: + md = f.read() + md = md.split("##")[1:] + exts = {} + all = [] + for section in md: + head = section.splitlines()[0].strip() + exts[head] = [] + for line in section.splitlines()[1:]: + if line == "": + continue + exts[head].append(line.strip()) + all.append(line.strip()) + + return exts, sorted(all) + + +class SubcommandHelpFormatter(argparse.RawDescriptionHelpFormatter): + def _format_action(self, action): + parts = super(argparse.RawDescriptionHelpFormatter, self)._format_action(action) + if action.nargs == argparse.PARSER: + parts = "\n".join(parts.split("\n")[1:]) + return parts + + +def get_args(): + + p = argparse.ArgumentParser(formatter_class=SubcommandHelpFormatter) + sp = p.add_subparsers(title="commands", metavar="", dest="command",required=True) + check = sp.add_parser( + "check", + help="check the extensions which have already been installed", + aliases = ['c'] + ) + install = sp.add_parser( + "install", + help="install the extensions from the spec", + aliases =['i'] + ) + install.add_argument( + "-f", "--force", help="force the installation of exts", action="store_true" + ) + remove = sp.add_parser( + "remove", + help="remove all extra packages", + aliases = ['r'] + ) + + p.add_argument( + "-s", + "--spec", + help="mardown spec list (default ~/.dotfiles/vscode/spec.md)", + default=Path.home() / ".dotfiles" / "vscode" / "spec.md", + ) + + if len(sys.argv) < 2: + # p.print_usage() + p.print_help() + sys.exit(1) + + return p.parse_args() + + +def get_extra_exts(spec, installed): + # sanitize lists + spec = [ext.lower() for ext in spec] + installed = [ext.lower() for ext in installed] + + return [ext for ext in spec if ext not in installed], [ + ext for ext in installed if ext not in spec + ] + + +def code(flag, exts, force=False): + cmd = "code " + " ".join([f"{flag} {ext}" for ext in exts]) + if force: + cmd +=" --force" + run(cmd, capture=False) + + +def main(): + args = get_args() + gum.header("VS Code Extensions Installer") + + spec_sections, spec_list = parse_exts(args.spec) + + not_installed, extra_installed = get_extra_exts( + spec_list, run("code --list-extensions").splitlines() + ) + + if args.command == "check" or args.command == "c": + + for head, exts in spec_sections.items(): + pprint(f"## {head}", 11) + for ext in exts: + if ext.lower() in not_installed: + pprint(ext, 9) + else: + print(ext) + if extra_installed: + pprint("\nExtra installed extensions:", 11) + print("\n".join(extra_installed)) + + elif args.command == "install" or args.command =='i': + + pprint("Installing extensions from spec list", 11) + code("--install-extension", spec_list, args.force) + + elif args.command == "remove" or args.command == "r": + pprint("Removing extensions I don't know about", 11) + + print("\n".join(extra_installed) + "\n") + + if gum.confirm(f"Remove the above {len(extra_installed)} packages"): + print("bye bye packages") + code("--uninstall-extension", extra_installed) + + +if __name__ == "__main__": + main()