Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Let user exit raw mode #146

Open
quackduck opened this issue Jan 17, 2021 · 28 comments
Open

Let user exit raw mode #146

quackduck opened this issue Jan 17, 2021 · 28 comments

Comments

@quackduck
Copy link

Can we let the user exit raw mode through some public function (and then get back to it)? How would this be implemented?

@jcburley
Copy link

You might want to take a look at the fork done for Joker (a Clojure interpreter implemented in Go):

#146

That might answer some of your questions.

@quackduck
Copy link
Author

Found it here: https://github.com/candid82/liner

@quackduck
Copy link
Author

quackduck commented Jan 17, 2021

Ah is this commit what you mean: candid82@8e336a7? I will use that fork now. Hooray for open source!

@quackduck
Copy link
Author

I can confirm it works! Hooray! Are you going to make a PR, @jcburley (the commit being yours) or would you like me to?

@jcburley
Copy link

I can confirm it works! Hooray! Are you going to make a PR, @jcburley (the commit being yours) or would you like me to?

I don't plan to do it, it was actually a PR for Roman's fork of liner. I don't know whether he'd be interested in trying to push it upstream, especially given his fork having other changes (to suit Joker) in which Peter might have little or no interest.

But I'm happy for you to give it a try!

(Sorry for the bad link a few messages back; glad you figured it out while I was AFK.)

Yeah, open source is great!!

@quackduck
Copy link
Author

I think at least this one change would be a good addition to the original library. @peterh, would you be interested in such a change?

Could you expand on what other changes that fork has @jcburley?

(No problem with the link thing 🙂)

@quackduck
Copy link
Author

I guess making a PR and then letting Peter decide to merge it or not would work too. In that case, would you like to make a PR? Also, is it possible for me to make a PR that still shows you as the author of the commit?

@peterh
Copy link
Owner

peterh commented Jan 19, 2021

You can save and restore the terminal mode with https://pkg.go.dev/github.com/peterh/liner#TerminalMode

@quackduck
Copy link
Author

I don't see a way to set the mode...? Besides, how do you feel about having this as default behavior?

@jcburley
Copy link

jcburley commented Jan 19, 2021

I guess making a PR and then letting Peter decide to merge it or not would work too. In that case, would you like to make a PR? Also, is it possible for me to make a PR that still shows you as the author of the commit?

I'm not sure @peterh wants liner to be suitable for non-shells, but here's the PR anyway (and I'm open to helping make this configurable so the default remains shell-like behavior, while programs like Joker and other "normal" utilities can get this newer behavior):

#147

@quackduck
Copy link
Author

Hmm but the reason I'm involved in this is because I'm making a shell. When raw mode is enabled, programs ran through the shell I'm making can't get any input.

@jcburley
Copy link

Hmm but the reason I'm involved in this is because I'm making a shell. When raw mode is enabled, programs ran through the shell I'm making can't get any input.

Oh, good point! I might be misremembering some other discussion from awhile back.

@quackduck
Copy link
Author

Ah. On a side note, what does https://github.com/jcburley/echo do?

@jcburley
Copy link

Ah. On a side note, what does https://github.com/jcburley/echo do?

Basically it just echoes input, after prompting for and the reading it using liner, readline (which Joker used to use), or vanilla/default.

I recently added supporting e.g. "30s" (anything accepted by time.ParseDuration()) to mean "sleep for this long", to test out the effects of things like SIGQUIT on the terminal state.

So it's just a test harness of sorts.

@quackduck
Copy link
Author

Ah cool. I see it connecting to servers too.

@jcburley
Copy link

Ah cool. I see it connecting to servers too.

Yeah, I'm not sure how useful that actually is. I was trying to better understand how these things (like line-readers) work when reading from a socket, as in a server configuration, versus a terminal. Didn't get far. But it's not currently an important use case for me ATM, though it has (at times) been in the past; mostly a matter of curiosity on my part.

@jcburley
Copy link

Another thing that "we" might put in our fork of liner is supported for bracketed paste:

candid82/joker#429

This seems like a good idea, but again I'm not entirely sure it's necessary (in Joker's case anyway) if, as I suspect, input always ends up being "unmolested" despite temporary things like automatically adding a close-paren when typing an open-paren and then positioning the cursor just after the open-paren.

@quackduck
Copy link
Author

golang.com/x/term has stuff related to bracketed pastes. Bracketed paste mode is implemented by all major shells so I think Peter would be happy with a PR for that.

@jcburley
Copy link

jcburley commented Jan 19, 2021 via email

@peterh
Copy link
Owner

peterh commented Jan 19, 2021

I don't see a way to set the mode...?

sad := liner.TerminalMode()
l := liner.NewLiner()
happy := liner.TerminalMode()
sad.ApplyMode()
// shell out to another program here, remember to happy.ApplyMode before calling l.Prompt()

Besides, how do you feel about having this as default behavior?

Assuming "this" refers to liner returning to sad mode whenever it isn't inside Prompt? It would make me sad. I don't like my terminal to echo while my application is processing.

@quackduck
Copy link
Author

But @peterh isn't that what happens with regular shells?

@peterh
Copy link
Owner

peterh commented Jan 19, 2021

Yes, that happens with regular shells. And I hate it every time it happens. I do not want to see my input interspersed with the output of the application.

@peterh
Copy link
Owner

peterh commented Jan 19, 2021

At least one other person has requested bracketed pastes. I'd be happy to look at a pull request for them.

@quackduck
Copy link
Author

Wait but then I'm trying to build an actual shell and it's not able to give the commands run input from stdin. I found this was when raw mode was enabled.

@quackduck
Copy link
Author

Shells do need to give commands input.

@quackduck
Copy link
Author

At least there being an option would do no harm.

@peterh
Copy link
Owner

peterh commented Jan 19, 2021

If you're trying to build an actual shell, you don't want liner. Sorry, but liner is not (and was never intended to be) suitable for all use cases.

@quackduck
Copy link
Author

Oh. I don't see what harm adding an option would do, but you're the owner!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants