isend-mode is an Emacs extension allowing interaction with code interpreters
in ansi-term/term or vterm buffers. Some language-specific modes
(e.g. python.el) already provide similar features; isend-mode does the same
in a language-agnostic way.
The easiest (and recommended) way to get up and running with isend-mode is to
install it through MELPA. If you're not
already using MELPA,
it's quite easy to setup.
Just clone the repository. For example:
git clone https://github.com/ffevotte/isend-mode.el.git /path/to/isend-modeThen, add the following lines in your Emacs initialization file (.emacs or .emacs.d/init.el):
(add-to-list 'load-path "/path/to/isend-mode")
(require 'isend-mode)The following example demonstrates using isend-mode to interact with a shell in an ansi-term
buffer. Please note that any other interpreter could have been used (e.g. python, perl or anything
else) and term would have worked as well.
-
Open an
ansi-termbuffer where the interpeter will live. For example:M-x ansi-term RET /bin/sh RET -
Open a buffer with the code you want to execute, and associate it to the interpreter buffer using the
isend-associatecommand (orisend, which is a shorter alias). For example:M-x isend RET *ansi-term* RET -
Hitting C-RET will send the current line to the interpreter. If a region is active, all lines spanned by the region will be sent (i.e. no line will be only partially sent). Point is then moved to the next non-empty line (but see configuration variable
isend-skip-empty-lines).
-
Interactive demo of a text-based program: you prepare all the commands you want to run in a buffer and interactively send them to the interpreter as if you had typed them.
-
Running interpreted code step by step: this is for example useful if you often run the same list of shell commands but don't want to formally handle all possible errors in a script.
Apart from isend-send, bound by default to C-RET and described
above, isend-mode defines a few other commands that you are free to use
interactively and bind to custom keys:
-
isend-send-buffer: sends the whole buffer. This is functionnally equivalent to callingmark-whole-buffer(C-xh), thenisend-send. -
isend-send-defun: sends the current defun. See the configuration variableisend-mark-defun-functionfor how to mark a function definition. -
isend-display-buffer: display the buffer associated to the current one.
isend-mode can be customized with M-x customize-group RET isend RET
The variables which can be set to customize isend's behaviour are:
-
isend-forward-line: if non-nil (default),isendadvances to the next line after having sent some content using C-RET. -
isend-skip-empty-lines: if non-nil (default),isendwill skip empty lines (i.e. lines containing only whitespace) and position point on the first following non-empty line. Some interpreters (like Python) care about empty lines. In such cases it might be useful to setisend-skip-empty-linesto nil. -
isend-strip-empty-lines: if non-nil,isendwill remove empty (or whitespace-only) lines from the region before sending it to the interpreter. Note that this only works when sending an entire region (as opposed to a single line). -
isend-delete-indentation: if non-nil,isendwill delete indentation from all lines in the region. Note that this only works when sending a region (as opposed to a single line). Relative indentation w.r.t the first line is preserved. This is useful e.g. to send Python blocks outside of their original context. -
isend-end-with-empty-line: if non-nil,isendappends an empty line to regions sent. Note that this only works when sending an entire region (as opposed to a single line). -
isend-bracketed-paste: if non-nil,isenduses bracketed paste. In short, this means it surrounds the contents it sends with escape sequences indicating the underlying process that this content is being pasted. Some interpreters (e.g. the Julia REPL) use this in meaningful ways. -
isend-send-line-functionandisend-send-region-function: if set, these are the functions called byisendto send a line or a region respectively. These functions are called in a buffer containing the text to be sent. They can modify it as needed before it is sent to the process. These functions also receive as argument the destination buffer, in case some interaction with it would be useful.Possible values include:
nil(default): do nothing (the contents will be sent as they are)isend--ipython-paste: copy the contents to the clipoard, and send%pasteto the interpreter buffer (where aniPythonprocess is supposed to be running).isend--ipython-cpaste: wrap the contents within a%cpastecommand (aniPythonprocesses is supposed to be running in the associated buffer).
-
isend-mark-defun: a function that will mark the current "defun" to be sent byisend-send-defun.Possible values include:
mark-defun(default): works for LISP-like languagesisend--python-mark-defun: marks the current top-level block in a python buffer
A few helpers are provided to help setup isend when working with multiple languages:
;; If you work with shell scripts
(add-hook 'isend-mode-hook 'isend-default-shell-setup)
;; If you work with python scripts, one of those could be used (but not both!)
;; - default python interpreter
(add-hook 'isend-mode-hook 'isend-default-python-setup)
;; - specific setup for iPython
(add-hook 'isend-mode-hook 'isend-default-ipython-setup)
;; If you work with julia
(add-hook 'isend-mode-hook 'isend-default-julia-setup)If you make improvements to this code or have suggestions, please do not hesitate to fork the repository or submit bug reports on github. The repository's URL is:
https://github.com/ffevotte/isend-mode.el.git
Many thanks go to the following contributors:
- Soumya Tripathy: vterm support
- James Porter: empty lines handling;
- @albertstartup: handling newer version of iPython.
Copyright (C) 2012-2019 François Févotte.
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.