simplify/complicate vscode ext wrapper
This commit is contained in:
parent
fcdc946511
commit
641227a316
7 changed files with 259 additions and 232 deletions
|
@ -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
|
|
|
@ -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()
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
53
vscode/spec.md
Normal file
53
vscode/spec.md
Normal file
|
@ -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
|
||||||
|
|
206
vscode/vsext
Executable file
206
vscode/vsext
Executable file
|
@ -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()
|
Loading…
Reference in a new issue