xterm.js - получение текста текущей строки - PullRequest
0 голосов
/ 15 января 2019

Я занимаюсь разработкой небольшого xterm.js приложения (только начало работы), и мне интересно, как получить текст из текущей строки, когда пользователь нажимает клавишу ввода. Вот программа:

var term = new Terminal();
term.open(document.getElementById('terminal'));
term.prompt = () => {
  term.write('\r\n$ ');
};
term.writeln('This is a shell emulator.');
term.prompt();

term.on('key', function(key, ev) {
  const printable = !ev.altKey && !ev.altGraphKey && !ev.ctrlKey && !ev.metaKey;

  if (ev.keyCode === 13) {
    term.prompt();
    console.log(curr_line);
    var curr_line = ""
  } else if (ev.keyCode === 8) {
    // Do not delete the prompt
    if (term.x > 2) {
      curr_line = curr_line.slice(0, -1);
      term.write('\b \b');
    }
  } else if (printable) {
    curr_line += ev.key;
    console.log(curr_line, ev.key)
    term.write(key);
  }
});

term.on('paste', function(data) {
  term.write(data);
});

Пример взят с домашней страницы xterm.js (и изменен)

Как вы видите, моя попытка заключается в добавлении в строку текста каждый раз, когда я получаю событие key (или удаление на backspace). Однако это не работает, поскольку оно находится внутри асинхронной функции.

Поставляется ли xterm.js с другой функцией, которая позволяет вам получить текущее содержимое строки, или есть другой обходной путь? Мои поиски в Google оказались безрезультатными.

1 Ответ

0 голосов
/ 09 августа 2019

Не самое элегантное решение, но, перемещая "curr_line" в глобальную область, мы можем поддерживать его постоянным между событиями "по ключу".

var term = new Terminal();
term.open(document.getElementById('terminal'));
term.prompt = () => {
    term.write('\r\n$ ');
};
term.writeln('This is a shell emulator.');
term.prompt();

// Move curr_line outside of async scope.
var curr_line = '';

term.on('key', function(key, ev) {
    const printable = !ev.altKey && !ev.altGraphKey && !ev.ctrlKey && !ev.metaKey;

    if (ev.keyCode === 13) {
        term.prompt();
        console.log(curr_line);
        curr_line = '';
    } else if (ev.keyCode === 8) {
        // Do not delete the prompt
        if (term.x > 2) {
            curr_line = curr_line.slice(0, -1);
            term.write('\b \b');
        }
    } else if (printable) {
        curr_line += ev.key;
        console.log(curr_line, ev.key)
        term.write(key);
    }
});

term.on('paste', function(data) {
    term.write(data);
});

Ваш вопрос возник в поиске аналогичного решения, поэтому спасибо за его отправку! :)

...