Как я могу использовать комбинацию клавиш ctrl+ eв режиме emacs, чтобы перейти к концу строки, но также иметь возможность использовать клавишу Endдля того же самого? Как мне установить это с помощью stty? Я попробовал эту комбинацию, скопированную из терминала linux:
stty eol M-^?
но когда я нажимаю, Endя попадаю F
на клавиатуру.
Система старая ATT System V на терминале minicom. Мой термин — 386AT, а это определение terminfo
# 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,
решение1
Эта eol
настройка не предназначена для клавиши, которая перенесет вас в конец буфера редактирования строки, это настройка дисциплины линии tty.
Это для его самого простого редактора строк, который используется при вводе ввода для приложений (например cat
, sed
), которые не имеют собственного редактора строк. Этот редактор не имеет позиционирования курсора, единственноередактированиеэто можно сделать с помощью клавиш backspace ( stty erase
), Ctrl+W ( stty werase
) и Ctrl+U ( stty kill
), возможно, больше в некоторых системах.
Это делается в самом драйвере устройства tty в ядре, приложения ( cat
, sed
...) не видят эти символы.
Настройка eol
нужна только для того, чтобы сообщить драйверу, что нужно распознавать другой (дополнительный) символ из перевода строки (он же newline, он же ^J
) как символ конца строки. После ввода этого символа дисциплина строки отправит введенные символы в приложение для чтения.
Например, чтобы вводить текст по одному слову, а не по одной строке, можно сделать следующее:
stty eol ' '; cat
И вы увидите, что каждый раз при нажатии пробела cat
будет выводиться введенный вами текст (включая этот символ пробела).
Если вы находитесь в командной строке команды, которая реализует свой собственный редактор строк, то Endперемещение курсора в конец текущего буфера будет выполнено не посредством, stty
а с помощью специальной конфигурации этой команды (если вообще будет выполнено).
Например, в случае с zsh
оболочкой это можно сделать так:
bindkey '^[[F' end-of-line
bindkey '^[OF' end-of-line
Предположим, что ваш терминал отправляет последовательность символов <ESC>[F
или <ESC>OF
при нажатии этой Endклавиши, как предполагает ваша «F».
Некоторые приложения автоматически привязываются Endк своему действию _end-of_line_. Для этого они будут запрашивать локальные базы данных терминалов termcap или terminfo, чтобы узнать, какую последовательность символов ваш терминал отправляет при нажатии этой клавиши.
Для этого они используют $TERM
переменную. Если запись для этого ключа в этой базе данных не соответствует тому, что посылает ваш терминал, то это не сработает.
Можешь попробовать:
tput kend | sed -n l
Чтобы увидеть, что база данных Endотправляет ключ, если ваш tput использует terminfo или проверьте запись $TERM в /etc/termcap, если вы используете termcap. Вы можете найти там запись, которая более точно соответствует поведению вашего minicom (или эмулятора терминала, на котором он размещен).
Редактировать на основе новой информации
Итак, скорее всего, вы работаете minicom
в современном xterm
терминале и общаетесь через последовательный порт. На другом конце последовательной линии getty
предполагается, что вы работаете с консолью at386 (которая, как я полагаю, на самом деле является внутренним драйвером консоли старых систем AT&T на базе ПК). Это очень далеко от современного xterm.
Если взглянуть на систему Solaris, которая во многих отношениях примерно такая же современная, как ваша старая система AT&T, то xterm
в terminfo есть запись, но в ней отсутствуют kend
необходимые возможности.
Что вы можете сделать, так это загрузить определение terminfo вашего терминала на машину, на которой вы запускаете minicom ( infocmp > file
), перенести его на машину SysV и попытаться скомпилировать его там tic
(и установить $TERM
то же значение там, TERMINFO
предварительно установив переменную окружения на что-то вроде того, ~/.terminfo
если вы не являетесь администратором там). Если это не сработает из-за того, что версия curses слишком старая, вы можете вместо этого использовать запись vt100 системы AT&T и просто отредактировать в kend=\EOF
вашем терминале, изменить имя и использовать tic
снова.
Нравиться:
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
И добавить:
if [ "`tty`" = "the-serial-device" ] && [ "$TERM" = at386 ]; then
TERMINFO=$HOME/.terminfo
TERM=my-term
export TERM TERMINFO
fi
к вашему ~/.profile
(где the-serial-device
находится то, что tty
выводится при входе через последовательный порт.