stty auf altem AT&T-Unix: Wie fügt man die End-Taste für „Zeilenende“ hinzu?

stty auf altem AT&T-Unix: Wie fügt man die End-Taste für „Zeilenende“ hinzu?

ctrlWie kann ich im Emacs-Modus die Tastenkombination + verwenden, eum ans Zeilenende zu gelangen, und gleichzeitig die EndTaste verwenden, um dasselbe zu tun? Wie stelle ich das mit stty ein? Ich habe diese Kombination ausprobiert, die ich aus dem Linux-Terminal kopiert habe:

stty eol M-^?

aber wenn ich drücke, Endgelange ich Fauf die Tastatur.

Das System ist das alte ATT System V auf einem Minicom-Terminal. Mein Begriff ist 386AT und dies ist die Terminfo-Definition

#       Reconstructed via infocmp from file: /usr/share/lib/terminfo/3/386AT
AT386|at386|386AT|386at|at/386 console @(#)386.ti 1.4,
        am, bw, eo, xon,
        colors#8, cols#80, lines#25, ncv#3, pairs#64,
        acsc=``aaffggjYk?lZm@nEooppqDrrsstCu4vAwBx3yyzz{{||}}~~,
        bel=^G, blink=\E[5m, bold=\E[1m, clear=\E[2J\E[H,
        cr=\r, cub=\E[%p1%dD, cub1=\E[D, cud=\E[%p1%dB,
        cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
        cup=\E[%i%p1%02d;%p2%02dH, cuu=\E[%p1%dA, cuu1=\E[A,
        dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[1M,
        ed=\E[J, el=\E[K, flash=^G, home=\E[H, ht=\t,                                                                   
        ich=\E[%p1%d@, ich1=\E[1@, il=\E[%p1%dL, il1=\E[1L,                                                             
        ind=\E[S, indn=\E[%p1%dS, invis=\E[9m, is2=\E[0;10m,                                                            
        kbs=\b, kcbt=^], kclr=\E[2J, kcub1=\E[D, kcud1=\E[B,                                                            
        kcuf1=\E[C, kcuu1=\E[A, kdch1=\E[P, kend=\E[Y,                                                                  
        kf1=\EOP, kf10=\EOY, kf11=\EOZ, kf12=\EOA, kf2=\EOQ,                                                            
        kf3=\EOR, kf4=\EOS, kf5=\EOT, kf6=\EOU, kf7=\EOV,                                                               
        kf8=\EOW, kf9=\EOX, khome=\E[H, kich1=\E[@, knp=\E[U,                                                           
        kpp=\E[V, krmir=\E0, op=\E[0m,                                                                                  
        pfx=\EQ%p1%{1}%-%d'%p2%s', rev=\E[7m, rin=\E[S,                                                                 
        rmacs=\E[10m, rmso=\E[m, rmul=\E[m, setab=\E[4%p1%dm,                                                           
        setaf=\E[3%p1%dm,                                                                                               
        setb=\E[4%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,                                    
        setf=\E[3%?%p1%{1}%=%t4%e%p1%{3}%=%t6%e%p1%{4}%=%t1%e%p1%{6}%=%t3%e%p1%d%;m,                                    
        sgr=\E[10m\E[0%?%p1%p3%|%t;7%;%?%p2%t;4%;%?%p4%t;5%;%?%p6%t;1%;%?%p9%t;12%;%?%p7%t;9%;m,                        
        sgr0=\E[0;10m, smacs=\E[12m, smso=\E[7m, smul=\E[4m,   

Antwort1

Diese eolEinstellung ist nicht für die Taste gedacht, die Sie an das Ende eines Zeilenbearbeitungspuffers bringen würde, sondern es handelt sich um eine Einstellung der TTY-Zeilendisziplin.

Es handelt sich um einen sehr einfachen Zeileneditor, der zur Eingabe von Eingaben für Anwendungen (wie cat, sed) verwendet wird, die keinen eigenen Zeileneditor haben. Dieser Editor verfügt nicht über eine Cursorpositionierung, die einzigeBearbeitungDie Tastenkombination ist die Rücktaste ( stty erase), Strg+W ( stty werase) und Strg+U ( stty kill), auf manchen Systemen möglicherweise auch mehr.

Dies geschieht im TTY-Gerätetreiber selbst im Kernel, die Anwendungen ( cat, sed...) sehen diese Zeichen nicht.

Die eolEinstellung dient lediglich dazu, dem Treiber mitzuteilen, dass er als Zeilenendezeichen ein anderes (zusätzliches) Zeichen ^Jals den Zeilenvorschub (auch Newline oder ) erkennen soll. Bei der Eingabe dieses Zeichens sendet die Zeilendisziplin die bis dahin eingegebenen Zeichen an die Leseanwendung.

Um beispielsweise Text Wort für Wort statt Zeile für Zeile einzugeben, können Sie Folgendes tun:

stty eol ' '; cat

Und Sie würden sehen, dass jedes Mal, wenn Sie die Leertaste drücken, catder von Ihnen eingegebene Text (einschließlich des Leerzeichens) ausgegeben würde.

Wenn Sie sich an der Eingabeaufforderung eines Befehls befinden, der seinen eigenen Zeileneditor implementiert, Enderfolgt die Bewegung des Cursors an das Ende des aktuellen Puffers stty(sofern überhaupt) nicht über diesen Befehl, sondern durch dessen spezifische Konfiguration.

Mit der Shell würde dies beispielsweise zshfolgendermaßen geschehen:

bindkey '^[[F' end-of-line
bindkey '^[OF' end-of-line

Vorausgesetzt, Ihr Terminal sendet die Zeichenfolge <ESC>[F„oder“ , wenn Sie diese Taste drücken, wie Ihr „F“ vermuten lässt.<ESC>OFEnd

Einige Anwendungen binden sich automatisch Endan ihre _End-of-Line_-Aktion. Dazu fragen sie die lokalen Termcap- oder Terminfo-Terminaldatenbanken ab, um herauszufinden, welche Zeichenfolge Ihr Terminal bei diesem Tastendruck sendet.

Dazu verwenden sie die $TERMVariable. Wenn der Eintrag für diesen Schlüssel in dieser Datenbank nicht mit dem übereinstimmt, was Ihr Terminal sendet, funktioniert das nicht.

Du kannst es versuchen:

tput kend | sed -n l

Um zu sehen, was die Datenbank mit dem EndSchlüssel sendet, wenn Ihr tput terminfo verwendet, oder suchen Sie nach Ihrem $TERM-Eintrag in /etc/termcap, wenn Sie termcap verwenden. Möglicherweise finden Sie dort einen Eintrag, der dem Verhalten Ihres Minicom (oder des Terminalemulators, der es hostet) besser entspricht.

Bearbeiten basierend auf neuen Informationen

Sie verwenden also höchstwahrscheinlich minicomein modernes xterm-ähnliches Terminal und kommunizieren seriell. Am anderen Ende der seriellen Leitung gettyverwenden Sie vermutlich eine at386-Konsole (die meines Wissens tatsächlich der interne Konsolentreiber alter PC-basierter AT&T-Systeme ist). Das ist weit entfernt von einem modernen xterm.

Wenn man sich hier ein Solaris-System ansieht, das in vieler Hinsicht ungefähr so ​​modern ist wie Ihr altes AT&T-System, gibt es zwar einen xtermEintrag in Terminfo, aber ihm fehlt die kendFunktionalität.

Was Sie tun könnten, ist, die Terminfo-Definition Ihres Terminals auf dem Computer hochzuladen, auf dem Sie Minicom ausführen ( infocmp > file), diese auf den SysV-Computer zu übertragen und zu versuchen, sie dort zu kompilieren tic(und $TERMauf denselben Wert wie dort zu setzen, die TERMINFOUmgebungsvariable vorher auf etwas wie zu setzen ~/.terminfo, wenn Sie dort kein Administrator sind). Wenn das nicht funktioniert, weil die Curses-Version zu alt ist, könnten Sie stattdessen den vt100-Eintrag des AT&T-Systems verwenden, einfach die kend=\EOFIhres Terminals bearbeiten, den Namen ändern und es ticerneut verwenden.

Wie:

cat > my-term.info << \EOF
my-term|My VT100 compatible terminal with an end-key,
    am, mir, msgr, xenl, xon,
    cols#80, it#8, lines#24, vt#3,
    acsc=``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
    bel=^G, blink=\E[5m$<2>, bold=\E[1m$<2>,
    clear=\E[H\E[J$<50>, cr=\r, csr=\E[%i%p1%d;%p2%dr,
    cub=\E[%p1%dD, cub1=\b, cud=\E[%p1%dB, cud1=\n,
    cuf=\E[%p1%dC, cuf1=\E[C$<2>,
    cup=\E[%i%p1%d;%p2%dH$<5>, cuu=\E[%p1%dA,
    cuu1=\E[A$<2>, ed=\E[J$<50>, el=\E[K$<3>,
    el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=\t,
    hts=\EH, ind=\n, ka1=\EOq, ka3=\EOs, kb2=\EOr, kbs=\b,
    kc1=\EOp, kc3=\EOn, kcub1=\EOD, kcud1=\EOB,
    kcuf1=\EOC, kcuu1=\EOA, kent=\EOM, kf0=\EOy, kf1=\EOP,
    kf10=\EOx, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kf5=\EOt,
    kf6=\EOu, kf7=\EOv, kf8=\EOl, kf9=\EOw, rc=\E8,
    rev=\E[7m$<2>, ri=\EM$<5>, rmacs=^O, rmkx=\E[?1l\E>,
    rmso=\E[m$<2>, rmul=\E[m$<2>,
    rs2=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h, sc=\E7,
    sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t^N%e^O%;,
    sgr0=\E[m^O$<2>, smacs=^N, smkx=\E[?1h\E=,
    smso=\E[1;7m$<2>, smul=\E[4m$<2>, tbc=\E[3g, kend=\EOF
EOF
TERMINFO="$HOME/.terminfo" export TERMINFO
mkdir -p "$TERMINFO"
tic my-term.info

Und füge hinzu:

if [ "`tty`" = "the-serial-device" ] && [ "$TERM" = at386 ]; then
  TERMINFO=$HOME/.terminfo
  TERM=my-term
  export TERM TERMINFO
fi

zu Ihrem ~/.profile(wo the-serial-deviceist, was auch immer ttyausgegeben wird, wenn Sie sich über die serielle Schnittstelle anmelden.

verwandte Informationen