Skip to content

Instantly share code, notes, and snippets.

@stevearc
Created November 27, 2017 03:17
Show Gist options
  • Save stevearc/ad20bb6cbac2d5296dc0f675d4eae40a to your computer and use it in GitHub Desktop.
Save stevearc/ad20bb6cbac2d5296dc0f675d4eae40a to your computer and use it in GitHub Desktop.
Headless server for FoxDot
#!/usr/bin/env python
from __future__ import print_function
import argparse
import socket
from contextlib import closing
from threading import Thread, Lock
DEFAULT_PORT = 7088
_env = None
lock = Lock()
def main():
""" Run a FoxDot process and listen for input on a socket """
global _env
parser = argparse.ArgumentParser(description=main.__doc__)
parser.add_argument('-l', action='append', nargs='*',
help="library to load")
parser.add_argument('-p', type=int, default=DEFAULT_PORT,
help="port (default %(default)s)")
args = parser.parse_args()
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', args.p))
serversocket.listen(0)
from FoxDot import FoxDotCode
_env = FoxDotCode()
if args.l:
for arg in args.l:
for fname in arg:
with open(fname, 'r') as ifile:
execute(ifile.read(), verbose=False)
print("Listening on port %d" % args.p)
while True:
connection, address = serversocket.accept()
handler = Thread(target=handle_connection, args=(connection,))
handler.start()
def execute(code, verbose=True):
with lock:
return _env(code, verbose=verbose)
def handle_connection(connection):
with closing(connection):
chunks = []
while True:
buf = connection.recv(4096)
if not buf:
break
chunks.append(buf)
if chunks:
ret = execute(''.join(chunks))
connection.send(ret)
if __name__ == '__main__':
main()
@stevearc
Copy link
Author

To use with vim I added the following keybindings to my vimrc:

nnoremap <CR> :call system('nc localhost 7088', getline('.'))<CR>
vnoremap <CR> y:call system('nc localhost 7088', @")<CR>

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