簡體   English   中英

如何寫入 C 中的輸入部分?

[英]How to write to input part in C?

我正在嘗試為學校項目在 C 中編寫一個迷你 shell 用於學校項目,而我想做的是做一種命令歷史記錄(如在 shell 中),當我按下 UP 鍵時,它將先前的輸入寫入輸入部分, DOWN 則相反,等等...,您可以在按 Enter 之前對其進行編輯以將其發送到程序,如下所示(抱歉英語不好): [] 代表用戶 cursor

my_shell$ some input wrote by me
my_shell$ []
my_shell$ some other input
my_shell$ []
and now if I press UP
my_shell$ some other input[]
If I press UP again
my_shell$ some input wrote by me[]

我可以使用 termcaps 和其他一些函數isatty, ttyname, ttyslot, ioctl, getenv, tcsetattr, tcgetattr, tgetent, tgetflag, tgetnum, tgetstr, tgoto, tputs

問題是我無法理解ioctltty函數的文檔,我找不到關於這些函數的詳細解釋的教程和示例,也找不到我正在嘗試使用它們的文檔。

有人可以以易於理解的方式向我解釋這些功能嗎? 以及我應該如何將它們應用於我正在嘗試做的事情(我正在尋找一種 Linux-MacOs 兼容方式)感謝您的幫助。

您要問的不是微不足道的,並且需要大量的工作。 基本上,您需要做的是使用tcsetattr將終端置於非規范模式,其中終端的輸入行緩沖被禁用,並且每次擊鍵都將立即返回,而不是等待換行符。 然后,您必須自己處理每個按鍵,包括退格/刪除和向上/向下箭頭。 由於您想對行編輯進行什么操作,您可能還必須禁用回顯並自己執行回顯。

您需要自己維護當前行緩沖區,並且您還需要一個數據結構來存儲所有較舊的輸入行(歷史),並且當向上箭頭被擊中時,您需要擦除您的內容'當前已為輸入緩沖,並將其從屏幕上擦除,然后將歷史記錄復制到當前緩沖區並將其回顯到終端。

另一個復雜之處是像向上箭頭和向下箭頭這樣的鍵不是 ascii 的一部分,因此不會被讀取為單個字節——而是它們將是多字節轉義序列(可能以 ESC 開頭( '\x1b' ) 特點)。 您可以使用tgetstr來查詢終端數據庫以找出它們是什么,或者只是硬編碼您的 shell 以使用您現在看到的幾乎所有終端都使用的ANSI 序列

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM