【发布时间】:2020-06-11 11:25:44
【问题描述】:
我在 Node.js 中有我的语言的 REPL,当用户手动输入文本并按 Enter 时,我会自动缩进行,这样他就可以缩进文本。问题是当他复制/粘贴有缩进的文本时,它有双重缩进。
问题是我在换行之前添加了缩进。所以我解决这个问题的想法是在用户按下回车并且他已经有空格之后如何删除我的空格(重写行)。但我不知道该怎么做。是否可以使用一些 ANSI 代码。
我的完整 REPL 如下所示:
if (process.stdin.isTTY) {
console.log(banner);
}
var prompt = 'lips> ';
var continuePrompt = '... ';
var terminal = !!process.stdin.isTTY && !(process.env.EMACS || process.env.INSIDE_EMACS);
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: prompt,
terminal
});
if (process.stdin.isTTY) {
rl.prompt();
}
var code = '';
var multiline = false;
var resolve;
var newline;
// we use promise loop to fix issue when copy paste list of S-Expression
var prev_eval = Promise.resolve();
boostrap(interp).then(function() {
rl.on('line', function(line) {
code += line.replace(/^\s+/, '') + '\n';
try {
if (balanced_parenthesis(code)) {
rl.pause();
prev_eval = prev_eval.then(function() {
var result = run(code, interp);
code = '';
return result;
}).then(function(result) {
if (process.stdin.isTTY) {
print(result);
if (newline) {
// readline don't work with not endend lines
// it ignore those so we end then ourselfs
process.stdout.write("\n");
newline = false;
}
if (multiline) {
rl.setPrompt(prompt);
multiline = false;
}
rl.prompt();
}
rl.resume();
}).catch(function() {
if (process.stdin.isTTY) {
if (multiline) {
rl.setPrompt(prompt);
multiline = false;
}
rl.prompt();
}
});
} else {
multiline = true;
var ind = indent(code, 2, prompt.length - continuePrompt.length);
rl.setPrompt(continuePrompt);
rl.prompt();
var spaces = new Array(ind + 1).join(' ');
if (terminal) {
rl.write(spaces);
} else {
process.stdout.write(spaces);
code += spaces;
}
}
} catch (e) {
console.error(e.message);
code = '';
rl.prompt();
}
});
});
我正在使用 rl.write(spaces);在用户键入他的行后的多行命令中,我需要检查是否
我认为我需要修改 Node.js Readline 中有光标的行。
我试过了:
rl.on('line', function(line) {
if (line.match(/^\s/)) {
rl.write(null, { ctrl: true, name: 'u' });
rl.write((multiline ? continuePrompt : prompt) + line);
}
line = line.replace(/^\s+/, '');
code += line + '\n';
和
rl.on('line', function(line) {
var have_spaces = line.match(/^\s/);
line = line.replace(/^\s+/, '');
if (have_spaces) {
rl.pause();
process.stdout.write('\x1b[1K\x1b[0K' + line);
rl.resume();
}
code += line + '\n';
但是在我按下回车后两者都只是在下一行回显,而不是有光标所在的行。如何修改有光标的行?我对能够做到这一点的图书馆感到满意,但我找不到任何有用的东西。
【问题讨论】:
标签: javascript node.js readline