remove pytools cruft, only print polymode-mode-name-aliases warning once

This commit is contained in:
dickmao 2020-01-23 10:33:05 -05:00
parent 52c7ae1b74
commit f4d6d4e9a8
10 changed files with 73 additions and 384 deletions

View file

@ -21,7 +21,7 @@ endif
.DEFAULT_GOAL := test-compile
README.rst: README.in.rst lisp/ein.el
README.rst: README.in.rst lisp/ein-notebook.el
$(CASK) eval "(progn \
(add-to-list 'load-path \"./lisp\") \
(load \"ein-notebook\") \

View file

@ -117,7 +117,6 @@ Keymap (C-h m)
C-c Prefix Command
C-x Prefix Command
ESC Prefix Command
C-: ein:shared-output-eval-string-km
<C-down> ein:worksheet-goto-next-input-km
<C-up> ein:worksheet-goto-prev-input-km
<M-S-return> ein:worksheet-execute-cell-and-insert-below-km
@ -130,15 +129,13 @@ Keymap (C-h m)
M-RET ein:worksheet-execute-cell-and-goto-next-km
M-, ein:pytools-jump-back-command
M-. ein:pytools-jump-to-source-command
M-n ein:worksheet-next-input-history-km
M-p ein:worksheet-previous-input-history-km
C-c C-a ein:worksheet-insert-cell-above-km
C-c C-b ein:worksheet-insert-cell-below-km
C-c C-c ein:worksheet-execute-cell-km
C-c C-e ein:worksheet-toggle-output-km
C-c C-f ein:file-open-km
C-c C-h ein:pytools-request-tooltip-or-help-km
C-c C-h ein:pytools-request-help-km
C-c C-k ein:worksheet-kill-cell-km
C-c C-l ein:worksheet-clear-output-km
C-c RET ein:worksheet-merge-cell-km
@ -174,8 +171,6 @@ Keymap (C-h m)
C-c C-# ein:notebook-close-km
C-c C-$ ein:tb-show-km
C-c C-' ein:worksheet-turn-on-autoexec-km
C-c C-, ein:pytools-jump-back-command
C-c C-. ein:pytools-jump-to-source-command
C-c C-/ ein:notebook-scratchsheet-open-km
C-c C-; ein:shared-output-show-code-cell-at-point-km
C-c <down> ein:worksheet-move-cell-down-km

View file

