Im Terminal Cursor positionieren

Antworten
Nachricht
Autor
pcAlko
Beiträge: 70
Registriert: 14. Mai 2007 19:27

Im Terminal Cursor positionieren

#1 Beitrag von pcAlko » 04. Dez 2008 19:14

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

Benutzeravatar
Janka
Beiträge: 3581
Registriert: 11. Feb 2006 19:10

#2 Beitrag von Janka » 04. Dez 2008 21:59

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

Quick&Dirty geht aber auch:

Code: Alles auswählen

$ 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: Alles auswählen

$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
Beiträge: 70
Registriert: 14. Mai 2007 19:27

#3 Beitrag von pcAlko » 05. Dez 2008 18:16

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

8) pcAlko

Antworten