Im Terminal Cursor positionieren

Post Reply
Message
Author
pcAlko
Posts: 70
Joined: 14. May 2007 19:27

Im Terminal Cursor positionieren

#1 Post by pcAlko »

Hallo Leute!

Ich würde gerne im Terminal (mit C) einen Mehrzeiligen Text ausgeben
und diesen immer wieder aktualisieren.
So wie top oder htop

Also nicht dass ich immer Zeile für Zeile ausgebe
dann rauscht der text immer nach oben und wird unübersichtlich.

Also sagen wir mal ganz einfach die Cursorposition bestimmen
wo das ganze ausgegeben werden soll.

Hat da irgendjemand eine Idee?

Danke
8) pcAlko

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#2 Post by Janka »

Dafür kannst du z.B. ncurses benutzen.

Quick&Dirty geht aber auch:

Code: Select all

$ infocmp
#       Reconstructed via infocmp from file: /usr/share/terminfo/x/xterm
xterm|xterm terminal emulator (X Window System),
        am, bce, km, mc5i, mir, msgr, npc, xenl,
        colors#8, cols#80, it#8, lines#24, pairs#64,
        acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, civis=\E[?25l,
        clear=\E[H\E[2J, cnorm=\E[?12l\E[?25h, 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,
        cvvis=\E[?12;25h, dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM,
        dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K, el1=\E[1K,
        flash=\E&#91;?5h$<100/>\E&#91;?5l, home=\E&#91;H, hpa=\E&#91;%i%p1%dG,
        ht=^I, hts=\EH, ich=\E&#91;%p1%d@, il=\E&#91;%p1%dL, il1=\E&#91;L,
        ind=^J, indn=\E&#91;%p1%dS, invis=\E&#91;8m,
        is2=\E&#91;!p\E&#91;?3;4l\E&#91;4l\E>, kDC=\E&#91;3;2~, kEND=\E&#91;1;2F,
        kHOM=\E&#91;1;2H, kIC=\E&#91;2;2~, kLFT=\E&#91;1;2D, kNXT=\E&#91;6;2~,
        kPRV=\E&#91;5;2~, kRIT=\E&#91;1;2C, kb2=\EOE, kbs=\177, kcbt=\E&#91;Z,
        kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
        kdch1=\E&#91;3~, kend=\EOF, kent=\EOM, kf1=\EOP, kf10=\E&#91;21~,
        kf11=\E&#91;23~, kf12=\E&#91;24~, kf13=\E&#91;2P, kf14=\E&#91;2Q,
        kf15=\E&#91;2R, kf16=\E&#91;2S, kf17=\E&#91;15;2~, kf18=\E&#91;17;2~,
        kf19=\E&#91;18;2~, kf2=\EOQ, kf20=\E&#91;19;2~, kf21=\E&#91;20;2~,
        kf22=\E&#91;21;2~, kf23=\E&#91;23;2~, kf24=\E&#91;24;2~, kf25=\E&#91;5P,
        kf26=\E&#91;5Q, kf27=\E&#91;5R, kf28=\E&#91;5S, kf29=\E&#91;15;5~,
        kf3=\EOR, kf30=\E&#91;17;5~, kf31=\E&#91;18;5~, kf32=\E&#91;19;5~,
        kf33=\E&#91;20;5~, kf34=\E&#91;21;5~, kf35=\E&#91;23;5~,
        kf36=\E&#91;24;5~, kf37=\E&#91;6P, kf38=\E&#91;6Q, kf39=\E&#91;6R,
        kf4=\EOS, kf40=\E&#91;6S, kf41=\E&#91;15;6~, kf42=\E&#91;17;6~,
        kf43=\E&#91;18;6~, kf44=\E&#91;19;6~, kf45=\E&#91;20;6~,
        kf46=\E&#91;21;6~, kf47=\E&#91;23;6~, kf48=\E&#91;24;6~, kf49=\E&#91;3P,
        kf5=\E&#91;15~, kf50=\E&#91;3Q, kf51=\E&#91;3R, kf52=\E&#91;3S,
        kf53=\E&#91;15;3~, kf54=\E&#91;17;3~, kf55=\E&#91;18;3~,
        kf56=\E&#91;19;3~, kf57=\E&#91;20;3~, kf58=\E&#91;21;3~,
        kf59=\E&#91;23;3~, kf6=\E&#91;17~, kf60=\E&#91;24;3~, kf61=\E&#91;4P,
        kf62=\E&#91;4Q, kf63=\E&#91;4R, kf7=\E&#91;18~, kf8=\E&#91;19~, kf9=\E&#91;20~,
        kfnd=\E&#91;1~, khome=\EOH, kich1=\E&#91;2~, kind=\E&#91;1;2B,
        kmous=\E&#91;M, knp=\E&#91;6~, kpp=\E&#91;5~, kri=\E&#91;1;2A, kslt=\E&#91;4~,
        mc0=\E&#91;i, mc4=\E&#91;4i, mc5=\E&#91;5i, meml=\El, memu=\Em,
        op=\E&#91;39;49m, rc=\E8, rev=\E&#91;7m, ri=\EM, rin=\E&#91;%p1%dT,
        rmacs=\E&#40;B, rmam=\E&#91;?7l, rmcup=\E&#91;?1049l, rmir=\E&#91;4l,
        rmkx=\E&#91;?1l\E>, rmm=\E&#91;?1034l, rmso=\E&#91;27m, rmul=\E&#91;24m,
        rs1=\Ec, rs2=\E&#91;!p\E&#91;?3;4l\E&#91;4l\E>, sc=\E7,
        setab=\E&#91;4%p1%dm, setaf=\E&#91;3%p1%dm,
        setb=\E&#91;4%?%p1%&#123;1&#125;%=%t4%e%p1%&#123;3&#125;%=%t6%e%p1%&#123;4&#125;%=%t1%e%p1%&#123;6&#125;%=%t3%e%p1%d%;m,
        setf=\E&#91;3%?%p1%&#123;1&#125;%=%t4%e%p1%&#123;3&#125;%=%t6%e%p1%&#123;4&#125;%=%t1%e%p1%&#123;6&#125;%=%t3%e%p1%d%;m,
        sgr=%?%p9%t\E&#40;0%e\E&#40;B%;\E&#91;0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m,
        sgr0=\E&#40;B\E&#91;m, smacs=\E&#40;0, smam=\E&#91;?7h, smcup=\E&#91;?1049h,
        smir=\E&#91;4h, smkx=\E&#91;?1h\E=, smm=\E&#91;?1034h, smso=\E&#91;7m,
        smul=\E&#91;4m, tbc=\E&#91;3g, u6=\E&#91;%i%d;%dR, u7=\E&#91;6n,
        u8=\E&#91;?1;2c, u9=\E&#91;c, vpa=\E&#91;%i%p1%dd,
Das sind die Codes für xterm. Jedes Terminal hat andere Codes zum Bewegen des Cursors etc.

Schreib dir die Codes für "cuu1" (Cursor hoch) und "cub1" (Cursor links) raus, z.B. mit

Code: Select all

$tput cuu1 | od -tx1
0000000 1b 5b 41
0000003
$ tput cub1 | od -tx1
0000000 08
0000001
und benutz diese in Strings in deinem C-Programm. Das funktioniert aber nur mit dem Terminal, das du bei "infocmp" angegeben hast. Wenn du ordentlich programmieren willst, nimm ncurses, das benutzt automatisch die terminfo-Datei, die zu dem jeweiligen Terminal passt und ist auch komfortabler und oft viel schneller, besonders auf "echten" seriell angeschlossenen Terminals.

$ man ncurses
$ man infocmp
$ man terminfo

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

pcAlko
Posts: 70
Joined: 14. May 2007 19:27

#3 Post by pcAlko »

Danke,
dann werd ich mich mal mit dem ncurses beschäftigen.

8) pcAlko

Post Reply