If Emacs crashes while a channel subprocess is still alive, the subprocess is
not cleaned up properly. Fix this by creating a file lock in the parent Emacs
process, then ensure that the file lock exists in the channel subprocess. If it
doesn't exist anymore, the channel subprocess will exit.
Since IDs of requests are generated in the parent Emacs process, there is no
need to pass back the ID of a request from the child process that send
messages.
* Remove field properties when inserting prompts and all other read only
inserts.
* Abstract out the bulk of `jupyter-repl-after-buffer-change` into the new
function `jupyter-repl-insert-continuation-prompts`.
* Add `jupyter-repl-mark-as-cell-code` which sets the `field` property of text
to `cell-code` only if inserted text is part of a code cell. Do this in
`jupyter-repl-after-buffer-change` after inserting continuation prompts.
If we are getting the code of the last cell in the buffer, `forward-line` will
return 0 when attempting to move past the last line of the buffer and `point`
will be at `point-max`.
* Set the lazy highlight limit to only look at the current cell
* Simplify `jupyter-repl-history-next` and `jupyter-repl-history-previous`
* Properly restore isearch state when searching through history
* Add tests for REPL history navigation
When `point` is already at the beginning of the first cell in a REPL buffer,
`jupyter-repl-previous-cell` would say that a motion was performed when in
reality it hadn't.
* Replace `jupyter-repl--insert-prompt` with `jupyter-repl--make-prompt` which
only makes the prompt overlay and adds text properties to the overlayed
character. `jupyter-repl--insert-prompt` would also insert the newline
character for the overlay as well as recenter the overlays. These tasks are
now handled by `jupyter-repl-insert-prompt`.
* Add notes on why an invisible character is inserted along with the prompts.
* `jupyter-repl-cell-code` properly handles invisible characters introduced by
line continuation prompts.
* Don't make the invisible character inserted by continuation prompts
read-only.
* Use a marker to keep track of the end position of the cell when inserting
continuation prompts.
* Guard against searching past boundary when inserting continuation prompts
* Handle the case of no time specification by defaulting to midnight when
decoding time
* Properly handle fractions in `jupyter--decode-time`
* Implement `jupyter--encode-time`
* Consider a time object to be a length 4 list of integers and encode the
object using `jupyter--encode-time` when encoding in `jupyter--encode`
* Add tests for time decoding/encoding
- A `jupyter-org-client` is a subclass of a `jupyter-repl-client` and replaces
the use of callbacks in `org-babel-execute:jupyter` to handle the insertion
of code block results in an `org-mode` buffer. `ob-jupyter.el` now only
contains the integration with `org-babel` and all integration with
`emcacs-jupyter` is placed in `jupyter-org-client.el`
- Introduce `jupyter-org-request`, which inherits all of the field of a
`jupyter-request` and adds the fields necessary for keeping track of the
source code block information a request was generated from during the
lifetime of the request.
- Add the method `jupyter-generate-request` to allow subclasses to initialize
their own request objects with extra fields in addition to those of
`jupyter-request`.
- Add the method `jupyter-drop-request` to allow subclasses to do any cleanup
once a request is complete.
* Use the `target-name` argument in `jupyter-handle-comm-open`
* Remove hard-coded URL format and use the new variable
`jupyter-widgets-url-format` instead
* Add `jupyter-widgets-supported-targets` to explicitly state which widget
targets are supported
* Rename `widget-proc` to `widget-sock` in a `jupyter-widget-client`
* Initialize the widget socket only when opening a valid comm
* Previously it was initialized when the client was initialized, but a client
may not even create any widgets so the widget socket would be unused.
* Use `pcase` in `jupyter-widgets-on-message`
* Update documentation and commentary of `jupyter-widget-client`