stty на старых AT&T unix: как добавить клавишу End для «конца строки»?

stty на старых AT&T unix: как добавить клавишу End для «конца строки»?

Как я могу использовать комбинацию клавиш 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выводится при входе через последовательный порт.

Связанный контент