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 F
auf 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 eol
Einstellung 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 eol
Einstellung dient lediglich dazu, dem Treiber mitzuteilen, dass er als Zeilenendezeichen ein anderes (zusätzliches) Zeichen ^J
als 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, cat
der 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 zsh
folgendermaß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>OF
End
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 $TERM
Variable. 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 minicom
ein modernes xterm
-ähnliches Terminal und kommunizieren seriell. Am anderen Ende der seriellen Leitung getty
verwenden 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 xterm
Eintrag in Terminfo, aber ihm fehlt die kend
Funktionalitä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 $TERM
auf denselben Wert wie dort zu setzen, die TERMINFO
Umgebungsvariable 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=\EOF
Ihres Terminals bearbeiten, den Namen ändern und es tic
erneut 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-device
ist, was auch immer tty
ausgegeben wird, wenn Sie sich über die serielle Schnittstelle anmelden.