명령 행에서 Delete 키가 작동하지 않습니다


10

** 참고 : 슈퍼 유저에게도 같은 질문을했지만 아무런 응답이 없습니다. 나는 이것이 이것이이 특정한 질문에 더 적합한 포럼이라는 것을 알고 있습니다. *

ksh 쉘에서 Delete 키는 명령 행에서 제대로 작동하지 않습니다 . Delete 키를 누르면 ~가 나타납니다.

내가 어떻게 할:

  1. "커서에서 문자 삭제" 기능을 키보드 삭제 버튼에 바인딩 하시겠습니까? (Control-D는 삭제 버튼이 작동하고 별칭을 사용하려는 시도가 실패하고 순진한 것처럼 작동합니다.)
  2. " 첫 번째 줄로 이동 "의 기능을 홈 키보드 버튼에 바인딩 하시겠습니까? (컨트롤 A가 지금이 작업을 수행하지만 Home에서 수행하고 싶습니다.)
  3. " 줄의 끝으로 이동 "기능을 종료 키보드 버튼에 바인딩 하시겠습니까? (컨트롤 E는 지금이 작업을 수행하지만 종료하기를 원합니다.)

최종 (?) 업데이트

나는 작동하는 것을 우연히 발견했지만 그 이유를 잘 이해하지 못합니다. 이것은 작동합니다 :

bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward

http://www.qnx.com/developers/docs/6.3.2/neutrino/utilities/k/ksh.html#bind 에 따르면 ,

