我最近做了一些非常相似的事情(雖然我的代碼只是Linux)。您必須將stdin設置爲非規範模式才能讀取箭頭按鍵。這應該適用於OS X和Linux,並且可能適用於Cygwin,儘管我無法確定。
open Unix
let terminfo = tcgetattr stdin in
let newterminfo = {terminfo with c_icanon = false; c_vmin = 0; c_vtime = 0} in
at_exit (fun _ -> tcsetattr tsdin TCSAFLUSH terminfo); (* reset stdin when you quit*)
tcsetattr stdin TCSAFLUSH newterminfo;
當規範模式關閉時,您不需要等待換行符以便從標準輸入讀取。 c_vmin表示返回之前要讀取的最少字符數(您可能希望能夠一次讀取一個字符),c_vtime是最大讀取等待時間(以0.1s爲單位)。
你也可能需要設置c_echo
爲false,這樣的箭頭按鍵被打印到終端(但你必須手動打印一切。
大多數終端代表箭頭使用ANSI escape sequences按鍵。如果您運行cat
不帶任何參數,並開始打方向鍵就可以看到使用的轉義序列。他們是典型的
up - "\027[A"
down - "\027[B"
left - "\027[D"
right - "\027[C"
其中「\ 027」是esc
ASCII值
我幾乎可以做到這一點,但我應該如何管理角色的手動迴應?我問這個是因爲stdin然後被轉發到一個解析器,該解析器逐行解析並解釋它。我應該放在中間並打印出每個字符?但是當用戶按下UP鍵時,它應該將已經打印出來的字符替換爲不同的東西。 – Jack 2010-11-12 14:09:15
重新閱讀您的問題後,我認爲使用readline/ledit可能是您最好的選擇。但是如果你想手動執行,那麼你將不得不手動控制分析器的stdin。從stdin讀取,檢查一個up-char轉義序列,直到解析器的標準輸入。我在這裏做類似的東西:https://github.com/aplusbi/reflow/blob/master/reflow.ml在'main'函數中,我正在讀stdin到一個字符串,然後把它寫到一個file_descr 。你可能最終會做同樣的事情,但首先檢查轉義序列。 – 2010-11-12 15:17:30
這些箭頭字符實際上來自ECMA 48在這裏標準化http://man7.org/linux/man-pages/man4/console_codes.4.html您可以看到ECMA 48的哪些控制字符支持Linux:它似乎是向左移動光標5個字符,你可以做\ 027 [5D – aeroson 2016-11-17 09:39:51