import json import os import subprocess from pathlib import Path from PyInquirer import prompt from AbstractModule import AbstractModule def get_vim_root(): # return Path(os.getcwd()).joinpath("devenv", ".vim") return Path().home().joinpath(".vim") class VimModule(AbstractModule): def __init__(self): super().__init__() self.json_config = {} with open("modules/vim/vimrc_conf.json") as plugins: self.json_config = json.load(plugins) def create_folder_structure(self): os.makedirs(str(get_vim_root().joinpath("autoload")), exist_ok=True) os.makedirs(str(get_vim_root().joinpath("plugged")), exist_ok=True) def get_vimplug_file(self): vimplug_filepath = Path(str(get_vim_root().joinpath("autoload"))) print(vimplug_filepath) if os.path.isfile(str(get_vim_root().joinpath("autoload", "plug.vim"))): print("Vimplug already installed!") else: curl_request = "curl {} -o {}".format( self.json_config['pluginmanager_url'], str(get_vim_root().joinpath("autoload", "plug.vim")) ) subprocess.call(curl_request, shell=True) def create_plugin_section(self): vimrc_content = [] plugins = self.json_config['plugins'] print("Available Plugins:") plugin_selection = [ { 'type': 'checkbox', 'message': 'Select plugins', 'name': 'modules', 'choices': list(map(lambda x: {"name": x}, plugins.keys())) } ] selected_plugins = prompt(plugin_selection)['modules'] if len(selected_plugins) > 0: self.get_vimplug_file() print("\033[4mYour selection:\033[0m") [print(x) for x in selected_plugins] try: index = vimrc_content.index("call plug#begin('~/.vim/plugged')\n") + 1 for plugin in selected_plugins: vimrc_content.insert(index, plugins[plugin] + "\n") except ValueError: vimrc_content.append("call plug#begin('~/.vim/plugged')\n") for element in selected_plugins: vimrc_content.append(plugins[element] + "\n") vimrc_content.append("call plug#end()\n") return vimrc_content def create_setting_section(self): default_settings = list(self.json_config['settings'].values()) print("\n\033[4mDefault settings:\033[0m") [print(i) for i in default_settings] vimrc_content = list(map(lambda x: x + "\n", default_settings)) return vimrc_content def get_vimfile_working_copy(self): vimrc_path = str(get_vim_root().joinpath(".vimrc")) try: with open(vimrc_path, "r") as vimrc_file: vimrc_content = vimrc_file.readlines() except FileNotFoundError: vimrc_content = [] return vimrc_content def write_vimfile(self, vimrc_content): seen = set() seen_add = seen.add vimrc_content = [x1 for x1 in vimrc_content if not (x1 in seen or seen_add(x1))] vimrc_path = str(get_vim_root().joinpath(".vimrc")) with open(vimrc_path, "w") as vimrc_file: for line in vimrc_content: vimrc_file.write(line) def exec_plugin_manager(self): install_plugins = "vim +PlugInstall +qall +silent" subprocess.call(install_plugins, shell=True) def run(self): self.create_folder_structure() plugin_section = self.create_plugin_section() settings_section = self.create_setting_section() self.write_vimfile(settings_section + plugin_section) self.exec_plugin_manager()