端末ウィンドウの特定の位置にカーソルを移動する Posix コマンド

端末ウィンドウの特定の位置にカーソルを移動する Posix コマンド

学校では、ASCIIアートをターミナルウィンドウに印刷する必要があります。入力はフォーマットデータです[x_coordinate, y_coordinate, char_ascii_value](文字を印刷しない座標データはありません)。実際にこれを行うのに問題はありませんが、forループに入って文字データがないたびにスペースを印刷してから、端末の別の行に移動して同じ操作を実行するのはあまりにも怠惰です。ものなど

だからもっと簡単な方法があると思いました! POSIXのコマンドのみを使用できますが、端末の特定の位置にカーソルを移動できるコマンドはありますか?

tput私は私が必要とするものを正確に実行するコマンドを見つけましたが、それがPOSIXにtput cupあるかどうかはわかりません。tput cup

PS:これを一種の不正行為と見なさないでください。何も考えずにコーディングせずに私の人生をより簡単にする方法を探したいだけです。

答え1

〜のようにマックサイフPOSIXが指定されていないことを説明しますtput cup確かに指定tputしかし、最低限だけ。つまり、tput cup幅広い支持を受けているということです!

カーソル位置を指定する標準化された方法は、次を使用することです。ANSIエスケープシーケンス。カーソルを配置するには、次のものを使用できます。

printf "\33[%d;%dH%s" "$Y" "$X" "$CHAR"

$CHAR$Yと列に印刷されます$X。より完全な解決策は

printf "\337\33[%d;%dH%s\338" "$Y" "$X" "$CHAR"

これによりカーソル位置が復元されます。

答え2

tputX / Open Cursesにはより詳細な仕様があるため、POSIXに難読化と最小化を残します。

後者のHTMLバージョン(特にコマンドライン)への直接リンクはないようですが、tputより詳細です(約2倍の長さ)。 X / Open Cursesの説明を引用すると、次のようになります。

7319 When XCURSES is supported, this description for the tput utility replaces that in the XC
7320 specification.
7321 The tput utility uses the terminfo database to make the values of terminal-dependen
7322 capabilities and information available to the shell (see sh in the XCU specification); to clear
7323 initialize, or reset the terminal; or to return the long name of the requested terminal type. Th
7324 tput utility outputs a string if the capability attribute (capname) is of type string, or an integer i
7325 the attribute is of type integer. If the attribute is of type boolean, tput simply sets the exit statu
7326 (0 for TRUE if the terminal has the capability, 1 for FALSE if it does not), and produces n
7327 output.

プログラムが検索します。どの端末データベースの値です。あなたが使用するほとんどのプラットフォームはX / Open Cursesの実装を提供します。もちろん詳細な内容は異なる場合があります。一部のプラットフォームでは、以下を使用するtputバージョンが表示されることがあります。用語キャップ代わりに名前用語情報。しかし、宿題でこのような状況が発生する可能性はほとんどありません。「POSIX」にもかかわらず、少し異なる語彙を使用して同じ目標を達成することができます。

しかし、両方呪い...でもないANSIエスケープシーケンスPOSIXの一部です。エスケープシーケンスはECMA-48で標準化した。

通常、POSIXは他の標準(この規則のほとんどの例外を見つけることができるC標準)とあまり重複しません。同様に、X / Open CursesはECMA-48とあまり重複しません。エスケープシーケンスの形式と内容は、そのドキュメントで詳しく説明されていません。

厳密に言えば、POSIXを使用して操作を完了することはできません。 POSIXと通常はシステムに実装されている関連標準分類を使用する必要があります。

tputこのようなアプリケーション(およびそのようなライブラリ)がある理由は、curses実装間の詳細と不一致を隠すレイヤを提供するためです。 POSIX はこれまでしか行われておらず、ユーザー管理、セキュリティ、そしてもちろん管理端末などのオペレーティングシステムの興味深い機能のほとんどを無視しています。エスケープシーケンスを使用しても、さまざまな端末でカーソルを移動する方法はいくつかあります。ここにいくつかあります用語情報要約すると、次のようになります。

   carriage_return           cr     cr   carriage return (P*)
                                         (P*)

   column_address            hpa    ch   horizontal position
                                         #1, absolute (P)

   cursor_address            cup    cm   move to row #1 col-
                                         umns #2

   cursor_down               cud1   do   down one line

   cursor_home               home   ho   home cursor (if no
                                         cup)

   cursor_left               cub1   le   move left one space

   cursor_mem_address        mrcup  CM   memory relative cur-
                                         sor addressing, move
                                         to row #1 columns #2

   cursor_right              cuf1   nd   non-destructive

   cursor_to_ll              ll     ll   last line, first
                                         column (if no cup)

   cursor_up                 cuu1   up   up one line
                                         space (move right
                                         one space)

   parm_left_cursor          cub    LE   move #1 characters
                                         to the left (P)

   parm_right_cursor         cuf    RI   move #1 characters
                                         to the right (P*)

   restore_cursor            rc     rc   restore cursor to
                                         position of last

   row_address               vpa    cv   vertical position #1
                                         absolute (P)

   save_cursor               sc     sc   save current cursor
                                         position (P)

   tab                       ht     ta   tab to next 8-space
                                         hardware tab stop

                                         save_cursor

関連情報