peterh / liner

Pure Go line editor with history, inspired by linenoise
MIT License
1.05k stars 132 forks source link

Let user exit raw mode #146

Open quackduck opened 3 years ago

quackduck commented 3 years ago

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

jcburley commented 3 years ago

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.

quackduck commented 3 years ago

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

quackduck commented 3 years ago

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 commented 3 years ago

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 commented 3 years ago

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 commented 3 years ago

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 commented 3 years ago

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 commented 3 years ago

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

quackduck commented 3 years ago

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

jcburley commented 3 years ago

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

quackduck commented 3 years ago

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 commented 3 years ago

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 commented 3 years ago

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

jcburley commented 3 years ago

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 commented 3 years ago

Ah cool. I see it connecting to servers too.

jcburley commented 3 years ago

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 commented 3 years ago

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.

quackduck commented 3 years ago

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 commented 3 years ago

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

On January 19, 2021 7:06:35 AM EST, Ishan Goel notifications@github.com 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

peterh commented 3 years ago

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 commented 3 years ago

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

peterh commented 3 years ago

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 commented 3 years ago

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

quackduck commented 3 years ago

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 commented 3 years ago

Shells do need to give commands input.

quackduck commented 3 years ago

At least there being an option would do no harm.

peterh commented 3 years ago

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 commented 3 years ago

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