dotfiles/files/bin/vscode-project-list

60 lines
1.7 KiB
Text
Raw Normal View History

#!/usr/bin/env python
from pathlib import Path
import json
import itertools
import subprocess
HOME = Path.home()
VSCODE_CONFIG_FILE = HOME.joinpath(".config/Code/storage.json")
SEARCH_DIRS = [
HOME.joinpath("Projects"),
HOME.joinpath("Repositories"),
HOME.joinpath("SR"),
]
def get_search_project_dirs():
for path in SEARCH_DIRS:
if not path.exists():
continue
for subdir in path.iterdir():
if subdir.is_dir():
yield subdir
def get_vscode_project_dirs():
vscode_config = json.loads(VSCODE_CONFIG_FILE.read_text())
2021-04-11 14:24:17 +01:00
for entry in vscode_config['openedPathsList']['entries']:
recent_path = entry.get('folderUri')
if not recent_path:
continue
recent_path_path = Path(recent_path.replace('file://', ''))
if recent_path_path.exists():
yield recent_path_path
def main():
project_paths = sorted(set(itertools.chain(get_search_project_dirs(), get_vscode_project_dirs())), key=lambda p: p.name.lower())
try:
project_paths.remove(Path.home()) # Don't try and edit home dir
except ValueError:
pass
home_dir = str(HOME) + "/"
project_paths_display = [str(project).replace(home_dir, "") for project in project_paths]
selected_project = subprocess.run(["rofi", "-dmenu", "-no-case-sensitive", "-format", "i"], input="\n".join(project_paths_display).encode(), stdout=subprocess.PIPE)
selected_project.check_returncode()
selected_index = int(selected_project.stdout.strip())
if selected_index == -1:
return # This is hit when enter is hit on no results
subprocess.run(['code', project_paths[selected_index]])
if __name__ == '__main__':
main()