Skip to content

Instantly share code, notes, and snippets.

@MattDMo
Last active April 3, 2022 23:16
Show Gist options
  • Star 35 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save MattDMo/6cb1dfbe8a124e1ca5af to your computer and use it in GitHub Desktop.
Save MattDMo/6cb1dfbe8a124e1ca5af to your computer and use it in GitHub Desktop.
SublimeREPL ipy_repl.py for running IPython/Jupyter in Sublime Text
# 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()
@samwega
Copy link

samwega commented Dec 12, 2020

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!

@researchdatascience
Copy link

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.

@MattDMo
Copy link
Author

MattDMo commented Oct 30, 2021

@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?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment