Emacs 모드에서 ctrl+ 키보드 조합을 사용하여 줄 끝으로 이동하는 e동시에 End키를 사용하여 동일한 작업을 수행할 수 있는 방법은 무엇입니까? stty로 어떻게 설정하나요? Linux 터미널에서 복사한 조합을 시도했습니다.
stty eol M-^?
하지만 누르면 키보드 End로 들어갑니다 .F
시스템은 minicom 터미널의 기존 ATT System V입니다. 내 용어는 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
이 편집기에는 커서 위치 지정 기능이 없습니다.편집하다stty erase
백스페이스( ), Ctrl+W( stty werase
), Ctrl+U( ) 를 사용하여 수행할 수 stty kill
있으며 일부 시스템에서는 더 많은 키를 사용할 수도 있습니다.
이는 커널의 tty 장치 드라이버 자체에서 수행되며 이러한 문자는 응용 프로그램( cat
, ...) sed
에 표시되지 않습니다 .
이 eol
설정은 단순히 드라이버가 ^J
개행 문자(또는 개행 문자라고도 함) 내의 다른(추가) 문자를 줄 끝 문자로 인식하도록 지시합니다. 문자가 입력되면 Line Rules는 지금까지 입력된 문자를 읽기 응용 프로그램으로 보냅니다.
예를 들어, 한 번에 한 줄씩 입력하는 대신 한 번에 한 단어씩 텍스트를 입력하려면 다음을 수행할 수 있습니다.
stty eol ' '; cat
스페이스바를 누를 때마다 cat
입력한 텍스트(스페이스 문자 포함)가 출력되는 것을 볼 수 있습니다.
자체 줄 편집기를 구현하는 명령 프롬프트에 있는 경우 End커서를 현재 버퍼의 끝으로 이동하는 것은 stty
해당 명령의 특정 구성(있는 경우)에 의해서가 아니라 수행됩니다.
예를 들어, zsh
셸의 경우 다음을 사용하여 수행할 수 있습니다.
bindkey '^[[F' end-of-line
bindkey '^[OF' end-of-line
"F"가 제안하는 대로 키를 누르면 터미널이 <ESC>[F
문자 시퀀스를 전송한다고 가정합니다.<ESC>OF
End
End일부 애플리케이션은 라인 끝 작업에 자동으로 바인딩됩니다 . 이를 위해 로컬 termcap 또는 terminfo 터미널 데이터베이스를 쿼리하여 키를 눌렀을 때 터미널에서 전송된 문자 시퀀스를 찾습니다.
이를 위해 그들은 $TERM
변수를 사용합니다. 해당 데이터베이스의 해당 키 항목이 터미널에서 보낸 내용과 일치하지 않으면 이 작업이 작동하지 않습니다.
당신은 시도 할 수 있습니다:
tput kend | sed -n l
키가 전송된 데이터베이스의 내용을 보려면 End(tput이 terminfo를 사용하는 경우) 또는 /etc/termcap에서 $TERM 항목을 확인하십시오(termcap을 사용하는 경우). 미니콤(또는 이를 호스팅하는 터미널 에뮬레이터)의 동작과 더 잘 일치하는 항목을 찾을 수 있습니다.
새로운 정보를 바탕으로 편집
따라서 아마도 minicom
최신 터미널과 같은 장치에서 실행 되고 xterm
직렬을 통해 통신하고 있을 것입니다. 직렬 회선의 다른 쪽 끝에서 getty
at386 콘솔(실제로는 구형 PC 기반 AT&T 시스템용 내부 콘솔 드라이버라고 생각함)을 실행하고 있다고 가정해 보겠습니다. 이것은 현대의 xterm과는 거리가 멀다.
여러 면에서 기존 AT&T 시스템만큼 현대적인 Solaris 시스템을 살펴보면 xterm
terminfo에 항목이 있지만 해당 kend
기능이 부족합니다.
당신이 할 수 있는 일은 터미널의 terminfo 정의를 minicom( infocmp > file
)을 실행하는 머신에 업로드하고, 이를 SysV 머신으로 전송한 후 거기에서 컴파일하는 것입니다 (그리고 거기와 동일한 값으로 tic
설정하고 , 미리 환경 변수를 다음과 같이 설정 합니다. 당신은 그곳의 관리자가 아닙니다). Curss 버전이 너무 오래되어 작동하지 않으면 AT&T 시스템용 vt100 항목을 대신 사용할 수 있습니다. 터미널에서 편집하고 이름을 변경한 후 다시 사용하면 됩니다.$TERM
TERMINFO
~/.terminfo
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