2022-08-25 15:13:38 +00:00
|
|
|
|
This is with-editor.info, produced by makeinfo version 6.7 from
|
|
|
|
|
with-editor.texi.
|
|
|
|
|
|
2023-07-27 19:52:58 +00:00
|
|
|
|
Copyright (C) 2015-2023 Jonas Bernoulli <jonas@bernoul.li>
|
2022-08-25 15:13:38 +00:00
|
|
|
|
|
|
|
|
|
You can redistribute this document 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 document 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.
|
|
|
|
|
|
|
|
|
|
INFO-DIR-SECTION Emacs
|
|
|
|
|
START-INFO-DIR-ENTRY
|
|
|
|
|
* With-Editor: (with-editor). Using the Emacsclient as $EDITOR.
|
|
|
|
|
END-INFO-DIR-ENTRY
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: with-editor.info, Node: Top, Next: Using the With-Editor package, Up: (dir)
|
|
|
|
|
|
|
|
|
|
With-Editor User Manual
|
|
|
|
|
***********************
|
|
|
|
|
|
|
|
|
|
The library ‘with-editor’ makes it easy to use the Emacsclient as the
|
|
|
|
|
‘$EDITOR’ of child processes, making sure they know how to call home.
|
|
|
|
|
For remote processes a substitute is provided, which communicates with
|
|
|
|
|
Emacs on standard output instead of using a socket as the Emacsclient
|
|
|
|
|
does.
|
|
|
|
|
|
|
|
|
|
This library was written because Magit has to be able to do the above
|
|
|
|
|
to allow the user to edit commit messages gracefully and to edit rebase
|
|
|
|
|
sequences, which wouldn’t be possible at all otherwise.
|
|
|
|
|
|
|
|
|
|
Because other packages can benefit from such functionality, this
|
|
|
|
|
library is made available as a separate package. It also defines some
|
|
|
|
|
additional functionality which makes it useful even for end-users, who
|
|
|
|
|
don’t use Magit or another package which uses it internally.
|
|
|
|
|
|
2023-07-27 19:52:58 +00:00
|
|
|
|
This manual is for With-Editor version 3.3.0.
|
2022-08-25 15:13:38 +00:00
|
|
|
|
|
2023-07-27 19:52:58 +00:00
|
|
|
|
Copyright (C) 2015-2023 Jonas Bernoulli <jonas@bernoul.li>
|
2022-08-25 15:13:38 +00:00
|
|
|
|
|
|
|
|
|
You can redistribute this document 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 document 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.
|
|
|
|
|
|
|
|
|
|
* Menu:
|
|
|
|
|
|
|
|
|
|
* Using the With-Editor package::
|
|
|
|
|
* Using With-Editor as a library::
|
|
|
|
|
* Debugging::
|
|
|
|
|
* Function and Command Index::
|
|
|
|
|
* Variable Index::
|
|
|
|
|
|
|
|
|
|
— The Detailed Node Listing —
|
|
|
|
|
|
|
|
|
|
Using the With-Editor package
|
|
|
|
|
|
|
|
|
|
* Configuring With-Editor::
|
|
|
|
|
* Using With-Editor commands::
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: with-editor.info, Node: Using the With-Editor package, Next: Using With-Editor as a library, Prev: Top, Up: Top
|
|
|
|
|
|
|
|
|
|
1 Using the With-Editor package
|
|
|
|
|
*******************************
|
|
|
|
|
|
|
|
|
|
The ‘With-Editor’ package is used internally by Magit when editing
|
|
|
|
|
commit messages and rebase sequences. It also provides some commands
|
|
|
|
|
and features which are useful by themselves, even if you don’t use
|
|
|
|
|
Magit.
|
|
|
|
|
|
|
|
|
|
For information about using this library in you own package, see
|
|
|
|
|
*note Using With-Editor as a library::.
|
|
|
|
|
|
|
|
|
|
* Menu:
|
|
|
|
|
|
|
|
|
|
* Configuring With-Editor::
|
|
|
|
|
* Using With-Editor commands::
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: with-editor.info, Node: Configuring With-Editor, Next: Using With-Editor commands, Up: Using the With-Editor package
|
|
|
|
|
|
|
|
|
|
1.1 Configuring With-Editor
|
|
|
|
|
===========================
|
|
|
|
|
|
|
|
|
|
With-Editor tries very hard to locate a suitable ‘emacsclient’
|
|
|
|
|
executable, so ideally you should never have to customize the option
|
|
|
|
|
‘with-editor-emacsclient-executable’. When it fails to do so, then the
|
|
|
|
|
most likely reason is that someone found yet another way to package
|
|
|
|
|
Emacs (most likely on macOS) without putting the executable on ‘$PATH’,
|
|
|
|
|
and we have to add another kludge to find it anyway.
|
|
|
|
|
|
|
|
|
|
-- User Option: with-editor-emacsclient-executable
|
|
|
|
|
The ‘emacsclient’ executable used as the editor by child process of
|
|
|
|
|
this Emacs instance. By using this executable, child processes can
|
|
|
|
|
call home to their parent process.
|
|
|
|
|
|
|
|
|
|
This option is automatically set at startup by looking in
|
|
|
|
|
‘exec-path’, and other places where the executable could be
|
|
|
|
|
installed, to find the ‘emacsclient’ executable most suitable for
|
|
|
|
|
the current Emacs instance.
|
|
|
|
|
|
|
|
|
|
You should *not* customize this option permanently. If you have to
|
|
|
|
|
do it, then you should consider that a temporary kludge and inform
|
|
|
|
|
the Magit maintainer as described in *note Debugging::.
|
|
|
|
|
|
|
|
|
|
If With-Editor fails to find a suitable ‘emacsclient’ on you
|
|
|
|
|
system, then this should be fixed for all users at once, by
|
|
|
|
|
teaching ‘with-editor-locate-emacsclient’ how to do so on your
|
|
|
|
|
system and system like yours. Doing it this way has the advantage,
|
|
|
|
|
that you won’t have do it again every time you update Emacs, and
|
|
|
|
|
that other users who have installed Emacs the same way as you have,
|
|
|
|
|
won’t have to go through the same trouble.
|
|
|
|
|
|
|
|
|
|
Note that there also is a nuclear option; setting this variable to
|
|
|
|
|
‘nil’ causes the "sleeping editor" described below to be used even
|
|
|
|
|
for local child processes. Obviously we don’t recommend that you
|
2023-07-27 19:52:58 +00:00
|
|
|
|
use this except in "emergencies", i.e., before we had a change to
|
2022-08-25 15:13:38 +00:00
|
|
|
|
add a kludge appropriate for you setup.
|
|
|
|
|
|
|
|
|
|
-- Function: with-editor-locate-emacsclient
|
|
|
|
|
The function used to set the initial value of the option
|
|
|
|
|
‘with-editor-emacsclient-executable’. There’s a lot of voodoo
|
|
|
|
|
here.
|
|
|
|
|
|
|
|
|
|
The ‘emacsclient’ cannot be used when using Tramp to run a process on
|
|
|
|
|
a remote machine. (Theoretically it could, but that would be hard to
|
|
|
|
|
setup, very fragile, and rather insecure).
|
|
|
|
|
|
|
|
|
|
With-Editor provides an alternative "editor" which can be used by
|
|
|
|
|
remote processes in much the same way as local processes use an
|
|
|
|
|
‘emacsclient’ executable. This alternative is known as the "sleeping
|
|
|
|
|
editor" because it is implemented as a shell script which sleeps until
|
|
|
|
|
it receives a signal.
|
|
|
|
|
|
|
|
|
|
-- User Option: with-editor-sleeping-editor
|
|
|
|
|
The sleeping editor is a shell script used as the editor of child
|
|
|
|
|
processes when the ‘emacsclient’ executable cannot be used.
|
|
|
|
|
|
|
|
|
|
This fallback is used for asynchronous process started inside the
|
|
|
|
|
macro ‘with-editor’, when the process runs on a remote machine or
|
|
|
|
|
for local processes when ‘with-editor-emacsclient-executable’ is
|
|
|
|
|
‘nil’.
|
|
|
|
|
|
|
|
|
|
Where the latter uses a socket to communicate with Emacs’ server,
|
|
|
|
|
this substitute prints edit requests to its standard output on
|
|
|
|
|
which a process filter listens for such requests. As such it is
|
|
|
|
|
not a complete substitute for a proper ‘emacsclient’, it can only
|
|
|
|
|
be used as ‘$EDITOR’ of child process of the current Emacs
|
|
|
|
|
instance.
|
|
|
|
|
|
|
|
|
|
Some shells do not execute traps immediately when waiting for a
|
|
|
|
|
child process, but by default we do use such a blocking child
|
|
|
|
|
process.
|
|
|
|
|
|
2023-07-27 19:52:58 +00:00
|
|
|
|
If you use such a shell (e.g., ‘csh’ on FreeBSD, but not Debian),
|
2022-08-25 15:13:38 +00:00
|
|
|
|
then you have to edit this option. You can either replace ‘sh’
|
|
|
|
|
with ‘bash’ (and install that), or you can use the older, less
|
|
|
|
|
performant implementation:
|
|
|
|
|
|
|
|
|
|
"sh -c '\
|
2023-07-27 19:52:58 +00:00
|
|
|
|
echo \"WITH-EDITOR: $$ OPEN $0$1 IN $(pwd)\"; \
|
2022-08-25 15:13:38 +00:00
|
|
|
|
trap \"exit 0\" USR1; \
|
|
|
|
|
trap \"exit 1\" USR2; \
|
|
|
|
|
while true; do sleep 1; done'"
|
|
|
|
|
|
|
|
|
|
Note that the unit separator character () right after the file name
|
|
|
|
|
($0) is required.
|
|
|
|
|
|
|
|
|
|
Also note that using this alternative implementation leads to a
|
|
|
|
|
delay of up to a second. The delay can be shortened by replacing
|
|
|
|
|
‘sleep 1’ with ‘sleep 0.01’, or if your implementation does not
|
|
|
|
|
support floats, then by using ‘nanosleep’ instead.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: with-editor.info, Node: Using With-Editor commands, Prev: Configuring With-Editor, Up: Using the With-Editor package
|
|
|
|
|
|
|
|
|
|
1.2 Using With-Editor commands
|
|
|
|
|
==============================
|
|
|
|
|
|
|
|
|
|
This section describes how to use the ‘with-editor’ library _outside_ of
|
|
|
|
|
Magit. You don’t need to know any of this just to create commits using
|
|
|
|
|
Magit.
|
|
|
|
|
|
|
|
|
|
The commands ‘with-editor-async-shell-command’ and
|
|
|
|
|
‘with-editor-shell-command’ are intended as drop in replacements for
|
|
|
|
|
‘async-shell-command’ and ‘shell-command’. They automatically export
|
|
|
|
|
‘$EDITOR’ making sure the executed command uses the current Emacs
|
|
|
|
|
instance as "the editor". With a prefix argument these commands prompt
|
|
|
|
|
for an alternative environment variable such as ‘$GIT_EDITOR’.
|
|
|
|
|
|
|
|
|
|
-- Command: with-editor-async-shell-command
|
|
|
|
|
This command is like ‘async-shell-command’, but it runs the shell
|
|
|
|
|
command with the current Emacs instance exported as ‘$EDITOR’.
|
|
|
|
|
|
|
|
|
|
-- Command: with-editor-shell-command
|
|
|
|
|
This command is like ‘shell-command’, but if the shell command ends
|
|
|
|
|
with ‘&’ and is therefore run asynchronously, then the current
|
|
|
|
|
Emacs instance is exported as ‘$EDITOR’.
|
|
|
|
|
|
|
|
|
|
To always use these variants add this to you init file:
|
|
|
|
|
|
|
|
|
|
(define-key (current-global-map)
|
|
|
|
|
[remap async-shell-command] 'with-editor-async-shell-command)
|
|
|
|
|
(define-key (current-global-map)
|
|
|
|
|
[remap shell-command] 'with-editor-shell-command)
|
|
|
|
|
|
|
|
|
|
Alternatively use the global ‘shell-command-with-editor-mode’.
|
|
|
|
|
|
|
|
|
|
-- Variable: shell-command-with-editor-mode
|
|
|
|
|
When this mode is active, then ‘$EDITOR’ is exported whenever
|
|
|
|
|
ultimately ‘shell-command’ is called to asynchronously run some
|
|
|
|
|
shell command. This affects most variants of that command, whether
|
|
|
|
|
they are defined in Emacs or in some third-party package.
|
|
|
|
|
|
|
|
|
|
The command ‘with-editor-export-editor’ exports ‘$EDITOR’ or another
|
|
|
|
|
such environment variable in ‘shell-mode’, ‘eshell-mode’, ‘term-mode’
|
|
|
|
|
and ‘vterm-mode’ buffers. Use this Emacs command before executing a
|
|
|
|
|
shell command which needs the editor set, or always arrange for the
|
|
|
|
|
current Emacs instance to be used as editor by adding it to the
|
|
|
|
|
appropriate mode hooks:
|
|
|
|
|
|
|
|
|
|
(add-hook 'shell-mode-hook 'with-editor-export-editor)
|
|
|
|
|
(add-hook 'eshell-mode-hook 'with-editor-export-editor)
|
|
|
|
|
(add-hook 'term-exec-hook 'with-editor-export-editor)
|
2023-07-27 19:52:58 +00:00
|
|
|
|
(add-hook 'vterm-mode-hook 'with-editor-export-editor)
|
2022-08-25 15:13:38 +00:00
|
|
|
|
|
|
|
|
|
Some variants of this function exist; these two forms are equivalent:
|
|
|
|
|
|
|
|
|
|
(add-hook 'shell-mode-hook
|
|
|
|
|
(apply-partially 'with-editor-export-editor "GIT_EDITOR"))
|
|
|
|
|
(add-hook 'shell-mode-hook 'with-editor-export-git-editor)
|
|
|
|
|
|
|
|
|
|
-- Command: with-editor-export-editor
|
|
|
|
|
When invoked in a ‘shell-mode’, ‘eshell-mode’, ‘term-mode’ or
|
|
|
|
|
‘vterm-mode’ buffer, this command teaches shell commands to use the
|
|
|
|
|
current Emacs instance as the editor, by exporting ‘$EDITOR’.
|
|
|
|
|
|
|
|
|
|
-- Command: with-editor-export-git-editor
|
|
|
|
|
This command is like ‘with-editor-export-editor’ but exports
|
|
|
|
|
‘$GIT_EDITOR’.
|
|
|
|
|
|
|
|
|
|
-- Command: with-editor-export-hg-editor
|
|
|
|
|
This command is like ‘with-editor-export-editor’ but exports
|
|
|
|
|
‘$HG_EDITOR’.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: with-editor.info, Node: Using With-Editor as a library, Next: Debugging, Prev: Using the With-Editor package, Up: Top
|
|
|
|
|
|
|
|
|
|
2 Using With-Editor as a library
|
|
|
|
|
********************************
|
|
|
|
|
|
|
|
|
|
This section describes how to use the ‘with-editor’ library _outside_ of
|
|
|
|
|
Magit to teach another package how to have its child processes call
|
|
|
|
|
home, just like Magit does. You don’t need to know any of this just to
|
|
|
|
|
create commits using Magit. You can also ignore this if you use
|
|
|
|
|
‘with-editor’ outside of Magit, but only as an end-user.
|
|
|
|
|
|
|
|
|
|
For information about interactive use and options that affect both
|
|
|
|
|
interactive and non-interactive use, see *note Using the With-Editor
|
|
|
|
|
package::.
|
|
|
|
|
|
|
|
|
|
-- Macro: with-editor &rest body
|
|
|
|
|
This macro arranges for the ‘emacsclient’ or the sleeping editor to
|
|
|
|
|
be used as the editor of child processes, effectively teaching them
|
|
|
|
|
to call home to the current Emacs instance when they require that
|
|
|
|
|
the user edits a file.
|
|
|
|
|
|
|
|
|
|
This is done by establishing a local binding for
|
|
|
|
|
‘process-environment’ and changing the value of the ‘EDITOR’
|
|
|
|
|
environment variable in that scope. This affects all
|
|
|
|
|
(asynchronous) processes started by forms (dynamically) inside
|
|
|
|
|
BODY.
|
|
|
|
|
|
|
|
|
|
If BODY begins with a literal string, then that variable is set
|
|
|
|
|
instead of ‘EDITOR’.
|
|
|
|
|
|
|
|
|
|
-- Macro: with-editor envvar &rest body
|
|
|
|
|
This macro is like ‘with-editor’ instead that the ENVVAR argument
|
|
|
|
|
is required and that it is evaluated at run-time.
|
|
|
|
|
|
|
|
|
|
-- Function: with-editor-set-process-filter process filter
|
|
|
|
|
This function is like ‘set-process-filter’ but ensures that adding
|
|
|
|
|
the new FILTER does not remove the ‘with-editor-process-filter’.
|
|
|
|
|
This is done by wrapping the two filter functions using a lambda,
|
|
|
|
|
which becomes the actual filter. It calls FILTER first, which may
|
|
|
|
|
or may not insert the text into the PROCESS’s buffer. Then it
|
|
|
|
|
calls ‘with-editor-process-filter’, passing t as
|
|
|
|
|
NO-STANDARD-FILTER.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: with-editor.info, Node: Debugging, Next: Function and Command Index, Prev: Using With-Editor as a library, Up: Top
|
|
|
|
|
|
|
|
|
|
3 Debugging
|
|
|
|
|
***********
|
|
|
|
|
|
|
|
|
|
With-Editor tries very hard to locate a suitable ‘emacsclient’
|
|
|
|
|
executable, and then sets option ‘with-editor-emacsclient-executable’
|
|
|
|
|
accordingly. In very rare cases this fails. When it does fail, then
|
|
|
|
|
the most likely reason is that someone found yet another way to package
|
|
|
|
|
Emacs (most likely on macOS) without putting the executable on ‘$PATH’,
|
|
|
|
|
and we have to add another kludge to find it anyway.
|
|
|
|
|
|
2023-07-27 19:52:58 +00:00
|
|
|
|
If you are having problems using ‘with-editor’, e.g., you cannot
|
2022-08-25 15:13:38 +00:00
|
|
|
|
commit in Magit, then please open a new issue at
|
|
|
|
|
<https://github.com/magit/with-editor/issues> and provide information
|
|
|
|
|
about your Emacs installation. Most importantly how did you install
|
|
|
|
|
Emacs and what is the output of ‘M-x with-editor-debug RET’.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
File: with-editor.info, Node: Function and Command Index, Next: Variable Index, Prev: Debugging, Up: Top
|
|
|
|
|
|
|
|
|
|
Appendix A Function and Command Index
|
|
|
|
|
*************************************
|
|
|
|
|
|
|
|
|
|
|