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

  • 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 7:22

Just select your code and then

C-u M-|   python


C-u M-x shell-command-on-region   python
| improve this answer | |
  • This outputs (Shell command succeeded with no output) unless you add print() around every expression. – ideasman42 Nov 23 '17 at 14:14
  • of course you need to print the result – djangoliv Nov 23 '17 at 14:20
  • Not necessarily, this can be setup so the result is always printed. – ideasman42 Nov 23 '17 at 15:00

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
  "Wrapper for 'shell-command-on-region', re-selecting the output.

Useful when called with a selection, so it can be modified in-place"
  (let ((buffer-size-init (buffer-size)))
     start end command output-buffer replace
     error-buffer display-error-buffer
    (setq deactivate-mark nil)
    (setq end (+ end (- (buffer-size) buffer-size-init)))
    (set-mark start)
    (goto-char end)
    ;; 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"
   "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)
| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.