prefix-2
Key binding: ^X, ^[[
Introduces a 2-character command sequence.

그래서 내 업데이트 된 질문은 왜 prefix-2이것을 사용해야 합니까? 이해를 돕기 위해 번역 해 주시면이 문제에 대해 다시 한 번 버그를 범하지 않아도됩니다.

오래된 학생 추종자

최신 정보

QNX의 ESC는 ^[입니다. 이 명령을 사용하면 bind '^[[3~'='delete-char-backward'커서가 커서 아래의 문자를로 덮어 쓸 수 ~있습니다. 이것은 적어도 약간의 발전입니다. 이제 쉘의 Delete Key 를 철자하는 방법을 알고 있습니다. 내가 웹에서 본 대부분의 것은 delete 키가이라고 말하지만 ^?나에게는 효과가없는 것 같습니다. 또한 PuTTy를 통해 액세스하고 있다고 언급해야합니다.

Control D 가 delete 키로 원하는 작업을 수행하기 때문에 이해할 수 없습니다 . 나는 그것을 eot-or-delete다시 묶어 보았습니다 .

이것은 간단해야합니까?

업데이트 2 :

 bind | grep prefix
^X = prefix-2
^[ = prefix-1
ÿ = prefix-3
^[O = prefix-2
^[[ = prefix-2


bind | grep '[^ -~]'
ÿ = prefix-3
à  = beginning-of-line
à¡ = up-history
ठ= backward-char
ঠ= forward-char
ਠ= end-of-line
à© = down-history
ଠ= delete-char-forward
à´ = backward-word
ච= forward-word

업데이트 3 : 더 많은 설정

ENV 설정

 echo $ENV
/etc/kshrc

BIND 완료 출력

bind
^A = beginning-of-line
^B = backward-char
^C = abort
^D = eot-or-delete
^E = end-of-line
^F = forward-char
^G = abort
^H = delete-char-backward
^I = complete
^J = newline
^K = kill-to-eol
^L = redraw
^M = newline
^N = down-history
^O = newline-and-next
^P = up-history
^R = search-history
^T = transpose-chars
^U = kill-line
^V = version
^W = kill-region
^X = prefix-2
^Y = yank
^[ = prefix-1
^\ = no-op
^] = search-character-forward
^^ = quote
^_ = eot
^? = delete-char-backward
ÿ = prefix-3
^[^H = delete-word-backward
^[^X = complete-file
^[^[ = complete
^[^] = search-character-backward
^[  = set-mark-command
^[# = comment
^[* = expand-file
^[. = prev-hist-word
^[0 = set-arg
^[1 = set-arg
^[2 = set-arg
^[3 = set-arg
^[4 = set-arg
^[5 = set-arg
^[6 = set-arg
^[7 = set-arg
^[8 = set-arg
^[9 = set-arg
^[< = beginning-of-history
^[= = complete-list
^[> = end-of-history
^[? = list
^[C = capitalize-word
^[L = downcase-word
^[O = prefix-2
^[U = upcase-word
^[[ = prefix-2
^[_ = prev-hist-word
^[b = backward-word
^[c = capitalize-word
^[d = delete-word-forward
^[f = forward-word
^[g = goto-history
^[h = delete-word-backward
^[l = downcase-word
^[u = upcase-word
^[y = yank-pop
^[^? = delete-word-backward
^X^X = exchange-point-and-mark
^X^Y = list-file
^X^[ = complete-command
^X? = list-command
^XA = up-history
^XB = down-history
^XC = forward-char
^XD = backward-char
^XH = beginning-of-line
^XP = delete-char-forward
^XY = end-of-line
^Xc = forward-word
^Xd = backward-word
^Xw = end-of-line
à  = beginning-of-line
à¡ = up-history
ठ= backward-char
ঠ= forward-char
ਠ= end-of-line
à© = down-history
ଠ= delete-char-forward
à´ = backward-word
ච= forward-word

/ etc / kshrc

/etc # cat kshrc
case $- in
*i*)
    export SHELL_COLOR_BLUE="print -n \\033[0;34m"
    export SHELL_COLOR_GREEN="print -n \\033[0;32m"
    export SHELL_COLOR_RED="print -n \\033[0;31m"
    export SHELL_COLOR_LIGHTGRAY="print -n \\033[0;37m"
    export SHELL_COLOR_YELLOW="print -n \\033[1;33m"

    export COLOR_BLACK="\\033[0;30m"
    export COLOR_BLUE="\\033[0;34m"
    export COLOR_GREEN="\\033[0;32m"
    export COLOR_CYAN="\\033[0;36m"
    export COLOR_RED="\\033[0;31m"
    export COLOR_PURPLE="\\033[0;35m"
    export COLOR_BROWN="\\033[0;33m"
    export COLOR_LIGHTGRAY="\\033[0;37m"
    export COLOR_DARKGRAY="\\033[1;30m"
    export COLOR_LIGHTBLUE="\\033[1;34m"
    export COLOR_LIGHTGREEN="\\033[1;32m"
    export COLOR_LIGHTCYAN="\\033[1;36m"
    export COLOR_LIGHTRED="\\033[1;31m"
    export COLOR_LIGHTPURPLE="\\033[1;35m"
    export COLOR_YELLOW="\\033[1;33m"
    export COLOR_WHITE="\\033[1;37m"

    if [[ `id -u` -eq 0 ]]; then
        export PS1=`$SHELL_COLOR_RED`'$(hostname -s):'`$SHELL_COLOR_YELLOW`'$(pwd) # '`$SHELL_COLOR_LIGHTGRAY`
    else
        export PS1=`$SHELL_COLOR_BLUE`'$(hostname -s):'`$SHELL_COLOR_GREEN`'$(pwd) $ '`$SHELL_COLOR_LIGHTGRAY`
    fi

esac

퍼티 설정 :

여기에 이미지 설명을 입력하십시오

중요하거나 중요하지 않지만 배경을 제공 할 수있는 메모 :

쉘은 "PD KSH v5.2.14 99 / 07 / 13.2"입니다. 예, 업그레이드 할 수있는 옵션이 없습니다 ... 임베디드 시스템입니다. "현대 조개 잡기"는 실용적이지 않습니다. 운영 체제는 QNX Neutrino 6.4.1입니다.

bind는 다음을 보여줍니다.

 bind | grep del
^D = eot-or-delete
^H = delete-char-backward
^? = delete-char-backward
^[^H = delete-word-backward
^[d = delete-word-forward
^[h = delete-word-backward
^[^? = delete-word-backward
^XP = delete-char-forward
ଠ= delete-char-forward

infocmp는 다음을 보여줍니다.

infocmp  #      Reconstructed via infocmp from file:
/usr/lib/terminfo/x/xterm xterm|vs100|xterm terminal emulator,
        am, km, mir, msgr, xenl, xon,
        cols#80, it#8, lines#65, vt@,
        acsc=Oa``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
        bel=^G, blink=@, bold=\E[1m, clear=\E[H\E[2J, cr=^M,
        csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
        cud=\E[%p1%dB, cud1=\E[B, cuf=\E[%p1%dC, cuf1=\E[C,
        cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
        dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
        el=\E[K, el1=\E[1K$<3>, enacs=\E(B\E)0, home=\E[H, ht=^I,
        hts=\EH, ich=\E[%p1%d@, ich1=\E[2~, il=\E[%p1%dL, il1=\E[L,
        ind=^J, is1=\E=\E[?1l, kBEG=\ENn, kCPY=\ENs, kCRT=\ENt,
        kDL=\ENv, kEXT=\ENw, kFND=\ENx, kHLP=\ENy, kOPT=\ENz,
        ka3=\EOs, kb2=\EOr, kbs=^H, kc1=\EOq, kcan=\EOm, kclo=\ENc,
        kclr=\ENa, kcmd=\EOu, kcub1=\E[D, kcud1=\E[B, kcuf1=\E[C,
        kcuu1=\E[A, kdch1=\E[P, kend=\E[9, kf1=\E[11~, kf10=\E[21~,
        kf11=\E[23~, kf12=\E[24~, kf2=\E[12~, kf3=\E[13~,
        kf4=\E[14~, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
        kf9=\E[20~, kfnd=\ENf, khlp=\ENh, khome=\E[8, khts=\ENb,
        kich1=\E[2~, kmov=\ENi, kmrk=\ENm, kmsg=\ENe, knp=\E[6~,
        kopn=\ENo, kopt=\ENk, kpp=\E[5~, kref=\ENl, kres=\ENp,
        krfr=\ENg, krpl=\ENr, krst=\ENj, ksav=\ENq, kslt=\EOM,
        ktbc=\ENd, kund=\ENu, rc=\E8, rev=\E[7m, ri=\EM, rmacs=^O,
        rmam=\E[?7l, rmkx=\E>, rmso=\E[m,
        rs1=\E>\E[1;3;4;5;6l\E[?7h\E[m\E[r\E[2J\E[H, rs2=@,
        sc=\E7,
        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[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m,
        sgr0=\E[m, smacs=^N, smam=\E[?7h, smkx=\E=, smso=\E[7m,
        tbc=\E[3g,

stty는 다음을 보여줍니다.

stty Name:  /dev/ttyp0 Type:  pseudo Opens: 2
+edit +echok +echonl
+osflow  intr=^C  quit=^\ erase=^?  kill=^U   eof=^D start=^Q  stop=^S  susp=^Z lnext=^V   min=01  time=00   pr1=^[   pr2=5B  left=44 right=43
up=41  down=42   ins=40   del=50  home=48   end=59


나는 실제로 이미 두 링크를 모두 보았으며 kshrc아무 소용이 없도록 수정하려고했습니다 . 내가 얻을 sh: /etc/kshrc[21]: trap: bad signal KEYBD내가 불행하게도 다른 쉘 옵션이 없습니다. 이것이 PDKSH 또는 QNX 또는 둘 다에 문제가 있는지 모르겠습니다. 어떤 키 조합이 내가 원하는 것을 유발하는지 알고 있습니다. 적절한 키에 매핑하려면 구문을 알아야합니다.
kmort

Delete 키는 Linux에서 Pdksh (동일한 버전, 지난 세기 이후 유지되지 않은 버전)에서 작동합니다. 당신에게 무엇을 bind | grep prefix보여줍니까? 그리고 bind | grep '[^ -~]'?
Gilles 'SO- 악마 그만두 다'

@Gilles 나는 바인드 명령의 결과로 업데이트했습니다. 내 PuTTy 설정일 수 있습니까? 도와 주셔서 감사합니다. :-)
kmort

AFAIK bind '^[[3~'='delete-char-forward'가 작동했을 것입니다. ASCII가 아닌 문자가 어디에서 왔는지 이해할 수 없습니다 (8 비트 세트가있는 ESC + foo 시퀀스가 ​​아니거나 latin1 / utf8 혼동이 아닙니다). `bind '^ X3 ~ = delete-char-forward'가 작동합니까?
Gilles 'SO- 악마 그만'

답변:


6

Google 직원의 경우 :

아휴. 너무 단순해야하는 것이 힘들었습니다.

짧은 솔루션 (의 삭제 키를 설정하려면 다음을 사용하다 kshrc어디든지)

bind '^[[3'=prefix-2
bind '^[[3~'=delete-char-forward

PuTTy 터미널 설정을로 rxvt대신 설정하십시오 Standard.

퍼티 설정

이 작업을 수행하는 데 실제로 도움이 된 것은 다음과 같습니다. http://www.mail-archive.com/misc@openbsd.org/msg81796.html

ksh는 홈 및 종료 키로 바보 같은 일을합니다. 기본적으로 Home, End 및 Delete의 차이점을 동시에 알 수 없었습니다. 마지막으로 바인드 된 것이 무엇이든, 세 키는 모두 할 것입니다. PuTTy가이 키들을 위해 보낸 것을 바꾸는 것은 엄청난 도움이되었습니다.

참고 : 일부 사람들은 키를 누를 때 쉘이 어떤 코드를 가져 오는지 보려면을 입력 cat하고 Enter 키를 누른 다음 키를 누릅니다. 내 껍질에는 이것이 작동하지 않았다. ~모든 컨트롤 키를 얻었 습니다. 대신 내가 Esc한 번 누른 다음 키를 누릅니다. 그런 다음 제어 코드가 표시됩니다. 해당 제어 코드를 사용 bind하면 모든 준비가 완료됩니다.


Conemu + Cygwin에서도 작동한다는 것을 확인할 수 있습니다.
Janac Meena

2

[우리는 다소 다른 설정을 가지고 있지만 동일한 일반 원칙 중 일부가 적용된다고 생각하기 때문에 다음이 누군가에게 유용 할 수 있기를 바랍니다. 이것은 리눅스가 기본 터미널 I / O를 처리하는 방법에 대한 좋은 학습 경험으로 판명되었습니다.]

쉘이 그놈 터미널 창 에서 실행중인 경우Preferences | Profiles프로필을 선택한 Edit다음 Compatibility탭 을 선택한 다음로 변경 Delete key generates했습니다 Automatic. (또는 이것이 실패하면 다른 선택을 시도하십시오.)

[데비안 스트레치에 있습니다.]


나는 델이 어떻게 깨 졌는지, 심지어 언제 깨달았는지 모르지만 오른쪽보다는 왼쪽을 삭제하기 시작했습니다!

이 기사는 작업 방식을 이해하는 데 매우 도움이되었습니다 .


위의 링크 된 기사에서 제안 된 디버깅 전략을 사용했습니다.

입력 ^v Del하고 ^v Backspace[다음 Delete 키를 제어-V를 ...], 반환 된 터미널 시퀀스 코드를 찾을 수 있습니다.

사용 showkey -s, showkey -k, showkey -a다음 DelBackspace키 (TTY 드라이버로부터 출력, 키보드 원료 및 단말에 특정 문자열 등) 삼층 검사.

이것에서 stty (예 : stty1)를 사용할 때 xterm을 사용할 때 (그래픽 X 터미널 내에서) 쉘 동작이 다르다는 것을 알았습니다. Del은 stty1에서 올바르게 앞으로 (오른쪽), 내 xterm에서 뒤로 (왼쪽) 삭제했습니다.


기사는 죽은 링크입니다
우유

1

기존의 두 가지 대답은 gnome 터미널을 사용하여 SSH를 통해 Linux (Ubuntu 18.10) bash에서 Solaris 11.3 bash로 이동하는 데 효과가 없었습니다.

bind명령 을 사용해야한다는 것을 알았지 만 기본 Delete기능을 사용할 수 없으므로 해결 방법 이 있습니다.

따라서 해결 방법 Delete은를 누르면 삭제 키 누르기 와를 에 매핑하여 삭제 를 시뮬레이션 하는 것 입니다.Backspace

bind '"^[[3~":"^[[C^?"'

입력하려면 키를 누르십시오.

CTRL-vDelete첫 번째 부분
CTRL-vCTRL-vBackspace두 번째 부분 .
(또는 \e대신 이스케이프에 사용하십시오. "\e[3~")

완벽하지 않습니다 Delete. 줄 끝에서 여전히 백 스페이스입니다. 그러나 그것은 ~하루에 10 번 문자 를 백 스페이스 아웃 해야하는 것을 절약 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.