2011-04-03 21 views
0

ヒストリをスクロールすると、プロンプトでテキストが変わる。私は関係する構造を見てきましたが、上にあるすべてのテキストを変更することなく画面上のテキストをどのように変更するかを調べるためにソースコード内を十分に深く見ていませんでした(プロンプト、過去のテキストが印刷されています)。ヒストリ - テキストを所定の場所にスクロールする(上矢印 - >場所にあるコマンドは同じだが同じ場所)

プロンプト後にわずかな変更だけで画面を消去し、すべてを再印刷することはできません。これは非常に効率が悪いことです。彼らはどのようにこれを行うのですか?

恐らく実際には聞こえませんが、プロンプトにカーソルを移動させる結果となるバックスペース文字を印刷してみました。

テキストを印刷してそれを変更したり、テキストを所定の位置に移動する方法を理解できません。

これがどのように行われているか知っていれば、本当に感謝します。

おかげ

答えて

3

bashはこれを行うにはGNU readline libraryを使用しています。最終的にはterminfoライブラリ(System Vまたはncurses library)のラッパーです。その目的は、ターミナルの説明を使用してその更新方法を理解することです。端末タイプが不明であるか間違って宣言されていると、ガベージになったり、すべてのきれいなインプレースアップデートがなくなることに気付くでしょう。

端末記述が

xterm-color|nxterm|generic color xterm, 
     am, km, mir, msgr, xenl, 
     colors#8, cols#80, it#8, lines#24, [email protected], pairs#64, 
     acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~, 
     bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=^M, 
     csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H, 
     cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C, 
     cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A, 
     dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J, 
     el=\E[K, enacs=\E)0, home=\E[H, ht=^I, hts=\EH, il=\E[%p1%dL, 
     il1=\E[L, ind=^J, 
     is2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8, kbs=^H, 
     kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA, 
     kdch1=\E[3~, kf1=\E[11~, kf10=\E[21~, kf11=\E[23~, 
     kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~, 
     kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~, 
     kf2=\E[12~, kf20=\E[34~, kf3=\E[13~, kf4=\E[14~, 
     kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~, 
     kfnd=\E[1~, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~, 
     kslt=\E[4~, meml=\El, memu=\Em, op=\E[m, rc=\E8, rev=\E[7m, 
     ri=\EM, rmacs=^O, rmcup=\E[2J\E[?47l\E8, rmir=\E[4l, 
     rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m, 
     rs2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8, sc=\E7, 
     setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr0=\E[m, smacs=^N, 
     smcup=\E7\E[?47h, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m, 
     smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n, 
     u8=\E[?1;2c, u9=\E[c, 

のようなものを見て、さまざまな画面の更新を行う方法について説明し、どのような機能とアクションキーが利用可能であり、彼らが送る何を、そして特別なターミナル行動(ライン描画文字、色、他の形式の強調表示、行の途中に文字を挿入できるかどうかなど)。何かが間違って設定されていないか、高度な端末ハッカーになっていない限り、通常は理解する必要はありません。 (あなたははそれを理解したいです場合は、terminfo(5)およびその他のcurses/ncurses/terminfoドキュメントで始まる。何もない場合は、あなたが本当に空想のシェルプロンプトを作成する方法を学びます。)

+0

はどうもありがとうございます!これはまさに私が探していたものです。 – aitee

関連する問題