bash에서 Ctrl-Backspace 및 Ctrl-Delete

bash에서 Ctrl-Backspace 및 Ctrl-Delete

데비안 8.3 설치

stty werase '^H'

또는 Arch Linux 2/2016에서

stty werase '^?'

in .bashrc(예) make Ctrl- Backspace터미널의 마지막 단어를 제거합니다. 그러나 이는 여전히 최신 GUI 애플리케이션(예: Firefox)에서와 동일하게 작동하지 않습니다.공백- 공백으로 구분된 마지막 단어 대신 구분된 단어또는이런 캐릭터 . : , ; " ' & / ( ).

터미널에서 최신 GUI 애플리케이션처럼 동작하도록 Ctrl만드는 것이 가능합니까 ? 그리고 커서 앞에 있는 단어를 삭제할 Backspace수 있는 방법이 있나요 ?CtrlDelete

답변1

여기에는 커널에서 제공하는 기본 줄 편집기(표준 모드 tty 줄 편집기)와 bash 줄 편집기(readline 라이브러리를 통해 구현됨)라는 두 가지 줄 편집기가 있습니다. 두 명령 모두 이전 단어를 지우는 명령이 있으며 Ctrl기본적으로 +에 바인딩되어 있습니다. 이 키는 W표준 모드 tty 라인 편집기를 통해 구성할 수 있습니다 . stty werasebash는 자체 구성에서 재정의되지 않는 한 tty 설정에서 찾은 키 바인딩을 에뮬레이트합니다.

werasetty 줄 편집기에서 작업을 구성할 수 없습니다. 항상 (ASCII) 공백으로 구분된 단어를 제거합니다. tty 줄 편집기와의 상호 작용은 거의 없습니다. 이는 cat인수 없이 입력할 때 얻을 수 있는 것입니다. 멋진 키 바인딩을 원할 경우 다음과 같은 도구에서 명령을 실행할 수 있습니다.되감기readline을 사용합니다.

Bash는 두 가지를 제공합니다이전 단어를 삭제하는 명령: unix-word-rubout( Ctrl+ w또는 stty werase) 및 backward-kill-word( M-DEL, 즉 Esc Backspace) 여기서현재 로케일에서 단어를 일련의 영숫자 문자로 처리합니다._. Ctrl+가 이전 영숫자 문자 시퀀스를 제거하도록 하려면 Backspace설정하지 말고 stty werase다음 줄을 에 입력하세요 .inputrc.

"\C-h": backward-kill-word

이는 터미널이 Ctrl+Ctrl+H 문자를 보낸다고 가정합니다 Backspace. 안타깝게도 이는 표준 바인딩이 없는 키 중 하나입니다( Backspace구체적으로는엉망이다역사적인 이유로).

기본적으로 ( + ) kill-word에 바인딩된 대칭 명령도 있습니다 . + 에 바인딩하려면 먼저 터미널에서 보낸 이스케이프 시퀀스를 파악한 다음 + 를 입력 하고 + 를 입력하면 다음과 같은 내용이 삽입됩니다. 여기서 첫 번째 문자 는 이스케이프 문자의 시각적 표현입니다. 그러면 바인딩은M-dAltDCtrlDelete.inputrcCtrlVCtrlDelete^[[3;5~^[

"\e[3;5~": kill-word

단어 정의 중 어느 쪽도 만족스럽지 않으면 bash에서 자신만의 정의를 제공할 수 있습니다.Bash에서 Emacs 스타일 키 바인딩의 혼란스러운 동작

답변2

노력하다

alt+backspace

기본 OS에서는 원하는 방식으로 작동합니다( ctrl+ 와 동일 backspace).

답변3

요리 모드 터미널 처리에서 WERASE 문자의 동작은 다음과 같습니다.하드코딩된, 적어도 Linux에서는:

           if (kill_type == WERASE) {
                   /* Equivalent to BSD's ALTWERASE. */
                   if (isalnum(c) || c == '_')
                           seen_alnums++;
                   else if (seen_alnums)
                           break;
           }

따라서 단어는 문자, 숫자, 밑줄입니다. 이 상황은 자체 쿠킹 모드 처리를 수행하는 애플리케이션이 실행되고 있지 않을 때 Linux 터미널에서 항상 발생합니다.

readline 버전(bash 등에서 사용)은 커널 버전과 조금 다른 것 같지만,하드코딩된:

단어는 문자와 숫자로 구성됩니다.

bash하지만 이것은 내가 실제로 하고 있는 일, foo+bar^W즉 단순히 삭제하는 것이 아니라 모든 것을 삭제하는 것과 일치 하지 않는 것 같습니다 bar. 그리고 더 많은 관련 정보여기.

답변4

당신은 그것을 사용할 수 있습니다자동 키터미널 애플리케이션과 일치하는 "창 필터"를 사용하여 Ctrl+를 캡처 Backspace하고 그에 대한 작업을 수행합니다.

예를 들어 keyboard.send_keys("<ctrl>+w")대신을 실행합니다.

자동 키 1

관련 정보