-
-
Save MattDMo/6cb1dfbe8a124e1ca5af to your computer and use it in GitHub Desktop.
| # from https://gist.github.com/MattDMo/6cb1dfbe8a124e1ca5af | |
| import os | |
| import json | |
| import socket | |
| import threading | |
| activate_this = os.environ.get("SUBLIMEREPL_ACTIVATE_THIS", None) | |
| # turn off pager | |
| os.environ["TERM"] = "emacs" | |
| if activate_this: | |
| with open(activate_this, "r") as f: | |
| exec(f.read(), {"__file__": activate_this}) | |
| try: | |
| import jupyter_console.app | |
| JUPYTER = True | |
| except ImportError: | |
| JUPYTER = False | |
| if not JUPYTER: | |
| try: | |
| import IPython | |
| IPYTHON = True | |
| version = IPython.version_info[0] | |
| except ImportError: | |
| # for virtualenvs w/o IPython | |
| import code | |
| code.InteractiveConsole().interact() | |
| # Jupyter and IPython 4+ | |
| if JUPYTER or (IPYTHON and version > 3): | |
| from traitlets.config.loader import Config | |
| # all other versions | |
| else: | |
| from IPython.config.loader import Config | |
| editor = "subl -w" | |
| cfg = Config() | |
| cfg.ZMQTerminalInteractiveShell.simple_prompt = True | |
| # cfg.InteractiveShell.readline_use = False # not needed in recent IPython versions | |
| cfg.InteractiveShell.autoindent = True | |
| cfg.InteractiveShell.colors = "NoColor" | |
| cfg.InteractiveShell.editor = os.environ.get("SUBLIMEREPL_EDITOR", editor) | |
| if JUPYTER: | |
| app = jupyter_console.app.ZMQTerminalIPythonApp(config=cfg, user_ns={}) | |
| elif IPYTHON: | |
| app = IPython.terminal.ipapp.TerminalIPythonApp(config=cfg, user_ns={}) | |
| app.initialize() | |
| ac_port = int(os.environ.get("SUBLIMEREPL_AC_PORT", "0")) | |
| ac_ip = os.environ.get("SUBLIMEREPL_AC_IP", "127.0.0.1") | |
| if ac_port: | |
| s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
| s.connect((ac_ip, ac_port)) | |
| def read_netstring(s): | |
| size = 0 | |
| while True: | |
| ch = s.recv(1) | |
| if ch == b":": | |
| break | |
| size = size * 10 + int(ch) | |
| msg = b"" | |
| while size != 0: | |
| msg += s.recv(size) | |
| size -= len(msg) | |
| ch = s.recv(1) | |
| assert ch == b',' | |
| return msg | |
| def send_netstring(sock, msg): | |
| payload = b"".join([str(len(msg)).encode("ascii"), b":", msg.encode("utf-8"), b","]) | |
| sock.sendall(payload) | |
| def complete(shell, req): | |
| # Jupyter | |
| if JUPYTER: | |
| result = shell.Completer.complete_request(req["line"], req["cursor_pos"]) | |
| return (req["line"], result["matches"]) | |
| # IPython 4 | |
| elif IPYTHON and version > 3: | |
| return shell.complete(**req) | |
| # IPython 1-3 | |
| else: | |
| return [] | |
| def handle(): | |
| while True: | |
| msg = read_netstring(s).decode("utf-8") | |
| try: | |
| req = json.loads(msg) | |
| result = complete(app.shell, req) | |
| res = json.dumps(result) | |
| send_netstring(s, res) | |
| except Exception: | |
| send_netstring(s, b"[]") | |
| if ac_port: | |
| t = threading.Thread(target=handle) | |
| t.start() | |
| app.start() | |
| if ac_port: | |
| s.close() |
Works as described, even on newer versions than the instructions. Now I can run bash commands from the REPL in sublime.. awesome! Just don't try to launch kakoune inside sublime, it will crash the REPL haha
Thank you!
hi there - I get python but my tabnine intelligence doesn't work while using this. Would you happened to know if I need to do something to get the auto completion to work?
thanks for your help with this.
@pushpaghimire I can get Anaconda's code completion to work, but not using any of the LSP plugins like pyright or pylsp, so it's not surprising that TabNine doesn't work. Unfortunately, I don't have any suggestions on what to change, as I haven't figured out what the underlying problem is in the first place. Perhaps someone else can chime in?
@MattDMo
Yeah, I had actually came to this solution on my own before asking here and actually managed to make it work. The problem I have with it is that it hardcodes a specific env, whereas I would like to keep it dynamic.
The reason for this is that I have several different projects (mostly simple web-apps or AWS lambda functions) and each one of them has its own venv. In normal situations, I just use my conda base environment, which is in PATH so it's everywhere, but in those specific projects I want to be able to access their respective virtual env.
That's it basically. Do you know if there's a way to make python compile a .bat or .ps1 script?