1

Being more familiar with Python then elisp, I'd like to evaluate the selection as as Python snipped - as a short-cut to opening a calculator or Python prompt and copy-pasting between them.

Is there a convenient way to evaluate the selection as a Python expression?

So I could type for eg 11**13//7 and replace it with 4931816020561

ideasman42
  • 8,375
  • 1
  • 28
  • 105
  • python-mode.el available at Melpa comes with a variable py-return-result-p - when t it stores the result in kill-ring. From there replace an active-region with. – Andreas Röhler Nov 22 '17 at 07:22

2 Answers2

1

Posting own answer which mostly works as I'd like (needed some special consideration for evil mode).

While it works well for basic usage, errors will also replace the selection, ideally a nonzero exit code would display as a message instead of putting the error into the editor.

;; See: https://emacs.stackexchange.com/a/34900/2418
;; Wrapper for 'shell-command-on-region', keeps the selection.
(defun shell-command-on-region-and-select
    (start end command &optional
           output-buffer replace
           error-buffer display-error-buffer
           region-noncontiguous-p)
  "Wrapper for 'shell-command-on-region', re-selecting the output.

Useful when called with a selection, so it can be modified in-place"
  (interactive)
  (let ((buffer-size-init (buffer-size)))
    (shell-command-on-region
     start end command output-buffer replace
     error-buffer display-error-buffer
     region-noncontiguous-p)
    (setq deactivate-mark nil)
    (setq end (+ end (- (buffer-size) buffer-size-init)))
    (set-mark start)
    (goto-char end)
    (activate-mark)
    ;; needed for evil line mode
    (when (string= evil-state "visual")
      (when (eq (evil-visual-type) evil-visual-line)
        (evil-visual-select start end 'line)))))

(defun eval-region-as-py ()
  "Evaluate selection as a python expression, replacing it with the result"
  (interactive)
  (shell-command-on-region-and-select
   (region-beginning)
   (region-end)
   "python -c 'import sys; sys.stdout.write(str((eval(sys.stdin.read()))))'" 0 t))

(define-key evil-visual-state-map (kbd "RET") 'eval-region-as-py)
ideasman42
  • 8,375
  • 1
  • 28
  • 105
1

Just select your code and then

C-u M-|   python

or

C-u M-x shell-command-on-region   python
djangoliv
  • 3,169
  • 16
  • 31