WEBVTT captioned by anush
00:00:00.000 --> 00:00:04.354
Hello, everyone! Welcome to my talk,
00:00:04.454 --> 00:00:07.221
"Getting detached from Emacs".
00:00:07.321 --> 00:00:09.720
When I started to use Emacs,
00:00:09.720 --> 00:00:12.920
I quickly gravitated towards using it
00:00:12.920 --> 00:00:15.000
as much as I could.
00:00:15.000 --> 00:00:17.880
Magit, Org, Dired,
00:00:17.880 --> 00:00:21.360
a lot of new possibilities opened up.
00:00:21.360 --> 00:00:23.280
However, there was a workflow
00:00:23.280 --> 00:00:27.120
that was difficult for me to replace.
00:00:27.120 --> 00:00:30.120
The problem for me was running shell commands
00:00:30.120 --> 00:00:32.560
in sub-processes of Emacs,
00:00:32.560 --> 00:00:34.880
which in some situations led me to stick to
00:00:34.880 --> 00:00:38.000
using an external terminal.
00:00:38.000 --> 00:00:39.588
These situations,
00:00:39.688 --> 00:00:43.254
often revolved around long-running shell commands,
00:00:43.354 --> 00:00:46.054
either on my local machine
00:00:46.154 --> 00:00:48.600
or on a remote host.
00:00:48.600 --> 00:00:50.240
When I was on a remote host,
00:00:50.240 --> 00:00:52.800
I would also rely on using the program tmux
00:00:52.800 --> 00:00:57.280
to be able to detach from the remote process.
00:00:57.280 --> 00:00:59.521
My main concern at the time
00:00:59.621 --> 00:01:01.854
was that I didn't want to having to avoid
00:01:01.954 --> 00:01:03.440
restarting Emacs,
00:01:03.440 --> 00:01:07.800
because I needed to wait for a process to complete.
00:01:07.800 --> 00:01:11.200
However, there was of course a lot of things
00:01:11.200 --> 00:01:15.800
I was missing out on by not using Emacs.
00:01:15.800 --> 00:01:19.760
Therefore, my solution to resolving
00:01:19.760 --> 00:01:22.840
the issue of occasionally having to leave Emacs
00:01:22.840 --> 00:01:26.188
led me down the path of developing the package
00:01:26.188 --> 00:01:28.221
Detached.
00:01:28.321 --> 00:01:31.160
The package allows Emacs to delegate
00:01:31.160 --> 00:01:33.640
the responsibility of creating processes
00:01:33.640 --> 00:01:36.840
to the program dtach.
00:01:36.840 --> 00:01:39.021
It also makes sure to write
00:01:39.121 --> 00:01:44.321
the output of the process to a file,
00:01:44.421 --> 00:01:48.154
which we will see later on how that is being used.
00:01:48.254 --> 00:01:50.800
The package makes Emacs capable of
00:01:50.800 --> 00:01:53.120
attaching to these processes
00:01:53.120 --> 00:01:55.280
as well as managing them.
00:01:55.280 --> 00:01:58.880
In the package, each process is called a session,
00:01:58.880 --> 00:02:01.040
and inside of Emacs that is just
00:02:01.040 --> 00:02:02.560
an object with properties
00:02:02.560 --> 00:02:04.588
such as what command is being run,
00:02:04.688 --> 00:02:06.720
what working directory is used,
00:02:06.720 --> 00:02:10.240
where the output is stored, etc.
00:02:10.240 --> 00:02:12.480
The important aspect is also that
00:02:12.480 --> 00:02:16.840
these objects are being persistent,
00:02:16.840 --> 00:02:20.121
so they are stored over time.
00:02:20.221 --> 00:02:22.920
Today, I'm going to walk you through
00:02:22.920 --> 00:02:26.054
how I use the package and what advantages
00:02:26.154 --> 00:02:30.840
there are of treating processes like text.
00:02:30.840 --> 00:02:35.720
I'm going to start by opening up M-x shell,
00:02:35.720 --> 00:02:40.288
and I will run a command
00:02:40.388 --> 00:02:46.920
to update my package manager.
00:02:46.920 --> 00:02:48.254
Instead of pressing return,
00:02:48.354 --> 00:02:50.240
I'll simply press shift return
00:02:50.240 --> 00:02:52.600
to let Emacs delegate the execution
00:02:52.600 --> 00:02:54.920
to the dtach program.
00:02:54.920 --> 00:02:57.600
Emacs will immediately attach itself to the process,
00:02:57.600 --> 00:03:00.960
and we therefore don't perceive any difference
00:03:00.960 --> 00:03:04.480
from when running the command as a subprocess.
00:03:04.480 --> 00:03:06.488
We now have the option though
00:03:06.588 --> 00:03:09.800
to detach from the session,
00:03:09.800 --> 00:03:12.080
and later on we can of course
00:03:12.080 --> 00:03:17.054
reattach Emacs to the session.
00:03:17.154 --> 00:03:20.421
For me, this addresses the core
00:03:20.521 --> 00:03:23.800
of the problem that I had.
00:03:23.800 --> 00:03:25.040
But let’s see what’s more
00:03:25.040 --> 00:03:30.800
the new workflow inside of Emacs can bring.
00:03:30.800 --> 00:03:35.720
The package supports multiple user interfaces
00:03:35.720 --> 00:03:39.840
such as Eshell and Compile.
00:03:39.840 --> 00:03:43.360
I will therefore switch to the Detached project,
00:03:43.360 --> 00:03:49.440
and I will run the build command that I use.
00:03:49.440 --> 00:03:54.040
I will run it with detached-compile
00:03:54.040 --> 00:03:55.800
with the difference that
00:03:55.800 --> 00:03:59.800
I can detach from the compilation.
00:03:59.800 --> 00:04:05.000
One benefit of this new workflow is that
00:04:05.000 --> 00:04:08.680
I can get a system notification shown up here
00:04:08.680 --> 00:04:10.760
once a session has finished.
00:04:10.760 --> 00:04:15.520
Previously, I was either forced to have
00:04:15.520 --> 00:04:19.040
the terminal open so I could see it or hiding it,
00:04:19.040 --> 00:04:27.754
but then risking having forgotten it.
00:04:27.854 --> 00:04:32.560
How do we then see the output of a session?
00:04:32.560 --> 00:04:36.788
Get the detached-list-sessions command,
00:04:36.888 --> 00:04:42.854
and here we see
00:04:42.954 --> 00:04:45.600
the command that we just built,
00:04:45.600 --> 00:04:48.440
and we see the guix pull with an asterisk
00:04:48.440 --> 00:04:54.480
indicating that it is continuously running.
00:04:54.480 --> 00:05:01.421
If I press enter,
00:05:01.521 --> 00:05:04.440
we will get the output of the session here.
00:05:04.440 --> 00:05:07.200
And since it was run using compile,
00:05:07.200 --> 00:05:11.720
we also have compilation mode enabled here,
00:05:11.720 --> 00:05:14.188
so we could navigate between
00:05:14.288 --> 00:05:17.160
potential warnings or errors.
00:05:17.160 --> 00:05:21.440
And we see that there is a warning here.
00:05:21.440 --> 00:05:26.621
One thing that
00:05:26.721 --> 00:05:28.920
I have prepared here is that
00:05:28.920 --> 00:05:32.240
if I open up the user interface,
00:05:32.240 --> 00:05:35.760
we only see two sessions,
00:05:35.760 --> 00:05:38.988
but that is because we applied a filter here.
00:05:39.088 --> 00:05:43.160
So, we have actually the only sessions
00:05:43.160 --> 00:05:46.000
that are created within the last 12 hours
00:05:46.000 --> 00:05:47.360
and that are considered unique.
00:05:47.360 --> 00:05:50.600
So, if I remove the uniqueness,
00:05:50.600 --> 00:05:57.040
we also see that we have a previous build
00:05:57.040 --> 00:05:59.280
running on the main branch.
00:05:59.280 --> 00:06:02.760
So, I think that's typically normal
00:06:02.760 --> 00:06:07.080
that you might have that.
00:06:07.080 --> 00:06:10.920
And since the sessions can be considered text,
00:06:10.920 --> 00:06:14.760
we can just mark these two and check,
00:06:14.760 --> 00:06:18.880
does this warning exist on the main branch or not?
00:06:18.880 --> 00:06:22.720
So, we can just diff these ones
00:06:22.720 --> 00:06:27.454
and we see that the warning is only present
00:06:27.554 --> 00:06:34.040
on the emacsconf branch.
00:06:34.040 --> 00:06:37.520
Now, another benefit, in my opinion,
00:06:37.520 --> 00:06:41.840
of the new way of working is that
00:06:41.840 --> 00:06:43.240
I have these properties being displayed
00:06:43.240 --> 00:06:45.321
in the user interface.
00:06:45.421 --> 00:06:48.960
I can quickly see which commands are still running,
00:06:48.960 --> 00:06:51.360
what hosts they are running on,
00:06:51.360 --> 00:06:53.388
where they are running,
00:06:53.488 --> 00:06:58.121
and for how long they have been running.
00:06:58.221 --> 00:07:00.321
And if they have run,
00:07:00.421 --> 00:07:04.421
how long did it take?
00:07:04.521 --> 00:07:06.880
Occasionally, though, there might be
00:07:06.880 --> 00:07:16.880
even more input needed to distinguish sessions.
00:07:16.880 --> 00:07:19.600
So, what I typically do then is
00:07:19.600 --> 00:07:22.200
press A to annotate the session,
00:07:22.200 --> 00:07:28.988
I would add a "Warning found at emacsconf"
00:07:29.088 --> 00:07:32.854
And then it will show up this annotation
00:07:32.954 --> 00:07:44.988
in the echo area when I select the session.
00:07:45.088 --> 00:07:48.080
Another great improvement of using these sessions
00:07:48.080 --> 00:07:52.640
and consider them being text is,
00:07:52.640 --> 00:07:57.321
now we also see the guix pull completed here.
00:07:57.421 --> 00:08:00.921
Then we can also select and see that, okay,
00:08:01.021 --> 00:08:08.600
there is a lot of updates in this command,
00:08:08.600 --> 00:08:10.160
but let's not look at it now.
00:08:10.160 --> 00:08:17.554
Let's instead remember that
00:08:17.654 --> 00:08:19.840
previously last week
00:08:19.840 --> 00:08:21.640
when I ran a guix pull,
00:08:21.640 --> 00:08:27.680
I saw an Emacs package that looks interesting.
00:08:27.680 --> 00:08:30.040
I rather don't remember its full name,
00:08:30.040 --> 00:08:32.720
but it has something to do with collection.
00:08:32.720 --> 00:08:38.840
So, what I then can do is
00:08:38.840 --> 00:08:42.280
remove the 12 hour narrowing criteria,
00:08:42.280 --> 00:08:47.680
and we can see here I got sessions ranging back
00:08:47.680 --> 00:08:51.040
even to 28th of October.
00:08:51.040 --> 00:08:55.600
Since these are just to be considered text,
00:08:55.600 --> 00:08:58.654
I can--
00:08:58.754 --> 00:09:00.320
now let's first narrow the sessions
00:09:00.320 --> 00:09:05.188
to only show the ones that run guix pull.
00:09:05.288 --> 00:09:08.440
Then I would narrow based on the output
00:09:08.440 --> 00:09:11.280
containing a regular expression.
00:09:11.280 --> 00:09:14.400
So, I remember it was something with collection.
00:09:14.400 --> 00:09:19.988
And we got one hit.
00:09:20.088 --> 00:09:24.088
Here it should be something with collection.
00:09:24.188 --> 00:09:29.521
It was emacs-flymake-collection.
00:09:29.621 --> 00:09:34.721
This is something that is a
00:09:34.821 --> 00:09:38.400
very nice feature to have.
00:09:38.400 --> 00:09:42.160
It doesn't create any overhead
00:09:42.160 --> 00:09:45.280
of having these old sessions lying around
00:09:45.280 --> 00:09:47.400
and occasionally, it can be interesting
00:09:47.400 --> 00:09:49.680
to search through them as well.
00:09:49.680 --> 00:09:55.000
So, for me, this is another example of
00:09:55.000 --> 00:09:59.954
when bringing workflows into Emacs,
00:10:00.054 --> 00:10:05.021
it often opens up new exciting possibilities.
00:10:05.121 --> 00:10:10.760
Thanks a lot for listening.