@ -307,24 +307,26 @@
(When "^I keep clicking \"\\(.+\\)\" until \"\\(.+\\)\"$"
(lambda (go stop)
(cl-loop repeat 10
until (search stop (buffer-string))
do (And (format "I click on \"%s\"" go))
do (sleep-for 0 1000)
finally do (should (search stop (buffer-string))))))
until (search stop (buffer-string))
do (And (format "I click on \"%s\"" go))
do (sleep-for 0 1000)
finally do (should (search stop (buffer-string))))))
(When "^I click\\( without going top\\)? on \"\\(.+\\)\"$"
(lambda (stay word)
;; from espuds "go to word" without the '\\b's
(unless stay
(goto-char (point-min)))
(let ((search (re-search-forward (format "\\[%s\\]" word) nil t))
(msg "Cannot go to link '%s' in buffer: %s"))
(should search)
(backward-char)
(let ((was (widget-at)))
(When "I press \"RET\"")
(cl-loop until (not (equal was (widget-at)))
do (sleep-for 0 500))))))
(cl-loop repeat 10
for search = (re-search-forward (format "\\[%s\\]" word) nil t)
until search
do (sleep-for 0 1000)
finally do (should search))
(backward-char)
(let ((was (widget-at)))
(When "I press \"RET\"")
(cl-loop until (not (equal was (widget-at)))
do (sleep-for 0 500)))))
(When "^I click on dir \"\\(.+\\)\"$"
(lambda (dir)
@ -499,7 +501,7 @@
(When "I evaluate the python code \"\\(.+\\)\"$"
(lambda (code-str)
(ein:shared-output-eval-string nil code-str nil)))
(ein:shared-output-eval-string nil code-str)))
(When "^text property at point includes \"\\(.+\\)\"$"
(lambda (properties)

View file

@ -182,8 +182,6 @@ a number will limit the number of lines in a cell output."
`(when (slot-boundp ,obj ,slot)
(slot-value ,obj ,slot)))
;;; Utils
(defun ein:make-mm-handle (image)
(let ((mime-type (mailcap-extension-to-mime
(symbol-name (plist-get (cdr image) :type)))))
@ -242,8 +240,6 @@ a number will limit the number of lines in a cell output."
(insert-image image "."))
(error (ein:log 'warn "Could not insert image: %s" (error-message-string err)))))
;;; Cell factory
(defun ein:cell-class-from-type (type)
(ein:case-equal type
(("code") 'ein:codecell)
@ -413,8 +409,6 @@ Return language name as a string or `nil' when not defined.
(cl-defmethod ein:cell-language ((cell ein:htmlcell)) nil "html")
(cl-defmethod ein:cell-language ((cell ein:rawcell)) nil "rst")
;; EWOC
(defun ein:cell-make-element (make-node num-outputs)
(let ((buffer-undo-list t)) ; disable undo recording
(list
@ -633,7 +627,7 @@ Return language name as a string or `nil' when not defined.
(slot-value cell 'element))
(cl-defmethod ein:cell-running-set ((cell ein:codecell) running)
;; FIXME: change the appearance of the cell
"FIXME: change the appearance of the cell"
(setf (slot-value cell 'running) running))
(cl-defmethod ein:cell-set-collapsed ((cell ein:codecell) collapsed)
@ -750,12 +744,10 @@ If END is non-`nil', return the location of next element."
"Return a buffer associated by CELL (if any)."
(ein:aand (ein:oref-safe cell 'ewoc) (ewoc-buffer it)))
;; Data manipulation
(cl-defmethod ein:cell-clear-output ((cell ein:codecell) stdout stderr other)
;; codecell.js in IPython implements it using timeout and callback.
;; As it is unclear why timeout is needed, just clear output
;; instantaneously for now.
"codecell.js in IPython implements it using timeout and callback.
As it is unclear why timeout is needed, just clear output
instantaneously for now."
(ein:log 'debug "cell-clear-output stdout=%s stderr=%s other=%s"
stdout stderr other)
(setf (slot-value cell 'traceback) nil)
@ -810,10 +802,10 @@ If END is non-`nil', return the location of next element."
(intern (format "output-%s" (plist-get json :stream)))))))
(cl-defmethod ein:cell-append-output ((cell ein:codecell) json)
;; When there is a python error, we actually get two identical tracebacks back
;; from the kernel, one from the "shell" channel, and one from the "iopub"
;; channel. As a workaround, we remember the cell's traceback and ignore
;; traceback outputs that are identical to the one we already have.
"When there is a python error, we actually get two identical tracebacks back
from the kernel, one from the \"shell\" channel, and one from the \"iopub\"
channel. As a workaround, we remember the cell's traceback and ignore
traceback outputs that are identical to the one we already have."
(let ((new-tb (plist-get json :traceback))
(old-tb (slot-value cell 'traceback)))
(when (or
@ -938,7 +930,7 @@ Called from ewoc pretty printer via `ein:cell-insert-output'."
(ein:insert-read-only value)))))
(defun ein:cell-append-text (data &rest properties)
;; escape ANSI in plaintext:
"escape ANSI in plaintext:"
(apply #'ein:insert-read-only (ansi-color-apply data) properties))
(defun ein:cell-safe-read-eval-insert (text)
@ -1000,8 +992,6 @@ Called from ewoc pretty printer via `ein:cell-insert-output'."
(when (cl-typep cell 'ein:basecell)
cell))))
;;; Kernel related calls.
(cl-defmethod ein:cell-set-kernel ((cell ein:codecell) kernel)
(setf (slot-value cell 'kernel) kernel))
@ -1043,6 +1033,7 @@ Called from ewoc pretty printer via `ein:cell-insert-output'."
(ein:events-trigger events 'maybe_reset_undo.Worksheet cell)))
(cl-defmethod ein:cell--handle-output ((cell ein:codecell) msg-type content _metadata)
(ein:log 'debug "ein:cell--handle-output (cell ein:codecell): %s" msg-type)
(let ((json `(:output_type ,msg-type)))
(cl-macrolet ((copy-props
(src tgt props)
@ -1070,7 +1061,7 @@ Called from ewoc pretty printer via `ein:cell-insert-output'."
(cl-defmethod ein:cell--handle-clear-output ((cell ein:codecell) content
_metadata)
;; Jupyter messaging spec 5.0 no longer has stdout, stderr, or other fields for clear_output
"Jupyter messaging spec 5.0 no longer has stdout, stderr, or other fields for clear_output"
(ein:cell-clear-output cell
t ;;(plist-get content :stdout)
t ;;(plist-get content :stderr)
@ -1078,8 +1069,6 @@ Called from ewoc pretty printer via `ein:cell-insert-output'."
)
(ein:events-trigger (slot-value cell 'events) 'maybe_reset_undo.Worksheet cell))
;;; Misc.
(cl-defmethod ein:cell-has-image-output-p ((cell ein:codecell))
"Return `t' if given cell has image output, `nil' otherwise."
(seq-some (lambda (out)
@ -1093,9 +1082,9 @@ Called from ewoc pretty printer via `ein:cell-insert-output'."
(cl-defmethod ein:cell-get-tb-data ((cell ein:codecell))
(cl-loop for out in (slot-value cell 'outputs)
when (and (plist-get out :traceback)
(member (plist-get out :output_type) '("pyerr" "error")))
return (plist-get out :traceback)))
when (and (plist-get out :traceback)
(member (plist-get out :output_type) '("pyerr" "error")))
return (plist-get out :traceback)))
(provide 'ein-cell)

View file

@ -669,18 +669,20 @@ Example::
(&key content metadata parent_header header &allow-other-keys)
(ein:json-read-from-string packet)
(let* ((msg-type (plist-get header :msg_type))
(msg-id (plist-get parent_header :msg_id))
(callbacks (ein:kernel-get-callbacks-for-msg kernel msg-id))
(msg-id (plist-get header :msg_id))
(parent-id (plist-get parent_header :msg_id))
(callbacks (ein:kernel-get-callbacks-for-msg kernel parent-id))
(events (ein:$kernel-events kernel)))
(ein:log 'debug "ein:kernel--handle-iopub-reply: msg_type=%s msg_id=%s"
msg-type msg-id)
(ein:log 'debug
"ein:kernel--handle-iopub-reply: msg_type=%s msg_id=%s parent_id=%s"
msg-type msg-id parent-id)
(ein:case-equal msg-type
(("stream" "display_data" "pyout" "pyerr" "error" "execute_result")
(aif (plist-get callbacks :output) ;; ein:cell--handle-output
(ein:funcall-packed it msg-type content metadata)
(ein:log 'warn (concat "ein:kernel--handle-iopub-reply: "
"No :output callback for msg_id=%s")
msg-id)))
"No :output callback for parent_id=%s")
parent-id)))
(("status")
(ein:case-equal (plist-get content :execution_state)
(("busy")
@ -695,8 +697,8 @@ Example::
(aif (plist-get callbacks :clear_output)
(ein:funcall-packed it content metadata)
(ein:log 'info (concat "ein:kernel--handle-iopub-reply: "
"No :clear_output callback for msg_id=%s")
msg-id))))))))
"No :clear_output callback for parent_id=%s")
parent-id))))))))
(defun ein:kernel-filename-to-python (kernel filename)
"See: `ein:filename-to-python'."

View file

@ -149,11 +149,11 @@ Current buffer for these functions is set to the notebook buffer.")
(cond ((ein:$kernelspec-p pre-kernelspec) pre-kernelspec)
((consp pre-kernelspec)
(cl-loop for (name ks) on (ein:need-kernelspecs url-or-port) by 'cddr
when (and (ein:$kernelspec-p ks)
(string= (cdr pre-kernelspec)
(cl-struct-slot-value
'ein:$kernelspec (car pre-kernelspec) ks)))
return ks))
when (and (ein:$kernelspec-p ks)
(string= (cdr pre-kernelspec)
(cl-struct-slot-value
'ein:$kernelspec (car pre-kernelspec) ks)))
return ks))
(t (ein:get-kernelspec url-or-port pre-kernelspec)))))
(apply #'make-ein:$notebook
:url-or-port url-or-port
@ -485,9 +485,6 @@ This is equivalent to do ``C-c`` in the console program."
'ein:notebook-eval-string
'ein:shared-output-eval-string "0.1.2")
;;; Persistence and loading
(defun ein:notebook-set-notebook-name (notebook name)
"Check NAME and change the name of NOTEBOOK to it."
(if (ein:notebook-test-notebook-name name)
@ -1208,7 +1205,7 @@ Tried add-function: the &rest from :around is an emacs-25 compilation issue."
(ein:notebook--define-key map (kbd "C-c <down>") ein:worksheet-move-cell-down)
(ein:notebook--define-key map (kbd "M-<up>") ein:worksheet-move-cell-up)
(ein:notebook--define-key map (kbd "M-<down>") ein:worksheet-move-cell-down)
(ein:notebook--define-key map "\C-c\C-h" ein:pytools-request-tooltip-or-help)
(ein:notebook--define-key map "\C-c\C-h" ein:pytools-request-help)
(ein:notebook--define-key map (kbd "C-c C-$") ein:tb-show)
(ein:notebook--define-key map "\C-c\C-x" nil)
(ein:notebook--define-key map "\C-c\C-x\C-r" ein:notebook-restart-session-command)
@ -1216,15 +1213,12 @@ Tried add-function: the &rest from :around is an emacs-25 compilation issue."
(ein:notebook--define-key map "\C-c\C-z" ein:notebook-kernel-interrupt-command)
(ein:notebook--define-key map "\C-c\C-q" ein:notebook-kill-kernel-then-close-command)
(ein:notebook--define-key map (kbd "C-c C-#") ein:notebook-close)
(ein:notebook--define-key map (kbd "C-:") ein:shared-output-eval-string)
(ein:notebook--define-key map "\C-c\C-f" ein:file-open)
(ein:notebook--define-key map "\C-c\C-o" ein:notebook-open)
(ein:notebook--define-key map "\C-x\C-s" ein:notebook-save-notebook-command)
(ein:notebook--define-key map "\C-x\C-w" ein:notebook-rename-command)
(define-key map "\M-." 'ein:pytools-jump-to-source-command)
(define-key map (kbd "C-c C-.") 'ein:pytools-jump-to-source-command)
(define-key map "\M-," 'ein:pytools-jump-back-command)
(define-key map (kbd "C-c C-,") 'ein:pytools-jump-back-command)
(ein:notebook--define-key map (kbd "C-c C-/") ein:notebook-scratchsheet-open)
;; Worksheets
(ein:notebook--define-key map (kbd "C-c !") ein:worksheet-rename-sheet)
@ -1284,10 +1278,6 @@ Tried add-function: the &rest from :around is an emacs-25 compilation issue."
:active (ein:worksheet-at-codecell-p))
("Execute all"
ein:worksheet-execute-all-cell)
("Turn on auto execution flag" ein:worksheet-turn-on-autoexec
:active (ein:worksheet-at-codecell-p))
("Evaluate code in minibuffer" ein:shared-output-eval-string)
("Toggle instant cell execution mode" ein:iexec-mode)
))
"---"
,@(ein:generate-menu
@ -1305,7 +1295,7 @@ Tried add-function: the &rest from :around is an emacs-25 compilation issue."
"---"
,@(ein:generate-menu
'(("Show object help"
ein:pytools-request-tooltip-or-help)
ein:pytools-request-help)
("Jump to definition" ein:pytools-jump-to-source-command)
("Go back to the previous jump point"
ein:pytools-jump-back-command))))

View file

@ -25,10 +25,6 @@
;;; Code:
;; for `ein:pytools-pandas-to-ses'
(declare-function ses-yank-tsf "ses")
(declare-function ses-command-hook "ses")
(require 'ein-kernel)
(require 'ein-notebook)
@ -50,97 +46,6 @@ If OTHER-WINDOW is non-`nil', open the file in the other window."
(const :tag "No" nil))
:group 'ein)
(defun ein:pytools-setup-hooks (kernel notebook)
(push (cons #'ein:pytools-load-safely kernel)
(ein:$kernel-after-start-hook kernel)))
(defun ein:pytools-load-safely (kernel)
(with-temp-buffer
(let ((pytools-file (format "%s/%s" ein:source-dir "ein_remote_safe.py")))
(insert-file-contents pytools-file)
(ein:kernel-execute
kernel
(buffer-string)))))
(defun ein:pytools-reinject ()
"Re-send ein's pytools code to the current kernel.
If the kernel is reset by the notebook server then it may become
necessary to call this command to ensure pytools continue
working."
(interactive)
(ein:pytools-load-safely (ein:get-kernel-or-error)))
(defun ein:pytools-add-sys-path (kernel)
(ein:kernel-execute
kernel
(format "__import__('sys').path.append('%s')" ein:source-dir)))
(defun ein:set-buffer-file-name (nb msg-type content -not-used-)
(let ((buf (ein:notebook-buffer nb)))
(ein:case-equal msg-type
(("stream" "output")
(with-current-buffer buf
(setq buffer-file-name
(expand-file-name
(format "%s" (ein:$notebook-notebook-name nb))
(plist-get content :text))))))))
(defun ein:pytools-get-notebook-dir (packed)
(multiple-value-bind (kernel notebook) packed
(ein:kernel-execute
kernel
(format "print(__import__('os').getcwd(),end='')")
(list
:output (cons
#'ein:set-buffer-file-name
notebook)))))
;;; Tooltip and help
;; We can probably be more sophisticated than this, but
;; as a hack it will do.
(defun ein:pytools-magic-func-p (fstr)
(string-prefix-p "%" fstr))
(defun ein:pytools-request-tooltip (kernel func)
(interactive (list (ein:get-kernel-or-error)
(ein:object-at-point-or-error)))
(unless (ein:pytools-magic-func-p func)
(if (>= (ein:$kernel-api-version kernel) 3)
(ein:kernel-execute
kernel
(format "__ein_print_object_info_for(%s)" func)
(list
:output (cons
(lambda (name msg-type content -metadata-not-used-)
(ein:case-equal msg-type
(("stream" "display_data")
(ein:pytools-finish-tooltip name (ein:json-read-from-string (or (plist-get content :text) (plist-get (plist-get content :data) :text/plain))) nil))))
func)))
(ein:kernel-object-info-request
kernel func (list :object_info_reply
(cons #'ein:pytools-finish-tooltip nil))))))
(declare-function pos-tip-show "pos-tip")
(declare-function popup-tip "popup")
(defun ein:pytools-finish-tooltip (-ignore- content -metadata-not-used-)
;; See: Tooltip.prototype._show (tooltip.js)
(let ((tooltip (ein:kernel-construct-help-string content))
(defstring (ein:kernel-construct-defstring content))
(name (plist-get content :name)))
(if tooltip
(cond
((and window-system (featurep 'pos-tip))
(pos-tip-show tooltip 'ein:pos-tip-face nil nil 0))
((featurep 'popup)
(popup-tip tooltip))
(t (when (stringp defstring)
(message (ein:trim (ansi-color-apply defstring))))))
(ein:log 'info "no info for %s" name))))
(defun ein:pytools-request-help (kernel func)
(interactive (list (ein:get-kernel-or-error)
(ein:object-at-point-or-error)))
@ -151,18 +56,6 @@ working."
;; not work in silent mode.
:silent nil))
(defun ein:pytools-request-tooltip-or-help (&optional pager)
"Show the help for the object at point using tooltip.
When the prefix argument ``C-u`` is given, open the help in the
pager buffer. You can explicitly specify the object by selecting it."
(interactive "P")
(call-interactively (if pager
#'ein:pytools-request-help
#'ein:pytools-request-tooltip)))
;;; Source jump
(defvar ein:pytools-jump-stack nil)
(defvar ein:pytools-jump-to-source-not-found-regexp
@ -211,40 +104,6 @@ pager buffer. You can explicitly specify the object by selecting it."
#'ein:pytools-jump-to-source-1
(list kernel object other-window notebook)))))
(defun ein:pytools-find-source (kernel object &optional callback)
"Find the file and line where object is defined.
This function mostly exists to support company-mode, but might be
useful for other purposes. If the definition for object can be
found and when callback isort specified, the callback will be
called with a cons of the filename and line number where object
is defined."
(ein:kernel-execute
kernel
(format "__ein_find_source('%s')" object)
(list
:output
(cons
#'ein:pytools-finish-find-source
(list kernel object callback)))))
(defun ein:pytools-finish-find-source (packed msg-type content -ignored-)
(destructuring-bind (kernel object callback) packed
(if (or (string= msg-type "stream")
(string= msg-type "display_data"))
(aif (or (plist-get content :text) (plist-get (plist-get content :data) :text/plain))
(if (string-match ein:pytools-jump-to-source-not-found-regexp it)
(ein:log 'info
"Source of %s not found" object)
(destructuring-bind (filename &optional lineno &rest ignore)
(split-string it "\n")
(if callback
(funcall callback
(cons (ein:kernel-filename-from-python kernel filename)
(string-to-number lineno)))
(cons (ein:kernel-filename-from-python kernel filename)
(string-to-number lineno)))))) ;; FIXME Generator?
(ein:log 'info "Source of %s notebook found" object))))
(defun ein:pytools-jump-to-source-command (&optional other-window)
"Jump to the source code of the object at point.
When the prefix argument ``C-u`` is given, open the source code
@ -282,126 +141,6 @@ given, open the last point in the other window."
'ein:pytools-eval-string-internal
'ein:shared-output-eval-string "0.1.2")
(defun ein:pytools-doctest ()
"Do the doctest of the object at point."
(interactive)
(let ((object (ein:object-at-point)))
(ein:shared-output-eval-string (ein:get-kernel)
(format "__ein_run_docstring_examples(%s)" object)
t)))
(defun ein:pytools-whos ()
"Execute ``%whos`` magic command and popup the result."
(interactive)
(ein:shared-output-eval-string (ein:get-kernel) "%whos" t))
(defun ein:pytools-hierarchy (&optional ask)
"Draw inheritance graph of the class at point.
hierarchymagic_ extension is needed to be installed.
You can explicitly specify the object by selecting it.
.. _hierarchymagic: https://github.com/tkf/ipython-hierarchymagic"
(interactive "P")
(let ((object (ein:object-at-point)))
(when ask
(setq object (read-from-minibuffer "class or object: " object)))
(assert (and object (not (equal object "")))
nil "Object at point not found.")
(ein:shared-output-eval-string (ein:get-kernel) (format "%%hierarchy %s" object) t)))
(defun ein:pytools-pandas-to-ses (dataframe)
"View pandas_ DataFrame in SES_ (Simple Emacs Spreadsheet).
Open a `ses-mode' buffer and import DataFrame object into it.
SES_ is distributed with Emacs since Emacs 22, so you don't need
to install it if you are using newer Emacs.
.. _pandas: http://pandas.pydata.org
.. _SES: http://www.gnu.org/software/emacs/manual/html_node/ses/index.html"
(interactive (list (read-from-minibuffer "pandas DataFrame "
(ein:object-at-point))))
(let ((buffer (get-buffer-create
(generate-new-buffer-name "*ein:ses pandas*"))))
;; fetch TSV (tab separated values) via stdout
(ein:kernel-request-stream
(ein:get-kernel)
(concat dataframe ".to_csv(__import__('sys').stdout, sep='\\t')")
(lambda (tsv buffer)
(with-current-buffer buffer
(cl-flet ((y-or-n-p
(prompt)
(if (string-prefix-p "Yank will insert " prompt)
t
(error "Unexpected prompt: %s" prompt))))
;; Import DataFrame as TSV
(ses-yank-tsf tsv nil))
;; Force SES to update (equivalent to run `post-command-hook').
(ses-command-hook)))
(list buffer))
;; Open `ses-mode' buffer
(with-current-buffer buffer
(ses-mode))
(pop-to-buffer buffer)))
(defun ein:pytools-export-buffer (buffer format)
"Export contents of notebook using nbconvert_ to user-specified format
\(options will depend on the version of nbconvert available\) to a new buffer.
Currently EIN/IPython supports exporting to the following formats:
- HTML
- JSON (this is basically the same as opening the ipynb file in a buffer).
- Latex
- Markdown
- Python
- RST
- Slides
.. _nbconvert: http://ipython.org/ipython-doc/stable/notebook/nbconvert.html"
(interactive (list (read-buffer "Buffer: " (current-buffer) t)
(ein:completing-read "Export format: "
(list "html"
"json"
"latex"
"markdown"
"python"
"rst"
"slides"))))
(let* ((nb (first (ein:notebook-opened-notebooks
#'(lambda (nb)
(equal (buffer-name (ein:notebook-buffer nb))
buffer)))))
(json (json-encode (ein:notebook-to-json nb)))
(name (format "*ein %s export: %s*" format (ein:$notebook-notebook-name nb)))
(buffer (get-buffer-create name)))
(if (equal format "json")
(with-current-buffer buffer
(erase-buffer)
(insert json)
(json-pretty-print (point-min) (point-max)))
(ein:kernel-request-stream
(ein:get-kernel)
(format "__ein_export_nb(r'%s', '%s')"
json
format)
(lambda (export buffer)
(with-current-buffer buffer
(erase-buffer)
(insert export)))
(list buffer)))
(switch-to-buffer buffer)))
;;;; Helper functions for working with matplotlib
(defun ein:pytools-set-figure-size (width height)
"Set the default figure size for matplotlib figures. Works by setting `rcParams['figure.figsize']`."
(interactive "nWidth: \nnHeight: ")
(ein:shared-output-eval-string (ein:get-kernel)
(format "__ein_set_figure_size(%s,%s)" width height)
nil))
(provide 'ein-pytools)
;;; ein-pytools.el ends here

View file

@ -34,13 +34,9 @@
(require 'ein-cell)
;;; Classes and variables
(defclass ein:shared-output-cell (ein:codecell)
((cell-type :initarg :cell-type :initform "shared-output")
;; (element-names :initform (:prompt :output :footer))
(popup :initarg :popup :initform nil :type boolean)
(callback :initarg :callback :initform #'ignore :type function)
(callback-called :initarg :callback-called :initform nil :type boolean))
"A singleton cell to show output from non-notebook buffers.")
@ -55,9 +51,6 @@
(defconst ein:shared-output-buffer-name "*ein:shared-output*")
;;; Cell related
(cl-defmethod ein:cell-insert-prompt ((cell ein:shared-output-cell))
"Insert prompt of the CELL in the buffer.
Called from ewoc pretty printer via `ein:cell-pp'."
@ -68,11 +61,10 @@ Called from ewoc pretty printer via `ein:cell-pp'."
(when (slot-value cell 'autoexec) " %s" ein:cell-autoexec-prompt))
'font-lock-face 'ein:cell-input-prompt))
(cl-defmethod ein:cell-execute ((cell ein:shared-output-cell) kernel code popup
(cl-defmethod ein:cell-execute ((cell ein:shared-output-cell) kernel code
&rest args)
(unless (plist-get args :silent)
(setq args (plist-put args :silent nil)))
(setf (slot-value cell 'popup) popup)
(setf (slot-value cell 'kernel) kernel)
(apply #'ein:cell-execute-internal cell kernel code args))
@ -80,8 +72,6 @@ Called from ewoc pretty printer via `ein:cell-pp'."
msg-type _content _metadata)
(ein:log 'debug
"ein:cell--handle-output (cell ein:shared-output-cell): %s" msg-type)
(when (slot-value cell 'popup)
(pop-to-buffer (ein:shared-output-create-buffer)))
(cl-call-next-method)
(aif (ein:oref-safe cell 'callback)
(progn
@ -194,33 +184,15 @@ See also `ein:cell-max-num-outputs'."
(ein:shared-output-show-code-cell cell)
(error "No code cell at point."))))
(defvar ein:shared-output-eval-string-history nil
"History of the `ein:shared-output-eval-string' prompt.")
;;;###autoload
(defun ein:shared-output-eval-string (kernel code popup &rest args)
"Evaluate a piece of code. Prompt will appear asking the code to run.
This is handy when you want to execute something quickly without
making a cell. If the code outputs something, it will go to the
shared output buffer. You can open the buffer by the command
`ein:shared-output-pop-to-buffer'.
.. ARGS is passed to `ein:kernel-execute'. Unlike `ein:kernel-execute',
`:silent' is `nil' by default."
(interactive
(list nil
(read-string
"IP[y]: "
(when (region-active-p)
(buffer-substring (region-beginning) (region-end)))
'ein:shared-output-eval-string-history)
nil))
(defun ein:shared-output-eval-string (kernel code &rest args)
"Entry to `ein:cell-execute-internal' from the shared output cell."
(unless kernel (setq kernel (ein:get-kernel-or-error)))
(let ((cell (ein:shared-output-get-cell)))
(ein:kernel-when-ready
kernel
(lambda (ready-kernel)
(apply #'ein:cell-execute cell ready-kernel (ein:trim-indent code) popup args)))))
(apply #'ein:cell-execute cell ready-kernel (ein:trim-indent code) args)))))
;;; Generic getter

View file

@ -158,26 +158,20 @@ Based on ob-ipython--configure-kernel."
'ob-ein-default-header-args:ein)
(fset (intern (concat "org-babel-execute:" lang-name))
`(lambda (body params)
"Should get rid of accommodating org-babel-variable-assignments.
We don't test it, and finding a module named ob-LANG-MODE won't work generally,
e.g., ob-c++ is not ob-C.el."
(require (quote ,(intern (format "ob-%s" lang-mode))) nil t)
;; hack because ob-ein loads independently of ein
(custom-set-variables '(python-indent-guess-indent-offset-verbose nil))
(let ((parser
(quote
,(intern (format "org-babel-variable-assignments:%s" lang-mode))))
(expander
(quote
,(intern (format "org-babel-expand-body:%s" lang-mode)))))
,(intern (format "org-babel-variable-assignments:%s" lang-mode)))))
(ob-ein--execute-body
(cond ((fboundp expander)
(funcall (symbol-function expander)
(encode-coding-string body 'utf-8)
params))
((fboundp parser)
(org-babel-expand-body:generic
body params (funcall (symbol-function parser) params)))
(t (ein:log 'verbose "%s: No org-babel-expand-body:%s"
(concat "org-babel-execute:" ,lang-name)
(quote ,lang-mode))
nil))
(if (fboundp parser)
(org-babel-expand-body:generic
body params (funcall (symbol-function parser) params))
body)
params)))))
(defun ob-ein--execute-body (body params)
@ -222,9 +216,8 @@ Based on ob-ipython--configure-kernel."
do (sleep-for 0 interval)
finally return
(if pending
(progn
(ein:log 'error "ob-ein--execute-body: %s timed out" name)
"")
(prog1 ""
(ein:log 'error "ob-ein--execute-body: %s timed out" name))
(ob-ein--process-outputs
(ein:oref-safe (ein:shared-output-get-cell) 'outputs)
processed-params))))
@ -278,7 +271,7 @@ one at a time. Further, we do not order the queued up blocks!"
(deferred:nextc (deferred:wait 1200) self)))))
(deferred:nextc it
(lambda (_x)
(ein:shared-output-eval-string kernel body nil)))))
(ein:shared-output-eval-string kernel body)))))
(defun ob-ein--parse-session (session)
(multiple-value-bind (url-or-port _password) (ein:jupyter-server-conn-info)

View file

@ -173,8 +173,15 @@ TYPE can be 'body, nil."
(mode (pm-get-mode-symbol-from-name what))
(_ (not (equal mode (ein:oref-safe cm 'mode)))))
(when (eq mode 'poly-fallback-mode)
(ein:display-warning
(format "pm:get-span: no major mode for kernelspec language '%s'" what)))
(let ((warning (format (concat "pm-get-span: Add (%s . [mode-prefix]) to "
"polymode-mode-name-aliases")
what)))
(when (or (not (get-buffer "*Warnings*"))
(not (with-current-buffer "*Warnings*"
(save-excursion
(goto-char (point-min))
(re-search-forward (regexp-quote warning) nil t)))))
(ein:display-warning warning))))
(setq result-cm
(cl-loop for ocm in (eieio-oref pm/polymode '-auto-innermodes)
when (equal mode (ein:oref-safe ocm 'mode))