代码之家  ›  专栏  ›  技术社区  ›  moltarze

克斯特姆。js-获取当前行文本

  •  0
  • moltarze  · 技术社区  · 7 年前

    我正在开发一个小型的 xterm.js 应用程序(刚刚开始),我想知道当用户按enter键时如何从当前行获取文本。以下是节目:

    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 事件(或在退格时删除)。但是,这不起作用,因为它位于异步函数中。

    做 克斯特姆。js 附带另一个功能,允许您获取当前行内容,或者是否有其他解决方法?我在谷歌上的搜索毫无结果。

    0 回复  |  直到 7 年前
        1
  •  5
  •   Liam Beckman    7 年前

    这不是最优雅的解决方案,但通过将“curr_line”移动到全局范围,我们可以在“on key”事件之间保持它的持久性。

    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);
    });
    

    在我寻找类似解决方案的过程中,您的问题出现了,因此感谢您提交该问题!:)

    推荐文章