2007年12月2日日曜日

D言語で自作のプロンプトをつくりたい(その2)

 前に自作のプロンプトをつくりたいと思ってサンプルだけつくったのですが、getcだと[tab]キーが取得できないことが判明。しかも[enter]キーを押した段階でしか文字列を取得して処理が走らないということで、それだと[tab]キー押して候補表示とかできないじゃん!

 案としては
  1. getch で1文字ずつ取得してカーソル制御は自前でなんとかする(BSキーの対応とか、カーソル移動とか)
  2. getc、getcharでなんとか[tab]キー取得できないの?
とか考えたのですが、調べてみても結局getcharはわからずじまいだったので、 getchで自分でカーソル制御を実装することにしました。

import std.stdio;
import std.process;
import std.c.stdio;

void main(){

int c;
string com;
bool loop = true;

printf(">");

while(loop){

c = getch();

switch(c){
case 13: // ret

if(com == "exit"){
// loop exit
loop = false;
} else {
// cmd execute
printf("\n");
system(com);
}
com.length = 0;
printf("\n");
printf(">");
break;

default:
if(c < 0x100){
// hankaku
com ~= c;
} else {
// zenkaku
com ~= c & 0xff;
com ~= c >> 8;
}
printf("%s",&c);
}
}
}



 最初、getchで全角文字が取得できなくて途方に暮れかけたのですが、戻り値を char で受けてたのが原因でした。int型でもらえば全然大丈夫。考えてみれば当たり前か。

 これからカーソルの操作について処理を増やしていく予定。あとgetchだと[DELETE]キーの取得ができないのは何故?Ctrl+Dで代用する予定だからいいのですが、どれも帯に短しタスキに長し。。。

0 件のコメント: