뒤로 죽이는 단어를 Ctrl + w에 바인딩


23

Tcsh의 장기간 사용에서 최근 Bash 탐색으로 전환하려고합니다.

공백과 슬래시를 단어 경계로 취급하는 Ctrl + w를 제외하고 가장 좋아하는 모든 기능을 포팅했습니다. 그러나 Bash에서 readline은 첫 번째 공백까지 모든 슬래시를 삭제하여 삭제합니다.

bind를 사용하여 .inputrc와 .bashrc 모두에서 \ Cw : back-kill-word의 다양한 조합을 시도했지만 원하는 방식으로 작동시킬 수 없습니다.

재미있게도, 직장에서 Windows의 Putty를 통해 Alt + Backspace를 사용할 수 있습니다. Alt + Backspace는 수동 바인딩이 기본 바인딩이며 원하는 정확한 동작을 생성합니다. 그러나 집에있는 Mac의 Terminal.app에서는 작동하지 않습니다. Terminal.app에서 로그인 한 FreeBSD 또는 Linux 서버도 마찬가지입니다.

그래서 수퍼 유저에게 도움을 요청합니다.

답변:


40

readline바인딩되지 않습니다 Ctrl- W터미널 드라이버가 기본적으로 처리하기 때문에 :

$ stty -a
(...) werase = ^W; (...)

이를 비활성화하려면 (in ~/.bashrc) 을 실행해야합니다 .

stty werase undef
bind '"\C-w": backward-kill-word'

.inputrcCtrl- W가 여전히 할당되어 있을 때 읽히므로 여기에서는 도움이되지 않습니다 werase.

또한 \C-w형식 keyeqs는 위와 같이 큰 따옴표로 묶어야합니다.


다른 터미널 처리 할 수 Alt- Backspace다른.

  • PuTTY 및 그놈 터미널 (기본 설정) 전송 1b 7f( ESC DEL)
  • 텀이 함께 metaSendsEscape: true전송 1b 08( ESC BS).
  • 없이 metaSendsEscape 전송 88( HTS또는 BS최상위 비트 세트).

Xterm에는 Alt키 의 동작을 제어하기위한 몇 가지 설정이 있습니다 ( Meta일반적으로 Xterm 및 X11 이라고 함 ). 와 metaSendsEscape, 지주는 Alt와의 키 접두사 것 ESC(16 진수를 1b). 설정하지 않으면 (기본 모드) Alt입력 문자의 최상위 비트가 설정되어 특수 문자가 생성됩니다. (예를 들어, Alt- N결과 ESC nî각각).

내가 기억할 수있는 한, Terminal.app에는 Meta / Alt / Mac 사용의 동작을 제어하는 ​​비슷한 설정이 있습니다.


이것은 최고의 답변 일뿐만 아니라 매우 유익한 정보입니다. 감사합니다!
Stefan M

1
@shurane : 일반 지우기 (백 스페이스)와 같은 소문자 "단어 지우기"작업은 OS 자체에서 "tty 장치"드라이버로 구현됩니다. 예를 들어 stdin에서 맹목적으로 읽은 프로그램에서도 사용할 수 있습니다. cat. 모든 유닉스 stty에서이 특수 키를 포함하여 다양한 tty 매개 변수를 제어하는 ​​데 사용됩니다. ( UNIX 7th Edition의stty 모습은 다음과 같습니다.)
grawity

1
@shurane : 한편, readline 은 원래 bash 쉘용으로 작성된 사용자 공간 라이브러리입니다 (현재 많은 프로그램에서 사용됨). tty 드라이버의 부풀림 을 피하기 위해 다른 작업이 readline 으로 구현 되었을 수 stty있습니다 (이 매뉴얼 에서 볼 수 있듯이 이미 많은 양의 플래그와 토글이있었습니다 ). 또한 bash 는 원래 GNU OS 용으로 만들어졌으며 나중에 다른 유닉스로 이식되었습니다. 여러 다른 커널보다 단일 라이브러리에서 편집 기능을 유지 관리하는 것이 훨씬 쉽습니다.
grawity

3
@shurane : 그러나 기술적으로 단어 지우기를 포함한 이러한 모든 작업은 readline 으로 구현 됩니다. 활성화되면 터미널 드라이버에서 백 스페이스 및 Ctrl + W 처리를 완전히 비활성화합니다. readlinestty 은 단순성을 위해 구성을 존중 하지만, Matt Day의 답변에 설명 된 것처럼 readline 자체 설정 으로 재정의 할 수 있습니다 .
grawity

4
이것은 정보에 대한 훌륭한 답변입니다. 그러나 이것은 아마도 누군가가 원하지 않는 readline을 사용하지 않는 한 모든 프로그램에서 Ctrl-w를 비활성화한다는 점에 유의해야합니다. @ fjarlq의 답변을 시도하십시오.
0fnt

19

grawity는 .inputrc파일 에서 이것을 제어 할 수 는 없지만 잘못했다고 썼다 .

당신이 경우 set bind-tty-special-chars off당신의 .inputrc, 당신은 특별한 터미널 문자의 동작을 사용자 정의 할 수 있습니다.

예를 들면 다음과 같습니다.

set bind-tty-special-chars off
Control-u: kill-whole-line
Control-w: backward-kill-word

2
그리고 이것은 readline을 사용하는 모든 프로그램에서 작동하는 이점이 있습니다 (예 :) python.
wchargin

3

기록을 위해, 그것은 iTerm2에 적용되는 대답은 설정하는 것입니다 Alt- Backspace(또는 Opt ⌥- Mac에서) 진수 코드를 보내 0xb10x7f수행하기 위해 backward-kill-word작업을 구분 기호로 영숫자가 아닌 문자를 처리합니다.

구별은 여기를 눌러있는 내가 설명하고있어 행동,의 Opt ⌥- 한 시간이 변경이 :

echo "/example/filepath/with_non-alpha.characters@blah:meh

이에:

echo "/example/filepath/with_non-alpha.characters@blah:

그리고 Opt ⌥-의 후속 프레스 :

echo "/example/filepath/with_non-alpha.characters@

echo "/example/filepath/with_non-alpha.

echo "/example/filepath/with_non-

echo "/example/filepath/with_

echo "/example/filepath/

iTerm2의 설정은 다음과 같습니다. 여기에 이미지 설명을 입력하십시오

따라서 퍼티 및 터미널과 관련하여 grawity의 답변 은 훌륭합니다. 그러나 iTerm2에서 설정을 적용하는 방법을 찾는 데 많은 시간을 보냈지만이 수퍼 유저 게시물이 가장 자주 나오는 것처럼 보이므로 iTerm2에 적용되는 관련 정보를이 질문에 첨부 된 답변으로 제공하는 것이 책임이있는 것 같습니다.


실제로 이것을 이해하는 데 오랜 시간이 걸렸 으며이 솔루션은 원격 bash 쉘에 로그인 할 때 OS X (iTerm2 사용)에서 실제로 작동합니다. 감사!
Martijn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.