summaryrefslogtreecommitdiffstats
path: root/2024/info/shell-after.md
blob: 024d24883993d69eb20845ad28fb2c46405e8bd1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
<!-- Automatically generated by emacsconf-publish-after-page -->


<div class="transcript transcript-mainVideo"><a name="shell-mainVideo-transcript"></a><h1>Transcript</h1>


<div class="transcript-heading">[[!template new="1" text="""Introduction""" start="00:00:02.940" video="mainVideo-shell" id="subtitle"]]</div>[[!template text="""Welcome to Emacs as a Shell, a talk by Christopher Howard for""" start="00:00:02.940" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Emacs Conference 2024.""" start="00:00:08.720" video="mainVideo-shell" id="subtitle"]]
[[!template text="""In this talk, I would like to explore, or advocate for, a""" start="00:00:13.800" video="mainVideo-shell" id="subtitle"]]
[[!template text="""particular perspective. I want to encourage people to""" start="00:00:18.400" video="mainVideo-shell" id="subtitle"]]
[[!template text="""think of Emacs not as simply an editor or a development""" start="00:00:21.920" video="mainVideo-shell" id="subtitle"]]
[[!template text="""environment, but rather as a shell, or at least something""" start="00:00:26.480" video="mainVideo-shell" id="subtitle"]]
[[!template text="""that allows us to do most of the things that we might""" start="00:00:31.120" video="mainVideo-shell" id="subtitle"]]
[[!template text="""otherwise want to do from a shell.""" start="00:00:33.920" video="mainVideo-shell" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""What do I mean by shell?""" start="00:00:37.881" video="mainVideo-shell" id="subtitle"]]</div>[[!template text="""What do I mean by shell? By""" start="00:00:37.881" video="mainVideo-shell" id="subtitle"]]
[[!template text="""shell, I mean basically an interface that allows us to""" start="00:00:40.840" video="mainVideo-shell" id="subtitle"]]
[[!template text="""interact with the rest of our system by entering commands.""" start="00:00:45.440" video="mainVideo-shell" id="subtitle"]]
[[!template text="""That definition is, perhaps, a little too broad, and so I""" start="00:00:50.680" video="mainVideo-shell" id="subtitle"]]
[[!template text="""will try to narrow it down with a list of features that,""" start="00:00:55.040" video="mainVideo-shell" id="subtitle"]]
[[!template text="""historically, we have come to expect from a shell. The Bash""" start="00:00:58.440" video="mainVideo-shell" id="subtitle"]]
[[!template text="""shell is one very portable and well-known shell, and for""" start="00:01:03.280" video="mainVideo-shell" id="subtitle"]]
[[!template text="""many of us it is maybe the prototypical example. But in the""" start="00:01:07.720" video="mainVideo-shell" id="subtitle"]]
[[!template text="""past there have been many other shells, and there are other""" start="00:01:13.600" video="mainVideo-shell" id="subtitle"]]
[[!template text="""shells available today. If we are willing to be flexible in""" start="00:01:16.880" video="mainVideo-shell" id="subtitle"]]
[[!template text="""our thinking, we can think of Emacs as being a shell, or at""" start="00:01:21.120" video="mainVideo-shell" id="subtitle"]]
[[!template text="""least providing most of the functionality that we expect""" start="00:01:25.560" video="mainVideo-shell" id="subtitle"]]
[[!template text="""from a shell.""" start="00:01:28.880" video="mainVideo-shell" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""What I do not mean""" start="00:01:38.560" video="mainVideo-shell" id="subtitle"]]</div>[[!template text="""Before further expanding on this idea, I must emphasize""" start="00:01:38.560" video="mainVideo-shell" id="subtitle"]]
[[!template text="""what I do not mean. First of all, I am not talking about""" start="00:01:42.760" video="mainVideo-shell" id="subtitle"]]
[[!template text="""running Bash, or some other external shell, from within""" start="00:01:47.160" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Emacs, although this is certainly possible. I am arguing,""" start="00:01:51.440" video="mainVideo-shell" id="subtitle"]]
[[!template text="""rather, for using Emacs as a shell, instead of other shells.""" start="00:01:56.440" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Second, I do not mean running a terminal emulator from""" start="00:02:02.440" video="mainVideo-shell" id="subtitle"]]
[[!template text="""within Emacs. Emacs has a built-in terminal emulator, but""" start="00:02:06.240" video="mainVideo-shell" id="subtitle"]]
[[!template text="""this is not what I mean. A terminal emulator is essentially a""" start="00:02:11.400" video="mainVideo-shell" id="subtitle"]]
[[!template text="""program designed to control the cursor and text appearance""" start="00:02:15.840" video="mainVideo-shell" id="subtitle"]]
[[!template text="""in response to various control codes in order to mimic a""" start="00:02:20.040" video="mainVideo-shell" id="subtitle"]]
[[!template text="""terminal display device. There are certainly legitimate""" start="00:02:24.000" video="mainVideo-shell" id="subtitle"]]
[[!template text="""reasons to do this. Nevertheless, in general, it does not""" start="00:02:28.440" video="mainVideo-shell" id="subtitle"]]
[[!template text="""make much sense to run a terminal emulator within Emacs,""" start="00:02:32.560" video="mainVideo-shell" id="subtitle"]]
[[!template text="""because Emacs has its own commands for controlling the""" start="00:02:36.520" video="mainVideo-shell" id="subtitle"]]
[[!template text="""cursor and text appearance. Also, due to the way Emacs was""" start="00:02:39.720" video="mainVideo-shell" id="subtitle"]]
[[!template text="""designed historically, Emacs itself believes that it is""" start="00:02:45.040" video="mainVideo-shell" id="subtitle"]]
[[!template text="""running on a terminal. So you end up with layers upon layers""" start="00:02:48.920" video="mainVideo-shell" id="subtitle"]]
[[!template text="""of terminal emulation. Anyhow, at the end of the day, Emacs""" start="00:02:53.120" video="mainVideo-shell" id="subtitle"]]
[[!template text="""will not perform as well as a dedicated terminal emulator""" start="00:02:58.200" video="mainVideo-shell" id="subtitle"]]
[[!template text="""program. I also think that, as we try to force ANSI terminal""" start="00:03:01.840" video="mainVideo-shell" id="subtitle"]]
[[!template text="""emulation into our Emacs workflow, this ultimately will be""" start="00:03:08.080" video="mainVideo-shell" id="subtitle"]]
[[!template text="""a hindrance to us in taking advantage of the natural and""" start="00:03:12.360" video="mainVideo-shell" id="subtitle"]]
[[!template text="""pleasant interfaces that are already available to us""" start="00:03:15.880" video="mainVideo-shell" id="subtitle"]]
[[!template text="""within Emacs. In brief, if your goal is simply to figure out""" start="00:03:19.320" video="mainVideo-shell" id="subtitle"]]
[[!template text="""how to be able to do all your normal Bash command line""" start="00:03:25.000" video="mainVideo-shell" id="subtitle"]]
[[!template text="""wizardry from within an Emacs window instead of a GNOME""" start="00:03:28.500" video="mainVideo-shell" id="subtitle"]]
[[!template text="""console window, you are headed down a different set of train""" start="00:03:32.360" video="mainVideo-shell" id="subtitle"]]
[[!template text="""tracks than I am. Also, something which I fear may confuse""" start="00:03:36.480" video="mainVideo-shell" id="subtitle"]]
[[!template text="""the issue for some viewers is the fact that Emacs ships with""" start="00:03:43.200" video="mainVideo-shell" id="subtitle"]]
[[!template text="""its own unique built-in shell, called the Emacs shell, or""" start="00:03:47.920" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Eshell.""" start="00:03:52.840" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Eshell aims to be a legitimate shell, and provides a very""" start="00:03:59.080" video="mainVideo-shell" id="subtitle"]]
[[!template text="""similar experience to other shells like Bash, while being""" start="00:04:02.960" video="mainVideo-shell" id="subtitle"]]
[[!template text="""well integrated into the Emacs interface, and without""" start="00:04:07.600" video="mainVideo-shell" id="subtitle"]]
[[!template text="""giving up the power of the Emacs Lisp engine. Eshell will be""" start="00:04:11.120" video="mainVideo-shell" id="subtitle"]]
[[!template text="""mentioned multiple times in this talk. The entire talk""" start="00:04:15.640" video="mainVideo-shell" id="subtitle"]]
[[!template text="""could, in fact, be about Eshell, except that I want the talk""" start="00:04:19.140" video="mainVideo-shell" id="subtitle"]]
[[!template text="""to cover all aspects of Emacs shell-like functionality""" start="00:04:24.180" video="mainVideo-shell" id="subtitle"]]
[[!template text="""through its other tools, such as interactive commands and""" start="00:04:28.320" video="mainVideo-shell" id="subtitle"]]
[[!template text="""special modes. So, hopefully we can keep distinct in our""" start="00:04:32.080" video="mainVideo-shell" id="subtitle"]]
[[!template text="""mind the ideas of Emacs as a shell versus the Emacs shell,""" start="00:04:37.080" video="mainVideo-shell" id="subtitle"]]
[[!template text="""though the latter is an important part of the former.""" start="00:04:43.880" video="mainVideo-shell" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""What is a shell?""" start="00:04:50.160" video="mainVideo-shell" id="subtitle"]]</div>[[!template text="""Let's get back to the fundamental idea of what is a shell. In""" start="00:04:50.160" video="mainVideo-shell" id="subtitle"]]
[[!template text="""the broadest definition, a shell is an interface which""" start="00:04:55.400" video="mainVideo-shell" id="subtitle"]]
[[!template text="""allows you to interact with your operating system through""" start="00:04:59.160" video="mainVideo-shell" id="subtitle"]]
[[!template text="""commands. However, from a historical perspective, there""" start="00:05:02.280" video="mainVideo-shell" id="subtitle"]]
[[!template text="""are a few basic capabilities which we expect to be part of""" start="00:05:06.841" video="mainVideo-shell" id="subtitle"]]
[[!template text="""every shell.""" start="00:05:10.700" video="mainVideo-shell" id="subtitle"]]
[[!template text="""First of all, the shell provides a means of launching""" start="00:05:17.881" video="mainVideo-shell" id="subtitle"]]
[[!template text="""external programs. Some internal or built-in commands""" start="00:05:21.421" video="mainVideo-shell" id="subtitle"]]
[[!template text="""might also be made available. Second, the shell provides a""" start="00:05:26.441" video="mainVideo-shell" id="subtitle"]]
[[!template text="""means of managing environment variables. In the past,""" start="00:05:31.680" video="mainVideo-shell" id="subtitle"]]
[[!template text="""environment variables often played a critical role as a""" start="00:05:36.821" video="mainVideo-shell" id="subtitle"]]
[[!template text="""means of passing in options, file names, device names, and""" start="00:05:40.581" video="mainVideo-shell" id="subtitle"]]
[[!template text="""suchlike to external programs. This is not quite as common""" start="00:05:45.361" video="mainVideo-shell" id="subtitle"]]
[[!template text="""today, but the environment still plays a critical role in""" start="00:05:50.120" video="mainVideo-shell" id="subtitle"]]
[[!template text="""managing things such as the path to executables and""" start="00:05:54.081" video="mainVideo-shell" id="subtitle"]]
[[!template text="""libraries, as well as various other user, desktop, and""" start="00:05:57.620" video="mainVideo-shell" id="subtitle"]]
[[!template text="""system settings. The shell modifies the environment and""" start="00:06:03.081" video="mainVideo-shell" id="subtitle"]]
[[!template text="""passes it on to external programs.""" start="00:06:08.281" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Historically, job control was expected to be either a""" start="00:06:13.540" video="mainVideo-shell" id="subtitle"]]
[[!template text="""function of the shell, or easily accessible from it.""" start="00:06:17.581" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Usually today, our personal computing is not""" start="00:06:21.561" video="mainVideo-shell" id="subtitle"]]
[[!template text="""batch-oriented. But typically, shells can run multiple""" start="00:06:24.020" video="mainVideo-shell" id="subtitle"]]
[[!template text="""processes simultaneously, as well as provide means to""" start="00:06:29.281" video="mainVideo-shell" id="subtitle"]]
[[!template text="""suspend and terminate processes, which are useful""" start="00:06:34.600" video="mainVideo-shell" id="subtitle"]]
[[!template text="""features. Shells should be able to redirect and pipeline""" start="00:06:38.781" video="mainVideo-shell" id="subtitle"]]
[[!template text="""process input and output. This allows the user to connect""" start="00:06:44.881" video="mainVideo-shell" id="subtitle"]]
[[!template text="""process input and output with files, devices, or other""" start="00:06:49.101" video="mainVideo-shell" id="subtitle"]]
[[!template text="""processes. Finally, shells are expected to have some""" start="00:06:53.881" video="mainVideo-shell" id="subtitle"]]
[[!template text="""limited scripting capability, such as the""" start="00:06:58.814" video="mainVideo-shell" id="subtitle"]]
[[!template text="""POSIX-compliant set of program statements and""" start="00:07:02.381" video="mainVideo-shell" id="subtitle"]]
[[!template text="""conditionals that Bash provides.""" start="00:07:06.614" video="mainVideo-shell" id="subtitle"]]
[[!template text="""As command-line wizards, there are a number of tasks we""" start="00:07:11.100" video="mainVideo-shell" id="subtitle"]]
[[!template text="""expect to be able to do quickly and easily from our shell,""" start="00:07:15.114" video="mainVideo-shell" id="subtitle"]]
[[!template text="""even though these tasks are not the domain of the shell""" start="00:07:18.660" video="mainVideo-shell" id="subtitle"]]
[[!template text="""itself. A common task is file management and navigation. We""" start="00:07:21.647" video="mainVideo-shell" id="subtitle"]]
[[!template text="""quickly navigate and manipulate the file system with""" start="00:07:27.881" video="mainVideo-shell" id="subtitle"]]
[[!template text="""standard utilities that do things like change the current""" start="00:07:31.114" video="mainVideo-shell" id="subtitle"]]
[[!template text="""working directory, rename files, move files, and delete""" start="00:07:34.814" video="mainVideo-shell" id="subtitle"]]
[[!template text="""files. We usually expect to have access to some additional""" start="00:07:39.381" video="mainVideo-shell" id="subtitle"]]
[[!template text="""process management utilities. These allow us to do things""" start="00:07:44.147" video="mainVideo-shell" id="subtitle"]]
[[!template text="""such as find out the status of all processes running on the""" start="00:07:48.381" video="mainVideo-shell" id="subtitle"]]
[[!template text="""system, and send signals to processes. Finally, we expect""" start="00:07:51.781" video="mainVideo-shell" id="subtitle"]]
[[!template text="""to have access to some basic networking utilities. For""" start="00:07:57.981" video="mainVideo-shell" id="subtitle"]]
[[!template text="""example, we should be able to run commands that set up""" start="00:08:02.114" video="mainVideo-shell" id="subtitle"]]
[[!template text="""network interfaces, ping computers, and download files.""" start="00:08:05.414" video="mainVideo-shell" id="subtitle"]]
[[!template text="""With a little reflection, we can see that Emacs can provide""" start="00:08:09.514" video="mainVideo-shell" id="subtitle"]]
[[!template text="""all or nearly all of the functionality we have described so""" start="00:08:16.081" video="mainVideo-shell" id="subtitle"]]
[[!template text="""far. And the functionality can be called conveniently""" start="00:08:20.147" video="mainVideo-shell" id="subtitle"]]
[[!template text="""through one of several methods.""" start="00:08:24.047" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Either a normal interactive call, like M-x something, or a""" start="00:08:33.520" video="mainVideo-shell" id="subtitle"]]
[[!template text="""call to an elisp function,""" start="00:08:43.847" video="mainVideo-shell" id="subtitle"]]
[[!template text="""or through Eshell commands, or through some special buffer""" start="00:08:53.620" video="mainVideo-shell" id="subtitle"]]
[[!template text="""mode, such as the directory editor, which provides its own""" start="00:09:01.181" video="mainVideo-shell" id="subtitle"]]
[[!template text="""interface to some functionality.""" start="00:09:06.947" video="mainVideo-shell" id="subtitle"]]
[[!template text="""It may be going too far to say that Emacs is a full replacement""" start="00:09:09.414" video="mainVideo-shell" id="subtitle"]]
[[!template text="""for shells like Bash. Nevertheless, we can see that Emacs""" start="00:09:17.414" video="mainVideo-shell" id="subtitle"]]
[[!template text="""can do most of the things that we might otherwise do with our""" start="00:09:21.714" video="mainVideo-shell" id="subtitle"]]
[[!template text="""shell.""" start="00:09:25.681" video="mainVideo-shell" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Launching external processes""" start="00:09:26.912" video="mainVideo-shell" id="subtitle"]]</div>[[!template text="""Let us give some examples. First, can Emacs launch""" start="00:09:26.912" video="mainVideo-shell" id="subtitle"]]
[[!template text="""external commands? Of course. Now, there are something""" start="00:09:32.514" video="mainVideo-shell" id="subtitle"]]
[[!template text="""like a half-dozen different ways to do that within Emacs, and""" start="00:09:36.681" video="mainVideo-shell" id="subtitle"]]
[[!template text="""some are more convenient than others. From any Elisp""" start="00:09:40.447" video="mainVideo-shell" id="subtitle"]]
[[!template text="""program, we can call functions like make-process and""" start="00:09:46.714" video="mainVideo-shell" id="subtitle"]]
[[!template text="""call-process to launch external processes.""" start="00:09:50.781" video="mainVideo-shell" id="subtitle"]]
[[!template text="""These, however, generally are not convenient for quick,""" start="00:10:12.460" video="mainVideo-shell" id="subtitle"]]
[[!template text="""one-off commands. Another option would be to run Eshell,""" start="00:10:16.847" video="mainVideo-shell" id="subtitle"]]
[[!template text="""which would allow us to call the external program from a""" start="00:10:22.381" video="mainVideo-shell" id="subtitle"]]
[[!template text="""familiar command line prompt.""" start="00:10:26.581" video="mainVideo-shell" id="subtitle"]]
[[!template text="""If we do not actually want to drop into Eshell just to run one""" start="00:10:34.160" video="mainVideo-shell" id="subtitle"]]
[[!template text="""command, we also have the interactive command,""" start="00:10:38.881" video="mainVideo-shell" id="subtitle"]]
[[!template text="""eshell-command,""" start="00:10:42.214" video="mainVideo-shell" id="subtitle"]]
[[!template text="""which would allow us to call the external program from a""" start="00:10:52.420" video="mainVideo-shell" id="subtitle"]]
[[!template text="""familiar command line prompt.""" start="00:10:56.747" video="mainVideo-shell" id="subtitle"]]
[[!template text="""If we do not actually want to drop an""" start="00:11:09.940" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Eshell just to run one command, as I just mentioned, we also""" start="00:11:12.081" video="mainVideo-shell" id="subtitle"]]
[[!template text="""have the interactive command eshell-command, which allows""" start="00:11:15.700" video="mainVideo-shell" id="subtitle"]]
[[!template text="""us to enter in a one-off command and run that immediately.""" start="00:11:19.800" video="mainVideo-shell" id="subtitle"]]
[[!template text="""And finally, there is also an interactive command called""" start="00:11:25.420" video="mainVideo-shell" id="subtitle"]]
[[!template text="""simply shell-command.""" start="00:11:28.800" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Shell command is like Eshell command, but instead passes""" start="00:11:34.600" video="mainVideo-shell" id="subtitle"]]
[[!template text="""the command off to our system shell, for example, bash.""" start="00:11:39.100" video="mainVideo-shell" id="subtitle"]]
[[!template text="""This is cheating, of course, but it might be useful or convenient""" start="00:11:43.940" video="mainVideo-shell" id="subtitle"]]
[[!template text="""in some scenarios.""" start="00:11:48.600" video="mainVideo-shell" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Environment variables""" start="00:11:57.300" video="mainVideo-shell" id="subtitle"]]</div>[[!template text="""Regarding environment variables, Emacs can read and""" start="00:11:57.300" video="mainVideo-shell" id="subtitle"]]
[[!template text="""manipulate the environment variables, which in turn get""" start="00:12:01.900" video="mainVideo-shell" id="subtitle"]]
[[!template text="""passed on to processes which it launches. The""" start="00:12:05.400" video="mainVideo-shell" id="subtitle"]]
[[!template text="""general-purpose interactive commands for this are""" start="00:12:09.660" video="mainVideo-shell" id="subtitle"]]
[[!template text="""getenv and setenv. These commands""" start="00:12:12.900" video="mainVideo-shell" id="subtitle"]]
[[!template text="""deal with the one environment that is available throughout""" start="00:12:18.500" video="mainVideo-shell" id="subtitle"]]
[[!template text="""all parts of your running Emacs session. In other words,""" start="00:12:21.800" video="mainVideo-shell" id="subtitle"]]
[[!template text="""these functions deal with a global environment, which is""" start="00:12:25.700" video="mainVideo-shell" id="subtitle"]]
[[!template text="""the same wherever you are running getenv or""" start="00:12:29.000" video="mainVideo-shell" id="subtitle"]]
[[!template text="""setenv.""" start="00:12:32.100" video="mainVideo-shell" id="subtitle"]]
[[!template text="""An important exception is that every instance of Eshell""" start="00:13:00.340" video="mainVideo-shell" id="subtitle"]]
[[!template text="""maintains a distinct environment that will not be affected""" start="00:13:04.260" video="mainVideo-shell" id="subtitle"]]
[[!template text="""by setenv calls run in other buffers. Also, Eshell""" start="00:13:07.600" video="mainVideo-shell" id="subtitle"]]
[[!template text="""has some additional syntax for dealing with its""" start="00:13:13.981" video="mainVideo-shell" id="subtitle"]]
[[!template text="""environment, including the set and export syntax.""" start="00:13:16.447" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Regarding job control and process management, Emacs does""" start="00:13:38.647" video="mainVideo-shell" id="subtitle"]]
[[!template text="""not provide job control in the way that Bash users are used""" start="00:13:47.114" video="mainVideo-shell" id="subtitle"]]
[[!template text="""to. We can, however, launch asynchronous processes, and do""" start="00:13:50.881" video="mainVideo-shell" id="subtitle"]]
[[!template text="""various things to them. From Eshell, or an eshell-command""" start="00:13:57.081" video="mainVideo-shell" id="subtitle"]]
[[!template text="""call, we can append the ampersand symbol to the command, and""" start="00:14:01.581" video="mainVideo-shell" id="subtitle"]]
[[!template text="""this will cause the process to run asynchronously in a""" start="00:14:07.181" video="mainVideo-shell" id="subtitle"]]
[[!template text="""dedicated buffer.""" start="00:14:11.014" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Now, if the command is launched from Eshell, it will not""" start="00:14:20.881" video="mainVideo-shell" id="subtitle"]]
[[!template text="""actually run in a separate buffer, but the output will go to""" start="00:14:25.281" video="mainVideo-shell" id="subtitle"]]
[[!template text="""the Eshell buffer.""" start="00:14:31.181" video="mainVideo-shell" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Processes""" start="00:14:54.400" video="mainVideo-shell" id="subtitle"]]</div>[[!template text="""We can run the interactive command list-processes to see""" start="00:14:54.400" video="mainVideo-shell" id="subtitle"]]
[[!template text="""all the processes running for our current Emacs session.""" start="00:14:59.581" video="mainVideo-shell" id="subtitle"]]
[[!template text="""In Eshell, we can run the command &quot;jobs&quot; to get the same list.""" start="00:15:11.747" video="mainVideo-shell" id="subtitle"]]
[[!template text="""This will show the process name, process buffer name,""" start="00:15:17.647" video="mainVideo-shell" id="subtitle"]]
[[!template text="""process ID, and some other information. We can select the""" start="00:15:22.814" video="mainVideo-shell" id="subtitle"]]
[[!template text="""process buffer in the process list to bring up that process""" start="00:15:28.614" video="mainVideo-shell" id="subtitle"]]
[[!template text="""buffer.""" start="00:15:32.881" video="mainVideo-shell" id="subtitle"]]
[[!template text="""We can also use the interactive command signal-process to""" start="00:15:42.414" video="mainVideo-shell" id="subtitle"]]
[[!template text="""send any signal to a process, including &quot;stop&quot; to suspend the""" start="00:15:47.047" video="mainVideo-shell" id="subtitle"]]
[[!template text="""process, &quot;continue&quot; to resume the process, and &quot;interrupt&quot; or""" start="00:15:52.981" video="mainVideo-shell" id="subtitle"]]
[[!template text="""kill to terminate the process.""" start="00:15:58.381" video="mainVideo-shell" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Redirecting and pipelining input and output""" start="00:17:00.180" video="mainVideo-shell" id="subtitle"]]</div>[[!template text="""Regarding redirecting and pipelining input and output,""" start="00:17:00.180" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Eshell does support redirection similar to Bash, so you can""" start="00:17:04.814" video="mainVideo-shell" id="subtitle"]]
[[!template text="""overwrite and append to files and some other objects. Input""" start="00:17:11.614" video="mainVideo-shell" id="subtitle"]]
[[!template text="""redirection is not yet implemented, but it is on the Eshell""" start="00:17:17.047" video="mainVideo-shell" id="subtitle"]]
[[!template text="""to-do list. Eshell also has pipes. The default pipe, which""" start="00:17:22.381" video="mainVideo-shell" id="subtitle"]]
[[!template text="""uses the familiar vertical bar symbol, pipes the data""" start="00:17:29.214" video="mainVideo-shell" id="subtitle"]]
[[!template text="""between the commands using an intermediate Emacs buffer.""" start="00:17:33.221" video="mainVideo-shell" id="subtitle"]]
[[!template text="""This, while usually quite practical, is less efficient""" start="00:17:36.981" video="mainVideo-shell" id="subtitle"]]
[[!template text="""than the system pipe. Therefore, Eshell also makes""" start="00:17:41.201" video="mainVideo-shell" id="subtitle"]]
[[!template text="""available a star-modified version, which uses the system""" start="00:17:46.320" video="mainVideo-shell" id="subtitle"]]
[[!template text="""pipe through a call to your system shell.""" start="00:17:50.147" video="mainVideo-shell" id="subtitle"]]
[[!template text="""So we can do things like""" start="00:17:56.881" video="mainVideo-shell" id="subtitle"]]
[[!template text="""direct output to a file.""" start="00:18:02.340" video="mainVideo-shell" id="subtitle"]]
[[!template text="""We're unfortunately not able to do input redirection, but""" start="00:18:15.100" video="mainVideo-shell" id="subtitle"]]
[[!template text="""we can use pipes.""" start="00:18:20.241" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Elisp can manipulate and tie together processes in various""" start="00:18:41.760" video="mainVideo-shell" id="subtitle"]]
[[!template text="""ways, such as process filters and pipe processes, but I""" start="00:18:45.640" video="mainVideo-shell" id="subtitle"]]
[[!template text="""won't attempt to cover that. I feel like you should mention""" start="00:18:51.000" video="mainVideo-shell" id="subtitle"]]
[[!template text="""again that we have two kinds of pipes here available. So this""" start="00:18:56.560" video="mainVideo-shell" id="subtitle"]]
[[!template text="""pipe, the standard one, will pipe the data through Emacs""" start="00:19:02.120" video="mainVideo-shell" id="subtitle"]]
[[!template text="""buffers. That's very practical in most cases, but it is less""" start="00:19:09.240" video="mainVideo-shell" id="subtitle"]]
[[!template text="""efficient than piping through the system pipe. So Eshell""" start="00:19:16.760" video="mainVideo-shell" id="subtitle"]]
[[!template text="""makes available another symbol for that, star, vertical""" start="00:19:22.920" video="mainVideo-shell" id="subtitle"]]
[[!template text="""bar, that allows you to explicitly use the system pipe.""" start="00:19:28.120" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Regarding scripting: Of course, using Emacs makes""" start="00:19:38.340" video="mainVideo-shell" id="subtitle"]]
[[!template text="""available all the power of the Elisp API and third-party""" start="00:19:43.600" video="mainVideo-shell" id="subtitle"]]
[[!template text="""packages, so we have that out of the gate. Eshell also has""" start="00:19:47.960" video="mainVideo-shell" id="subtitle"]]
[[!template text="""control flow statements, like an &quot;if&quot; construct and a &quot;for&quot;""" start="00:19:54.720" video="mainVideo-shell" id="subtitle"]]
[[!template text="""construct. See the Eshell info manual, section 3.7, for""" start="00:19:59.640" video="mainVideo-shell" id="subtitle"]]
[[!template text="""more details.""" start="00:20:06.520" video="mainVideo-shell" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Scripts""" start="00:20:09.440" video="mainVideo-shell" id="subtitle"]]</div>[[!template text="""And if you wish to write a script entirely in Eshell syntax,""" start="00:20:09.440" video="mainVideo-shell" id="subtitle"]]
[[!template text="""and store it in a separate file, this is possible with recent""" start="00:20:13.840" video="mainVideo-shell" id="subtitle"]]
[[!template text="""versions of Emacs.""" start="00:20:18.560" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Here's an example of a brief script that I wrote.""" start="00:20:31.840" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Unfortunately, an eshell mode for proper syntax""" start="00:20:37.560" video="mainVideo-shell" id="subtitle"]]
[[!template text="""highlighting is not yet available, but hopefully that will""" start="00:20:42.680" video="mainVideo-shell" id="subtitle"]]
[[!template text="""be forthcoming. Note that Eshell syntax allows elisp""" start="00:20:46.280" video="mainVideo-shell" id="subtitle"]]
[[!template text="""forms to be interspersed with regular command form for""" start="00:20:51.280" video="mainVideo-shell" id="subtitle"]]
[[!template text="""additional scripting power. We will discuss this a little""" start="00:20:55.080" video="mainVideo-shell" id="subtitle"]]
[[!template text="""more later.""" start="00:20:58.760" video="mainVideo-shell" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""File system management""" start="00:21:11.780" video="mainVideo-shell" id="subtitle"]]</div>[[!template text="""Regarding file system management. In Emacs, many of the""" start="00:21:11.780" video="mainVideo-shell" id="subtitle"]]
[[!template text="""common file system operations are available as""" start="00:21:16.760" video="mainVideo-shell" id="subtitle"]]
[[!template text="""interactive commands. For example, M-x cd, to change your""" start="00:21:20.240" video="mainVideo-shell" id="subtitle"]]
[[!template text="""buffer's current working directory, and other M-x commands""" start="00:21:26.760" video="mainVideo-shell" id="subtitle"]]
[[!template text="""such as make-directory""" start="00:21:32.840" video="mainVideo-shell" id="subtitle"]]
[[!template text="""chmod,""" start="00:21:40.780" video="mainVideo-shell" id="subtitle"]]
[[!template text="""and delete-file. Of course, you can also drop into Eshell,""" start="00:21:43.260" video="mainVideo-shell" id="subtitle"]]
[[!template text="""or use M-x eshell-command to run the usual external commands""" start="00:21:53.840" video="mainVideo-shell" id="subtitle"]]
[[!template text="""for file system manipulation. Also, a file manager is built""" start="00:22:00.640" video="mainVideo-shell" id="subtitle"]]
[[!template text="""into Emacs, which can be run by calling M-x dired.""" start="00:22:07.040" video="mainVideo-shell" id="subtitle"]]
[[!template text="""The directory editor is powerful, but it is a bit strange to""" start="00:22:19.640" video="mainVideo-shell" id="subtitle"]]
[[!template text="""folks expecting something like Midnight Commander or the""" start="00:22:24.560" video="mainVideo-shell" id="subtitle"]]
[[!template text="""GNOME file manager. It gives us a number of helpful features""" start="00:22:28.680" video="mainVideo-shell" id="subtitle"]]
[[!template text="""like the ability to mark files, and to run elisp functions on""" start="00:22:35.640" video="mainVideo-shell" id="subtitle"]]
[[!template text="""them, and some other interesting ways to manipulate and""" start="00:22:44.700" video="mainVideo-shell" id="subtitle"]]
[[!template text="""rename the files. However, third-party Emacs extensions""" start="00:22:48.440" video="mainVideo-shell" id="subtitle"]]
[[!template text="""such as Midnight Commander Mode and Sunrise Commander are""" start="00:22:54.080" video="mainVideo-shell" id="subtitle"]]
[[!template text="""available to provide a Midnight Commander experience, for those who""" start="00:22:58.480" video="mainVideo-shell" id="subtitle"]]
[[!template text="""prefer that sort of file management.""" start="00:23:03.880" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Emacs also has the nifty TRAMP functionality built in,""" start="00:23:10.320" video="mainVideo-shell" id="subtitle"]]
[[!template text="""which allows you, most of the time, to easily edit files on""" start="00:23:14.880" video="mainVideo-shell" id="subtitle"]]
[[!template text="""other computers, as well as manipulate the file system.""" start="00:23:19.160" video="mainVideo-shell" id="subtitle"]]
[[!template text="""This transparently works through SSH and some other""" start="00:23:23.180" video="mainVideo-shell" id="subtitle"]]
[[!template text="""protocols that you can specify.""" start="00:23:27.840" video="mainVideo-shell" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Networking""" start="00:23:43.560" video="mainVideo-shell" id="subtitle"]]</div>[[!template text="""Regarding networking features, I don't have a lot of""" start="00:23:43.560" video="mainVideo-shell" id="subtitle"]]
[[!template text="""interesting things to say about this at the present, so I'll""" start="00:23:48.160" video="mainVideo-shell" id="subtitle"]]
[[!template text="""skip through this quickly. But if you do a little research,""" start="00:23:51.640" video="mainVideo-shell" id="subtitle"]]
[[!template text="""you will see that Emacs has a lot of functionality relating""" start="00:23:54.920" video="mainVideo-shell" id="subtitle"]]
[[!template text="""to making network connections, interacting with the web,""" start="00:23:58.800" video="mainVideo-shell" id="subtitle"]]
[[!template text="""and such like, both built-in and in available packages, as""" start="00:24:02.780" video="mainVideo-shell" id="subtitle"]]
[[!template text="""well as modes for doing things like Web browsing and Gemini""" start="00:24:07.860" video="mainVideo-shell" id="subtitle"]]
[[!template text="""browsing. And of course, you can run the usual standard""" start="00:24:14.400" video="mainVideo-shell" id="subtitle"]]
[[!template text="""networking commands for your system through Eshell.""" start="00:24:20.600" video="mainVideo-shell" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""A brief tour of Eshell""" start="00:24:30.120" video="mainVideo-shell" id="subtitle"]]</div>[[!template text="""So having put forward the main arguments for this talk, I""" start="00:24:30.120" video="mainVideo-shell" id="subtitle"]]
[[!template text="""would like to take some time now to give a brief tour of a few of""" start="00:24:33.760" video="mainVideo-shell" id="subtitle"]]
[[!template text="""the features of Eshell, the Emacs shell. It bears""" start="00:24:38.200" video="mainVideo-shell" id="subtitle"]]
[[!template text="""emphasizing that Eshell is not a drop-in replacement for""" start="00:24:43.800" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Bash, or even a Bash clone, though I believe the developers""" start="00:24:47.000" video="mainVideo-shell" id="subtitle"]]
[[!template text="""are trying to make much of the syntax very similar. Also,""" start="00:24:51.880" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Eshell is not a terminal emulator, and it will not display""" start="00:24:56.840" video="mainVideo-shell" id="subtitle"]]
[[!template text="""correctly applications which use advanced ANSI control""" start="00:25:00.480" video="mainVideo-shell" id="subtitle"]]
[[!template text="""codes. However, Eshell can be configured to be aware of such""" start="00:25:04.680" video="mainVideo-shell" id="subtitle"]]
[[!template text="""applications, and to run them automatically within the""" start="00:25:10.120" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Emacs terminal emulator when launched. See section 5.1 of""" start="00:25:13.301" video="mainVideo-shell" id="subtitle"]]
[[!template text="""the Eshell manual titled Visual Commands.""" start="00:25:19.941" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Though Eshell is not Bash, it has multiple features,""" start="00:25:32.540" video="mainVideo-shell" id="subtitle"]]
[[!template text="""pertaining mainly to its by-design Emacs integration,""" start="00:25:36.760" video="mainVideo-shell" id="subtitle"]]
[[!template text="""which may make it more appealing to use than Bash or another""" start="00:25:40.680" video="mainVideo-shell" id="subtitle"]]
[[!template text="""shell.""" start="00:25:44.640" video="mainVideo-shell" id="subtitle"]]
[[!template text="""For one, Eshell allows entering commands on the command""" start="00:25:48.160" video="mainVideo-shell" id="subtitle"]]
[[!template text="""line that are space and new line separated, without""" start="00:25:52.040" video="mainVideo-shell" id="subtitle"]]
[[!template text="""parentheses. Of course, all the other shells do this. But""" start="00:25:55.961" video="mainVideo-shell" id="subtitle"]]
[[!template text="""within Eshell, it is possible to enter internal Emacs""" start="00:26:01.281" video="mainVideo-shell" id="subtitle"]]
[[!template text="""functions, as well as external commands.""" start="00:26:06.281" video="mainVideo-shell" id="subtitle"]]
[[!template text="""This allows us to do things like this.""" start="00:26:13.240" video="mainVideo-shell" id="subtitle"]]
[[!template text="""As far as I understand, it is possible to enter any Emacs""" start="00:26:45.740" video="mainVideo-shell" id="subtitle"]]
[[!template text="""function on the Eshell command line. However, some special""" start="00:26:49.760" video="mainVideo-shell" id="subtitle"]]
[[!template text="""syntax may be required if you are trying to pass in something""" start="00:26:53.960" video="mainVideo-shell" id="subtitle"]]
[[!template text="""that is not a string or a number.""" start="00:26:58.400" video="mainVideo-shell" id="subtitle"]]
[[!template text="""As you might have noticed in the last example, Eshell makes""" start="00:27:04.380" video="mainVideo-shell" id="subtitle"]]
[[!template text="""it possible to use an Emacs buffer as a sink for output. It""" start="00:27:07.920" video="mainVideo-shell" id="subtitle"]]
[[!template text="""also allows using a buffer as a source of input, though this""" start="00:27:12.920" video="mainVideo-shell" id="subtitle"]]
[[!template text="""is slightly more complicated, since the buffer must be""" start="00:27:18.040" video="mainVideo-shell" id="subtitle"]]
[[!template text="""converted to a string first. I have distilled this down into""" start="00:27:21.840" video="mainVideo-shell" id="subtitle"]]
[[!template text="""my own function, named with the &quot;at&quot; symbol.""" start="00:27:27.200" video="mainVideo-shell" id="subtitle"]]
[[!template text="""And I will provide the brief snippet of code for this later.""" start="00:27:36.640" video="mainVideo-shell" id="subtitle"]]
[[!template text="""So to give an example, here's our messages buffer.""" start="00:27:54.640" video="mainVideo-shell" id="subtitle"]]
[[!template text="""And from Eshell, we can do something like this.""" start="00:28:02.500" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Let's say here we wanted to grab our messages buffer to see""" start="00:28:29.780" video="mainVideo-shell" id="subtitle"]]
[[!template text="""everything that we had been loading during the startup""" start="00:28:34.440" video="mainVideo-shell" id="subtitle"]]
[[!template text="""process.""" start="00:28:38.080" video="mainVideo-shell" id="subtitle"]]
[[!template text="""So you can see how that could be very handy in a number of""" start="00:28:48.060" video="mainVideo-shell" id="subtitle"]]
[[!template text="""scenarios.""" start="00:28:51.880" video="mainVideo-shell" id="subtitle"]]
[[!template text="""I wanted to briefly mention that we have a helpful function""" start="00:28:55.060" video="mainVideo-shell" id="subtitle"]]
[[!template text="""here called eshell-insert-buffer-name,""" start="00:29:00.240" video="mainVideo-shell" id="subtitle"]]
[[!template text="""which allows us to insert a buffer name into the current""" start="00:29:11.120" video="mainVideo-shell" id="subtitle"]]
[[!template text="""buffer at point using completion,""" start="00:29:15.360" video="mainVideo-shell" id="subtitle"]]
[[!template text="""which can save you a lot of typing.""" start="00:29:24.680" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Another nice feature of Eshell""" start="00:29:32.880" video="mainVideo-shell" id="subtitle"]]
[[!template text="""is that it allows integrating ELisp into the command line""" start="00:29:37.220" video="mainVideo-shell" id="subtitle"]]
[[!template text="""call. Let's give another example. Say we wanted to echo the""" start="00:29:41.200" video="mainVideo-shell" id="subtitle"]]
[[!template text="""date to an event file or an event log.""" start="00:29:48.880" video="mainVideo-shell" id="subtitle"]]
[[!template text="""I should probably take a moment to explain this asterisk""" start="00:29:56.720" video="mainVideo-shell" id="subtitle"]]
[[!template text="""that I'm occasionally using. So since Emacs, or excuse me,""" start="00:30:01.640" video="mainVideo-shell" id="subtitle"]]
[[!template text="""since Eshell can use internal or external Emacs, excuse me,""" start="00:30:07.000" video="mainVideo-shell" id="subtitle"]]
[[!template text="""internal Emacs commands or external commands, it may""" start="00:30:11.720" video="mainVideo-shell" id="subtitle"]]
[[!template text="""sometimes be necessary to clarify which one you want to use,""" start="00:30:17.000" video="mainVideo-shell" id="subtitle"]]
[[!template text="""since the names may overlap. Since my Eshell is configured""" start="00:30:22.380" video="mainVideo-shell" id="subtitle"]]
[[!template text="""by default to prefer the internal Emacs functions, then""" start="00:30:27.080" video="mainVideo-shell" id="subtitle"]]
[[!template text="""sometimes I have to use the asterisk to specify that I want""" start="00:30:32.320" video="mainVideo-shell" id="subtitle"]]
[[!template text="""the external version.""" start="00:30:37.800" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Here I can insert a bit of Elisp,""" start="00:30:42.680" video="mainVideo-shell" id="subtitle"]]
[[!template text="""and then redirect the output to the event log.""" start="00:31:03.180" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Last, I want to mention that there are some optional Eshell""" start="00:31:18.720" video="mainVideo-shell" id="subtitle"]]
[[!template text="""modules in Emacs, not turned on by default, which provide""" start="00:31:22.640" video="mainVideo-shell" id="subtitle"]]
[[!template text="""additional nifty features.""" start="00:31:27.160" video="mainVideo-shell" id="subtitle"]]
[[!template text="""On my system, I have most of the optional modules turned on.""" start="00:31:40.540" video="mainVideo-shell" id="subtitle"]]
[[!template text="""An interesting module is eshell-smart, which does various""" start="00:31:58.320" video="mainVideo-shell" id="subtitle"]]
[[!template text="""things with cursor positioning and scrolling, so as to make""" start="00:32:03.200" video="mainVideo-shell" id="subtitle"]]
[[!template text="""editing commands and reviewing output easier.""" start="00:32:07.320" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Let's say I was to change directory to my boot directory""" start="00:32:18.340" video="mainVideo-shell" id="subtitle"]]
[[!template text="""and use a command which involves lots of output.""" start="00:32:30.880" video="mainVideo-shell" id="subtitle"]]
[[!template text="""You'll notice right away that the cursor positioning is set""" start="00:32:39.900" video="mainVideo-shell" id="subtitle"]]
[[!template text="""such that I'm immediately able to view the top of the output.""" start="00:32:44.360" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Also, I'm able to use the space bar to page through the""" start="00:32:48.720" video="mainVideo-shell" id="subtitle"]]
[[!template text="""output.""" start="00:32:52.880" video="mainVideo-shell" id="subtitle"]]
[[!template text="""So this is an opinionated feature, which assumes that""" start="00:32:56.080" video="mainVideo-shell" id="subtitle"]]
[[!template text="""you're likely going to want to review the output""" start="00:33:01.920" video="mainVideo-shell" id="subtitle"]]
[[!template text="""immediately, or that you often will. Of course, you can""" start="00:33:05.400" video="mainVideo-shell" id="subtitle"]]
[[!template text="""always jump to the end.""" start="00:33:10.560" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Also, after a command is entered, the cursor is immediately""" start="00:33:19.980" video="mainVideo-shell" id="subtitle"]]
[[!template text="""repositioned to make it easy to edit the command.""" start="00:33:23.920" video="mainVideo-shell" id="subtitle"]]
[[!template text="""And also, if I don't want to edit the command, and I do not want""" start="00:33:53.020" video="mainVideo-shell" id="subtitle"]]
[[!template text="""to review the output, I can simply start typing another""" start="00:33:56.520" video="mainVideo-shell" id="subtitle"]]
[[!template text="""command.""" start="00:33:59.680" video="mainVideo-shell" id="subtitle"]]
[[!template text="""So that covers the brief tour of Eshell features.""" start="00:34:11.260" video="mainVideo-shell" id="subtitle"]]
[[!template text="""And that basically ends my talk.""" start="00:34:17.760" video="mainVideo-shell" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Login shell""" start="00:34:21.128" video="mainVideo-shell" id="subtitle"]]</div>[[!template text="""However, a handful of""" start="00:34:21.128" video="mainVideo-shell" id="subtitle"]]
[[!template text="""viewers might be wondering, is it possible to set Emacs to be""" start="00:34:22.381" video="mainVideo-shell" id="subtitle"]]
[[!template text="""my login shell to completely replace bash in your login""" start="00:34:28.720" video="mainVideo-shell" id="subtitle"]]
[[!template text="""experience? The answer is yes, but in practice there are""" start="00:34:37.640" video="mainVideo-shell" id="subtitle"]]
[[!template text="""various difficulties involved which might make it not""" start="00:34:43.720" video="mainVideo-shell" id="subtitle"]]
[[!template text="""worth the trouble.""" start="00:34:47.400" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Before doing this, you'll have to answer a few initial""" start="00:35:00.440" video="mainVideo-shell" id="subtitle"]]
[[!template text="""questions. Do you want to make a new Emacs instance every""" start="00:35:03.480" video="mainVideo-shell" id="subtitle"]]
[[!template text="""time you log in, or do you want it to connect to an Emacs""" start="00:35:09.520" video="mainVideo-shell" id="subtitle"]]
[[!template text="""server? Which is popular among Emacs users, to reuse the""" start="00:35:13.760" video="mainVideo-shell" id="subtitle"]]
[[!template text="""session, or to connect to the existing session. Also, do you""" start="00:35:20.600" video="mainVideo-shell" id="subtitle"]]
[[!template text="""want a different result, whether in graphical or a terminal""" start="00:35:26.600" video="mainVideo-shell" id="subtitle"]]
[[!template text="""environment? And are you okay with your initialization""" start="00:35:30.640" video="mainVideo-shell" id="subtitle"]]
[[!template text="""file being run every time you log in, including every new tab""" start="00:35:34.680" video="mainVideo-shell" id="subtitle"]]
[[!template text="""you open in a terminal emulator? If we assume that you are""" start="00:35:39.560" video="mainVideo-shell" id="subtitle"]]
[[!template text="""using a system with /etc/passwd user management, you get""" start="00:35:44.521" video="mainVideo-shell" id="subtitle"]]
[[!template text="""one field to specify the name of the shell program that you""" start="00:35:50.340" video="mainVideo-shell" id="subtitle"]]
[[!template text="""want to use, and no arguments are allowed. So maybe you can""" start="00:35:54.000" video="mainVideo-shell" id="subtitle"]]
[[!template text="""see how this might be challenging, depending on your""" start="00:35:58.480" video="mainVideo-shell" id="subtitle"]]
[[!template text="""answers to the previous questions. You can work around""" start="00:36:02.680" video="mainVideo-shell" id="subtitle"]]
[[!template text="""these issues in various ways, like modifying the""" start="00:36:06.880" video="mainVideo-shell" id="subtitle"]]
[[!template text="""authentication system, or by specifying a script for your""" start="00:36:10.480" video="mainVideo-shell" id="subtitle"]]
[[!template text="""login shell. But if your normal workflow is to simply log in""" start="00:36:15.440" video="mainVideo-shell" id="subtitle"]]
[[!template text="""and start Emacs and run that Emacs session until your next""" start="00:36:21.800" video="mainVideo-shell" id="subtitle"]]
[[!template text="""reboot, then it probably isn't worth the bother.""" start="00:36:25.680" video="mainVideo-shell" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Resources""" start="00:36:36.980" video="mainVideo-shell" id="subtitle"]]</div>[[!template text="""So thank you for listening to my talk, Emacs as a Shell, by""" start="00:36:36.980" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Christopher Howard for Emacs Conference 2024.""" start="00:36:42.000" video="mainVideo-shell" id="subtitle"]]
[[!template text="""At the bottom of this page, you can see a link to the""" start="00:36:46.860" video="mainVideo-shell" id="subtitle"]]
[[!template text="""repository containing the brief amount of code that was""" start="00:36:51.520" video="mainVideo-shell" id="subtitle"]]
[[!template text="""featured here in this video, as well as a link to my personal""" start="00:36:56.920" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Gemini gemlog, as well as to a Web portal version of that.""" start="00:37:03.680" video="mainVideo-shell" id="subtitle"]]
[[!template text="""Thank you.""" start="00:37:10.280" video="mainVideo-shell" id="subtitle"]]

</div>

Captioner: mark

Questions or comments? Please e-mail [christopher@librehacker.com](mailto:christopher@librehacker.com?subject=Comment%20for%20EmacsConf%202023%20shell%3A%20Emacs%20as%20a%20shell)


<!-- End of emacsconf-publish-after-page -->