from importlib.util import find_spec if find_spec('pynvim'): from pynvim import attach, setup_logging else: from neovim import attach, setup_logging import sys import importlib from os import environ assert __name__ == "__main__" if "" in sys.path: sys.path.remove("") serveraddr = sys.argv[1] yarpid = int(sys.argv[2]) module = sys.argv[3] module_obj = None nvim = None environ['NVIM_YARP_MODULE'] = module setup_logging(module) def on_request(method, args): if hasattr(module_obj, method): return getattr(module_obj, method)(*args) else: raise Exception('method %s not found' % method) def on_notification(method, args): if hasattr(module_obj, method): getattr(module_obj, method)(*args) else: raise Exception('method %s not found' % method) pass def on_setup(): pass try: # create another connection to avoid synchronization issue? if len(serveraddr.split(':')) == 2: serveraddr, port = serveraddr.split(':') port = int(port) nvim = attach('tcp', address=serveraddr, port=port) else: nvim = attach('socket', path=serveraddr) sys.modules['vim'] = nvim sys.modules['nvim'] = nvim paths = nvim.eval(r'globpath(&rtp,"pythonx",1) . "\n" .' r' globpath(&rtp,"rplugin/python3",1)') for path in paths.split("\n"): if not path: continue if path not in sys.path: sys.path.append(path) module_obj = importlib.import_module(module) nvim.call('yarp#core#channel_started', yarpid, nvim.channel_id) nvim.run_loop(on_request, on_notification, on_setup) finally: nvim.close()