liner icon indicating copy to clipboard operation
liner copied to clipboard

Let user exit raw mode

Open quackduck opened this issue 4 years ago • 28 comments

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

quackduck avatar Jan 17 '21 06:01 quackduck

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

https://github.com/peterh/liner/issues/146

That might answer some of your questions.

jcburley avatar Jan 17 '21 13:01 jcburley

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

quackduck avatar Jan 17 '21 14:01 quackduck

Ah is this commit what you mean: https://github.com/candid82/liner/commit/8e336a7c0c893df1b4d38a2cfe8ea25e3b0919c4? I will use that fork now. Hooray for open source!

quackduck avatar Jan 17 '21 15:01 quackduck

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

quackduck avatar Jan 17 '21 15:01 quackduck

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!!

jcburley avatar Jan 18 '21 01:01 jcburley

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 avatar Jan 18 '21 04:01 quackduck

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?

quackduck avatar Jan 18 '21 04:01 quackduck

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

peterh avatar Jan 19 '21 02:01 peterh

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

quackduck avatar Jan 19 '21 04:01 quackduck

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):

https://github.com/peterh/liner/pull/147

jcburley avatar Jan 19 '21 09:01 jcburley

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.

quackduck avatar Jan 19 '21 09:01 quackduck

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.

jcburley avatar Jan 19 '21 09:01 jcburley

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

quackduck avatar Jan 19 '21 09:01 quackduck

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.

jcburley avatar Jan 19 '21 10:01 jcburley

Ah cool. I see it connecting to servers too.

quackduck avatar Jan 19 '21 10:01 quackduck

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 avatar Jan 19 '21 11:01 jcburley

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

https://github.com/candid82/joker/issues/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.

jcburley avatar Jan 19 '21 11:01 jcburley

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.

quackduck avatar Jan 19 '21 12:01 quackduck

Nice, thanks, I'll look into that package!

On January 19, 2021 7:06:35 AM EST, Ishan Goel [email protected] wrote:

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.

-- You are receiving this because you were mentioned. Reply to this email directly or view it on GitHub: https://github.com/peterh/liner/issues/146#issuecomment-762800052

James Craig Burley, Software Architect

jcburley avatar Jan 19 '21 12:01 jcburley

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.

peterh avatar Jan 19 '21 16:01 peterh

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

quackduck avatar Jan 19 '21 16:01 quackduck

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 avatar Jan 19 '21 17:01 peterh

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

peterh avatar Jan 19 '21 17:01 peterh

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 avatar Jan 19 '21 17:01 quackduck

Shells do need to give commands input.

quackduck avatar Jan 19 '21 17:01 quackduck

At least there being an option would do no harm.

quackduck avatar Jan 19 '21 17:01 quackduck

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.

peterh avatar Jan 19 '21 17:01 peterh

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

quackduck avatar Jan 19 '21 17:01 quackduck