bash에서 Ctrl-Backspace 및 Ctrl-Delete


14

데비안 8.3 입기

stty werase '^H'

또는 아치 리눅스 2/2016

stty werase '^?'

in .bashrc(예를 들어)에서 Ctrl- Backspace터미널의 마지막 단어를 삭제하십시오. 그럼에도 불구하고 그것은 현대 GUI 응용 프로그램 (예를 들어 파이어 폭스)에서와 동일한 동작이 아니다 : 그것은 마지막으로 삭제 공백 으로 단락 지어진 단어를, 그리고 마지막으로 할 말은 공백으로 분리 또는 같은 문자 . : , ; " ' & / ( ).

그것은 할 수 있는가 Ctrl- Backspace행동하라 현대적인 GUI 애플리케이션 터미널 비슷한에? 또한, 만들 수있는 방법이있다 Ctrl- Delete커서 바로 앞에 단어를 삭제는?


1
쉘은 주어진 키에 바인딩 될 수있는 해당 작업을 지원할 수 있습니다.
Thomas Dickey

@ ThomasDickey : bash를 사용하고 있습니다. bash에서만 작동하면 괜찮습니다.
wolf-revo-cats

답변:


27

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

werase청각 장애 라인 편집기에서 조치를 구성 할 수 없습니다. 항상 공백으로 구분 된 단어를 (ASCII) 지 웁니다. tty 라인 편집기와 상호 작용하는 경우는 거의 cat없습니다. 예를 들어 인수없이 입력하면 얻을 수 있습니다 . 멋진 키 바인딩을 원한다면, readline을 사용하는 rlwrap 과 같은 도구에서 명령을 실행할 수 있습니다 .

강타는이 제공 이전 단어 삭제 명령을 : 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 키 + H 문자 보내는 가정합니다 Ctrl+를 Backspace. 불행히도 표준 바인딩이없는 키 중 하나입니다 ( Backspace특히 역사적인 이유로 엉망 입니다).

기본적으로 ( + )에 kill-word바인딩 된 대칭 명령도 있습니다 . 이를 +에 바인딩하려면 먼저 터미널이 보내는 이스케이프 시퀀스를 파악한 다음에 해당 줄을 추가해야합니다 . + 를 입력 한 다음 + ; 이것은 이니셜 이 이스케이프 문자를 시각적으로 나타내는 위치 와 같은 것을 삽입 합니다. 그런 다음 바인딩은M-dAltDCtrlDelete.inputrcCtrlVCtrlDelete^[[3;5~^[

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

단어 정의에 만족하지 않으면 bash에서 직접 제공 할 수 있습니다 .bash에서 emacs 스타일 키 바인딩의 혼란스러운 동작을 참조하십시오.


2
훌륭한 설명! 는 Ctrl+Del잘 작동. 그러나 나는 Ctrl+Backspace일할 수 없다 . 들어 Ctrl+v, Ctrl+Backspace내 단말기는 말한다 ^?. 무엇을 넣어야 .inputrc합니까? 감사합니다
Ciprian Tomoiagă

3
@CiprianTomoiaga "\C-?": backward-kill-word또는 원하는 readline 함수. 그러나 다른 문자를 보내는 경우 Backspace의 바인딩과 다른 Ctrl + Backspace의 바인딩 만 정의 할 수 있습니다. 터미널이 ^?백 스페이스와 Ctrl + Backspace를 모두 전송 하는 경우 터미널 에서 실행중인 응용 프로그램은이를 구별 할 방법이 없습니다. 일부 터미널 (예 : xterm, urxvt)은 구성 할 수 있고 다른 터미널 (예 : VTE 기반 터미널 에뮬레이터)은 구성 할 수 없습니다.
Gilles 'SO- 악마 그만해

4
정의 ~/.inputrc하면 default가 비활성화 /etc/inputrc됩니다. 이 문제를 해결하려면 해당 파일을 포함시켜야합니다. $include /etc/inputrc( 여기에서 )
Ciprian Tomoiagă

Esc 키 + 백 스페이스 +1
Celal Ergün


1

쿠킹 모드 터미널 처리에서 WERASE 문자의 동작은 적어도 Linux에서 하드 코딩 됩니다.

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

따라서 단어는 문자, 숫자 및 밑줄입니다. 이는 자체 쿠킹 모드 처리를 수행하는 응용 프로그램이 실행되고 있지 않을 때 Linux의 터미널에서 항상 유지되는 방식입니다.

bash와 다른 사람들이 사용하는 readline 버전은 커널 버전과 약간 다르지만 하드 코딩 된 것처럼 보입니다 .

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

그러나 이것은 bash실제로 나를 위해 하는 것과 일치하지 않는 것 같습니다 : foo+bar^W뿐만 아니라 모든 것을 지 웁니다 bar. 여기에 더 많은 정보가 있습니다 .


vi 사용자는 아마도 대신 backward-kill-word(기본 바인딩 M-DEL)을 찾고있을 것 입니다 unix-word-rubout.
Gilles 'SO- 악마 그만'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.