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

When the data is large, the copy data cannot be render. #254

Closed
driftluo opened this issue Aug 5, 2019 · 3 comments · Fixed by #255
Closed

When the data is large, the copy data cannot be render. #254

driftluo opened this issue Aug 5, 2019 · 3 comments · Fixed by #255

Comments

@driftluo
Copy link
Contributor

driftluo commented Aug 5, 2019

use repo example debug:

Write 4100 log:

[2019-08-05T08:27:24Z DEBUG rustyline::tty::unix] initial cursor location: 1
[2019-08-05T08:27:35Z DEBUG rustyline::tty::unix] key: BracketedPasteStart
[2019-08-05T08:27:35Z DEBUG rustyline::keymap] Emacs command: Insert(1, "4100")
[2019-08-05T08:27:35Z DEBUG rustyline::undo] Changeset::insert_str(0, "4100")
[2019-08-05T08:27:36Z DEBUG rustyline::tty::unix] key: Enter
[2019-08-05T08:27:36Z DEBUG rustyline::keymap] Emacs command: AcceptLine

Write more than 4096 characters:

[2019-08-05T08:27:36Z DEBUG rustyline::tty::unix] initial cursor location: 1
[2019-08-05T08:27:41Z DEBUG rustyline::tty::unix] key: BracketedPasteStart
[2019-08-05T08:27:41Z DEBUG rustyline::keymap] Emacs command: Insert(1, "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")

The comparison shows that after the data is received, it is not written to stdout.

@driftluo
Copy link
Contributor Author

driftluo commented Aug 5, 2019

oh, I know what happen, this MAX_LINE should not be hard code, should be configurable

pub(crate) static MAX_LINE: usize = 4096;

rustyline/src/edit.rs

Lines 44 to 59 in 7e30f8d

pub fn new(
out: &'out mut <Terminal as Term>::Writer,
prompt: &'prompt str,
helper: Option<&'out H>,
ctx: Context<'out>,
) -> State<'out, 'prompt, H> {
let capacity = MAX_LINE;
let prompt_size = out.calculate_position(prompt, Position::default());
State {
out,
prompt,
prompt_size,
line: LineBuffer::with_capacity(capacity),
cursor: prompt_size,
old_rows: 0,
saved_line_for_history: LineBuffer::with_capacity(capacity),

You can pass a buffer capacity here via edit config instead of hard code:

let mut s = State::new(&mut stdout, prompt, helper, ctx);

Is this right?

@gwenn
Copy link
Collaborator

gwenn commented Aug 5, 2019

I suggest we remove the limit.
liner, linefeed, replxx, python-prompt-toolkit have no limit.
But editing will be slow.

@driftluo
Copy link
Contributor Author

driftluo commented Aug 6, 2019

A long time ago, in linefeed, I did ask a question about performance.

I think for now, the default pre-allocation of 4096 capacity, and allowing growth may be a good balance of results.

I try to make a pr now :P

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

Successfully merging a pull request may close this issue.

2 participants