爲了更好地熟悉C++,我重做了一箇舊的大學OS作業:編寫自己的shell。我處理的第一件事是接受命令,但我的方法留下了一些需要的功能。下面是我有:正確的字符輸入?
string GetLine() {
string line;
char input = _getch();
while (input != 13) {
switch (input) {
case 8: // backspace
if (line.length() != 0) {
line = line.substr(0, line.length() - 1);
cout << "\b \b";
}
break;
case -32: // all arrows' first byte
input = _getch(); // distinctly different arrow byte
switch (input) {
case 72: // up
break;
case 80: // down
break;
case 75: // left
break;
case 77: // right
break;
}
break;
case 9: // tab
break;
default:
line += input;
cout << input;
break;
}
input = _getch();
}
cout << endl;
return line;
}
它工作得很好,我知道我有更多的是用箭頭鍵(如果我連他們區分正確的是)。我所問的主要問題是某些情況,光標已經纏繞到終端上的下一行。旨在模擬cmd.exe
我打印提示,並在其末尾等待用戶的輸入。當這個提示很長時,只需要幾個字符,然後我的命令在兩行之間運行。如果我只是輸入它,讓它環繞並按輸入一切工作正常。如果我換行到第二行並想退回到第一行,光標會停在新行的第一個字符處,並且不會像我希望的那樣「打開」回第一行。我可以在這裏做什麼來實現這種展開行爲?
我認爲問題是試圖打印'\ b'不會打開,但我沒有一個替代方案的想法,我希望我不必把這作爲一個特例並且將在行的中間退格的代碼也將在行的開頭起作用。
您是否有能力使用libreadline?這樣可以在處理這件事時爲你節省很多心痛,並且有一整套技巧(如命令歷史等) –