From: Carlos Pita <carlosjosepita@gmail.com>
To: 19755@debbugs.gnu.org
Subject: bug#19755: python.el: native completion: more problems (and solutions)
Date: Thu, 5 Feb 2015 23:22:17 -0300 [thread overview]
Message-ID: <CAELgYhesz6pOS7kPQ79rZi9zKBqcFdTyj7-mLa08FbF2FAshzA@mail.gmail.com> (raw)
In-Reply-To: <CAELgYheghNU85Q21ERQdkhg_rywFgWtaO5aeREjVR71PiUfFWw@mail.gmail.com>
Here is a quick prototype of how the client/server approach would look like.
The setup code could be structured around a single class PythonElHelper, say.
The class will listen on a socket in a dedicated thread.
I have coded its output as json in order to allow to pass structured
information to the elisp side and easily parse this information as
elisp data with json-read-from-string.
I don't see a need to use a full-fledged http server, although that
could be done with url.el if desired.
The server would provide tooltips for eldoc, documentation for the
help buffer and completions for completion-at-point in a way that
doesn't interfere with history, prompt numbers, block editing, etc.
and doesn't require to deal with the shell input/output.
Do you think this approach is sensible? I'm available for coding this
along the next two months or so.
######################## python server #################
class PythonElServer:
def __init__(self):
# detect python2/3, ipython, readline, set completer, etc
pass
def complete(self, symbol):
return ["a", "b", "c"]
def tooltip(self, symbol):
return "func(a, b, c)"
def documentation(self, symbol):
return "A function that does something"
def serve(self, port):
import socket, json
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('', port))
server.listen(1)
(client, address) = server.accept()
while True:
request = client.recv(1024)
action, symbol = request.split()
response = getattr(self, action)(symbol)
client.send(json.dumps(response))
PythonElServer().serve(9090)
######################## elisp client #################
;; -*- lexical-binding: t -*-
(setq python-shell-server
(open-network-stream "pyserver" "pyserver" "localhost" 9091))
(defun python-shell-server-request (action symbol)
(set-process-filter
python-shell-server
(lambda (proc out)
(let ((response (json-read-from-string out)))
(pcase action
(`complete (python-shell-complete response))
(`tooltip (python-shell-tooltip response))
(`documentation (python-shell-documentation response))))))
(process-send-string python-shell-server
(concat (symbol-name action) " " symbol)))
(defun python-shell-complete (response)
(print (concat "complete: " response)))
(defun python-shell-tooltip (response)
(print (concat "tooltip: " response)))
(defun python-shell-documentation (response)
(print (concat "documentation: " response)))
(python-shell-server-request 'documentation "xxx")
next prev parent reply other threads:[~2015-02-06 2:22 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-03 12:40 bug#19755: python.el: native completion: more problems (and solutions) Carlos Pita
[not found] ` <handler.19755.B.142296725921901.ack@debbugs.gnu.org>
2015-02-03 16:50 ` bug#19755: Acknowledgement (python.el: native completion: more problems (and solutions)) Carlos Pita
2015-02-05 14:25 ` bug#19755: python.el: native completion: more problems (and solutions) Carlos Pita
2015-02-06 2:22 ` Carlos Pita [this message]
2015-04-09 3:55 ` Fabián Ezequiel Gallina
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAELgYhesz6pOS7kPQ79rZi9zKBqcFdTyj7-mLa08FbF2FAshzA@mail.gmail.com \
--to=carlosjosepita@gmail.com \
--cc=19755@debbugs.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.