* How to get eshell to do what I used to do with shell
@ 2024-08-10 17:00 KARR, DAVID
2024-08-10 19:10 ` tpeplt
2024-08-10 21:01 ` James Thomas
0 siblings, 2 replies; 8+ messages in thread
From: KARR, DAVID @ 2024-08-10 17:00 UTC (permalink / raw)
To: Help-gnu-emacs@gnu.org
I haven't gotten a reply from the Cygwin list yet on my shell ioctl problem. I may get something useful from that, but I may have to consider an alternative path. I wrote this little wrapper on "shell" a couple of decades ago, and it's worked fine since then. I've briefly looked at "eshell", and it seems like it will do the job, but I wanted to know whether I can wrap it to do the same things my older wrapper was doing.
My old wrapper had these features:
* In a non-shell buffer, execing the main func would either create the first shell buffer, or go to the first one in the chain, perhaps called the 0th.
* In a shell buffer, execing the main func would create a new shell in the chain, using the current directory
* In a shell buffer, execing the "goto-next-shell" func would move to the next buffer in the chain, or back to 0 if at the end
* In a shell buffer, execing the "find-shell-with-dir" func would take a string argument and find the next buffer in the chain where the pwd has that string as a substring
I think all of these are doable, but I haven't written any elisp for many years. I see that "default-directory" in each eshell buffer is set to the current directory, just like in the old shell package. I wonder if this will work just by changing the name of the function to execute. Could it be that simple? I guess I'll iterate on that and come back here for question.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: How to get eshell to do what I used to do with shell
2024-08-10 17:00 How to get eshell to do what I used to do with shell KARR, DAVID
@ 2024-08-10 19:10 ` tpeplt
2024-08-10 19:52 ` KARR, DAVID
2024-08-10 21:01 ` James Thomas
1 sibling, 1 reply; 8+ messages in thread
From: tpeplt @ 2024-08-10 19:10 UTC (permalink / raw)
To: KARR, DAVID; +Cc: Help-gnu-emacs@gnu.org
"KARR, DAVID" <dk068x@att.com> writes:
> ... I wrote this little wrapper on "shell"
> a couple of decades ago, and it's worked fine since then. I've
> briefly looked at "eshell", and it seems like it will do the job, but
> I wanted to know whether I can wrap it to do the same things my older
> wrapper was doing.
>
> My old wrapper had these features:
> * In a non-shell buffer, execing the main func would either create the
> first shell buffer, or go to the first one in the chain, perhaps
> called the 0th.
> * In a shell buffer, execing the main func would create a new shell in
> the chain, using the current directory
> * In a shell buffer, execing the "goto-next-shell" func would move to
> the next buffer in the chain, or back to 0 if at the end
> * In a shell buffer, execing the "find-shell-with-dir" func would take
> a string argument and find the next buffer in the chain where the pwd
> has that string as a substring
>
> I think all of these are doable, but I haven't written any elisp for
> many years. I see that "default-directory" in each eshell buffer is
> set to the current directory, just like in the old shell package. I
> wonder if this will work just by changing the name of the function to
> execute. Could it be that simple? I guess I'll iterate on that and
> come back here for question.
1. In case you are unaware, there is an Info manual for eshell. It is
separate from the Emacs user manual and the Emacs Lisp reference
manual. If it is installed on your system, then you should be able
to read it by evaluating the following expression in Emacs:
(info "(eshell) Top")
2. One of the chapters in the Eshell manual is titled "Bugs and Ideas".
You might find the answer to your question(s) in this chapter (over
400 lines long), or find that the capability that you want is not yet
supported in Eshell.
(info "(eshell) Bugs and ideas")
--
The lyf so short, the craft so long to lerne.
- Geoffrey Chaucer, The Parliament of Birds.
^ permalink raw reply [flat|nested] 8+ messages in thread
* RE: How to get eshell to do what I used to do with shell
2024-08-10 19:10 ` tpeplt
@ 2024-08-10 19:52 ` KARR, DAVID
2024-08-10 22:32 ` tpeplt
2024-08-11 11:27 ` Joel Reicher
0 siblings, 2 replies; 8+ messages in thread
From: KARR, DAVID @ 2024-08-10 19:52 UTC (permalink / raw)
To: tpeplt; +Cc: Help-gnu-emacs@gnu.org
(Hope top post is ok, Outlook doesn’t make it easy to configure different ways to include the replying post, per mailing list.)
Yes, I’m familiar with Info, I just hadn’t read the eshell section before. I’ve only started to run through it, but I have two questions right off.
Section 1.1 mentions an obscure way of filtering ls output, using an example like “ls -lt **/*.doc(Lk+100aM+6)”. I couldn’t get any variation of that to work. It’s not clear whether it’s saying that is eshell functionality, or something about the most common implementations of “ls”.
When I do something simple like this: “ls -l | grep "txt" | sort”, all the output lines are prefixed with “(standard input):”. I haven’t searched through the info manual yet, but I asked github copilot about this, and it said that “eshell/grep” instead of “grep” would fix that, but that didn’t work either (I don’t expect everything from copilot to be 100% accurate).
From: tpeplt <tpeplt@gmail.com>
Sent: Saturday, August 10, 2024 12:10 PM
To: KARR, DAVID <dk068x@att.com>
Cc: Help-gnu-emacs@gnu.org
Subject: Re: How to get eshell to do what I used to do with shell
ZjQcmQRYFpfptBannerEnd
"KARR, DAVID" <dk068x@att.com<mailto:dk068x@att.com>> writes:
> ... I wrote this little wrapper on "shell"
> a couple of decades ago, and it's worked fine since then. I've
> briefly looked at "eshell", and it seems like it will do the job, but
> I wanted to know whether I can wrap it to do the same things my older
> wrapper was doing.
>
> My old wrapper had these features:
> * In a non-shell buffer, execing the main func would either create the
> first shell buffer, or go to the first one in the chain, perhaps
> called the 0th.
> * In a shell buffer, execing the main func would create a new shell in
> the chain, using the current directory
> * In a shell buffer, execing the "goto-next-shell" func would move to
> the next buffer in the chain, or back to 0 if at the end
> * In a shell buffer, execing the "find-shell-with-dir" func would take
> a string argument and find the next buffer in the chain where the pwd
> has that string as a substring
>
> I think all of these are doable, but I haven't written any elisp for
> many years. I see that "default-directory" in each eshell buffer is
> set to the current directory, just like in the old shell package. I
> wonder if this will work just by changing the name of the function to
> execute. Could it be that simple? I guess I'll iterate on that and
> come back here for question.
1. In case you are unaware, there is an Info manual for eshell. It is
separate from the Emacs user manual and the Emacs Lisp reference
manual. If it is installed on your system, then you should be able
to read it by evaluating the following expression in Emacs:
(info "(eshell) Top")
2. One of the chapters in the Eshell manual is titled "Bugs and Ideas".
You might find the answer to your question(s) in this chapter (over
400 lines long), or find that the capability that you want is not yet
supported in Eshell.
(info "(eshell) Bugs and ideas")
--
The lyf so short, the craft so long to lerne.
- Geoffrey Chaucer, The Parliament of Birds.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: How to get eshell to do what I used to do with shell
2024-08-10 17:00 How to get eshell to do what I used to do with shell KARR, DAVID
2024-08-10 19:10 ` tpeplt
@ 2024-08-10 21:01 ` James Thomas
2024-08-10 21:06 ` KARR, DAVID
1 sibling, 1 reply; 8+ messages in thread
From: James Thomas @ 2024-08-10 21:01 UTC (permalink / raw)
To: Help-gnu-emacs@gnu.org
KARR, DAVID wrote:
> My old wrapper had these features:
> * In a non-shell buffer, execing the main func would either create the
> first shell buffer, or go to the first one in the chain, perhaps
> called the 0th.
> * In a shell buffer, execing the main func would create a new shell in
> the chain, using the current directory
> * In a shell buffer, execing the "goto-next-shell" func would move to
> the next buffer in the chain, or back to 0 if at the end
> * In a shell buffer, execing the "find-shell-with-dir" func would take
> a string argument and find the next buffer in the chain where the pwd
> has that string as a substring
>
> I think all of these are doable
They should be, but lemme just say that I think a better way to use
eshell is to have a single buffer: the ability to transparently 'cd' to
different remotes and selectively open async output buffers (at least
for me) makes keeping multiple buffers redundant and is more convenient:
if the user is a single person, all the commands are in a particular
sequence, after all.
Regards,
James
^ permalink raw reply [flat|nested] 8+ messages in thread
* RE: How to get eshell to do what I used to do with shell
2024-08-10 21:01 ` James Thomas
@ 2024-08-10 21:06 ` KARR, DAVID
2024-08-11 9:49 ` James Thomas
0 siblings, 1 reply; 8+ messages in thread
From: KARR, DAVID @ 2024-08-10 21:06 UTC (permalink / raw)
To: James Thomas, Help-gnu-emacs@gnu.org
I don't understand that. I will be performing different tasks in different directories, and the output for tasks in one directory need to kept separate from the output for tasks in other directories.
By "different remotes", do you mean different hosts? I wouldn't be doing that at all.
From: help-gnu-emacs-bounces+dk068x=att.com@gnu.org <help-gnu-emacs-bounces+dk068x=att.com@gnu.org> On Behalf Of James Thomas
Sent: Saturday, August 10, 2024 2:01 PM
To: Help-gnu-emacs@gnu.org
Subject: Re: How to get eshell to do what I used to do with shell
KARR, DAVID wrote: > My old wrapper had these features: > * In a non-shell buffer, execing the main func would either create the > first shell buffer, or go to the first one in the chain, perhaps > called the 0th. > * In a shell
KARR, DAVID wrote:
> My old wrapper had these features:
> * In a non-shell buffer, execing the main func would either create the
> first shell buffer, or go to the first one in the chain, perhaps
> called the 0th.
> * In a shell buffer, execing the main func would create a new shell in
> the chain, using the current directory
> * In a shell buffer, execing the "goto-next-shell" func would move to
> the next buffer in the chain, or back to 0 if at the end
> * In a shell buffer, execing the "find-shell-with-dir" func would take
> a string argument and find the next buffer in the chain where the pwd
> has that string as a substring
>
> I think all of these are doable
They should be, but lemme just say that I think a better way to use
eshell is to have a single buffer: the ability to transparently 'cd' to
different remotes and selectively open async output buffers (at least
for me) makes keeping multiple buffers redundant and is more convenient:
if the user is a single person, all the commands are in a particular
sequence, after all.
Regards,
James
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: How to get eshell to do what I used to do with shell
2024-08-10 19:52 ` KARR, DAVID
@ 2024-08-10 22:32 ` tpeplt
2024-08-11 11:27 ` Joel Reicher
1 sibling, 0 replies; 8+ messages in thread
From: tpeplt @ 2024-08-10 22:32 UTC (permalink / raw)
To: KARR, DAVID; +Cc: Help-gnu-emacs@gnu.org
"KARR, DAVID" <dk068x@att.com> writes:
> (Hope top post is ok, Outlook doesn’t make it easy to configure
> different ways to include the replying post, per mailing list.)
>
FYI, it is possible to read from and write to mailing lists within Emacs
using gnus, but it requires some investment in time to get started with
it and to learn the subset of commands that you would find useful.
(info "(gnus) Top")
--
The lyf so short, the craft so long to lerne.
- Geoffrey Chaucer, The Parliament of Birds.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: How to get eshell to do what I used to do with shell
2024-08-10 21:06 ` KARR, DAVID
@ 2024-08-11 9:49 ` James Thomas
0 siblings, 0 replies; 8+ messages in thread
From: James Thomas @ 2024-08-11 9:49 UTC (permalink / raw)
To: KARR, DAVID; +Cc: Help-gnu-emacs@gnu.org
KARR, DAVID wrote:
> By "different remotes", do you mean different hosts? I wouldn't be
> doing that at all.
All right. But this should be applicable even then:
> I don't understand that. I will be performing different tasks in
> different directories, and the output for tasks in one directory need
> to kept separate from the output for tasks in other directories.
For e.g. you could add something like this to eshell-pre-command-hook:
(lambda () (eshell-set-output-handle 1 'insert (eshell-get-buffer
(concat "output-" (eshell/pwd)))))
...if you don't want to do (info "(eshell) Redirection") manually.
Eshell is not that well documented, though. I don't know it well either.
Regards,
James
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: How to get eshell to do what I used to do with shell
2024-08-10 19:52 ` KARR, DAVID
2024-08-10 22:32 ` tpeplt
@ 2024-08-11 11:27 ` Joel Reicher
1 sibling, 0 replies; 8+ messages in thread
From: Joel Reicher @ 2024-08-11 11:27 UTC (permalink / raw)
To: KARR, DAVID; +Cc: tpeplt, Help-gnu-emacs@gnu.org
"KARR, DAVID" <dk068x@att.com> writes:
> Section 1.1 mentions an obscure way of filtering ls output,
> using an example like “ls -lt **/*.doc(Lk+100aM+6)”. I couldn’t
> get any variation of that to work. It’s not clear whether it’s
> saying that is eshell functionality, or something about the
> most common implementations of “ls”.
Why do you think ls is doing anything interesting there?
> When I do something simple like this: “ls -l | grep "txt" |
> sort”, all the output lines are prefixed with “(standard
> input):”. I haven’t searched through the info manual yet, but I
> asked github copilot about this, and it said that “eshell/grep”
> instead of “grep” would fix that, but that didn’t work either (I
> don’t expect everything from copilot to be 100% accurate).
Keep in mind that when you execute a command line in eshell,
you're executing some lisp, because eshell is written in lisp.
Depending on your configuration, the behaviour might be to execute
a lisp function (if there is one), and that's probably the case
with grep. If eshell fails to find a lisp function matching the
command's name, it will then attempt to find an external program
by that name.
Also - and this is very important - that pipe is implemented in
lisp.
Both of these things can be overridden on demand by using the '*'
character. For example you can force grep to call the external
program by running
*grep
instead.
Compare the output of
grep blah foo
and
*grep blah foo
(the difference is much clearer if you do not use pipe to begin
with)
For pipes, you can do
grep blah foo *| grep something
and this will force the use of an external shell implementation of
pipe which, as far as I know, implicitly forces an external
program to be used for both commands too. There may be situations
you want the in-lisp pipe (such as piping to a lisp function
instead of an external program).
You may also find this useful.
https://www.masteringemacs.org/article/complete-guide-mastering-eshell
Cheers,
- Joel
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-08-11 11:27 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-10 17:00 How to get eshell to do what I used to do with shell KARR, DAVID
2024-08-10 19:10 ` tpeplt
2024-08-10 19:52 ` KARR, DAVID
2024-08-10 22:32 ` tpeplt
2024-08-11 11:27 ` Joel Reicher
2024-08-10 21:01 ` James Thomas
2024-08-10 21:06 ` KARR, DAVID
2024-08-11 9:49 ` James Thomas
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).