Powiązanie słowa zabijania wstecz do Ctrl + W

23

Próbuję przejść z długotrwałego korzystania z Tcsh na ostatnią eksplorację Basha.

Udało mi się przenieść wszystkie moje ulubione funkcje, z wyjątkiem Ctrl + W, który traktuje spacje i ukośniki jak granice słów, najprawdopodobniej słowo „zabij” do tyłu ”. Jednak w Bash readline usuwa całą drogę do pierwszej spacji, usuwając wszystkie ukośniki pomiędzy.

Próbowałem wielu różnych kombinacji \ Cw: backward-kill-word zarówno w .inputrc, jak i .bashrc za pomocą binda, ale nie mogę tego zrobić tak, jak chcę.

Zabawne jest to, że za pomocą Putty z Windows w pracy mogę używać Alt + Backspace, który również w instrukcji mówi, że jest domyślnym wiązaniem, aby uzyskać dokładnie takie zachowanie, jakie chcę. Ale w Terminal.app na moich komputerach Mac w domu to nie działa. To samo dotyczy dowolnego serwera FreeBSD lub Linux, na który jestem zalogowany z Terminal.app.

Zwracam się więc o pomoc do administratora.

Stefan M.
źródło

Odpowiedzi:

40

readlinenie wiąże się Ctrl- Wgdyż są obsługiwane przez sterownik terminala domyślnie:

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

Aby to wyłączyć, musisz uruchomić (w ~/.bashrc):

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

.inputrcnie pomoże tutaj, ponieważ jest czytany, gdy Ctrl- Wjest nadal przypisany do werase.

Należy również pamiętać, że \C-wsekwencje kluczy formatu muszą być ujęte w cudzysłowy, jak wyżej.


Różne terminale mogą obsługiwać Alt- Backspaceinaczej.

  • PuTTY i GNOME Terminal (z ustawieniami domyślnymi) send 1b 7f( ESC DEL)
  • Xterm z metaSendsEscape: truewysyła 1b 08( ESC BS).
  • Xterm bez metaSendsEscape wysyła 88( HTSlub BSz najwyższym ustawionym bitem).

Xterm ma kilka ustawień kontrolujących zachowanie Altklucza (zwanych Metaogólnie w Xterm i X11). Dzięki metaSendsEscape, holding Altbędzie poprzedzić naciśnięcie klawisza z krytym ESC(hex 1b). Bez ustawienia (tryb domyślny), Altustawi najwyższy bit znaku wejściowego, co spowoduje utworzenie znaków specjalnych. (Na przykład Alt- Npowoduje odpowiednio ESC ni î.)

O ile pamiętam, Terminal.app ma również podobne ustawienie do kontrolowania zachowania Meta / Alt / cokolwiek-Mac-use.

grawitacja
źródło
To nie tylko najlepsza odpowiedź, ale niezwykle pouczająca, dziękuję!
Stefan M
1
@shurane: Działanie „wymazywania” werase , podobnie jak normalne wymazywanie (Backspace), jest realizowane przez sam system operacyjny w sterowniku „urządzenia tty” - zauważ, że są one dostępne nawet w programach, które po prostu ślepo czytają ze standardowego wejścia, np. cat. We wszystkich systemach uniksowych sttysłuży do sterowania różnymi parametrami tty, w tym kluczami specjalnymi. (Oto jak wyglądał UNIX 7. edycjastty ).
grawity
1
@shurane: Tymczasem readline jest biblioteką przestrzeni użytkownika pierwotnie napisaną dla powłoki bash (chociaż jest obecnie używana przez wiele programów). Możliwe, że inne działania zostały zaimplementowane w trybie readline, aby uniknąć wzdęcia sterownika tty (który miał już znaczną liczbę flag i przełączników, jak widać w sttyinstrukcji). Ponadto, bash był pierwotnie przeznaczony dla systemu operacyjnego GNU i dopiero później przeniesiony na inne Uniksy; znacznie łatwiej jest zachować funkcje edycji w jednej bibliotece niż w kilku bardzo różnych jądrach.
grawity
3
@shurane: Technicznie jednak wszystkie te działania, w tym usuwanie słów, są realizowane przez readline - gdy jest aktywny, całkowicie wyłącza obsługę Backspace i Ctrl + W przez sterownik terminalu. readline po prostu respektuje sttykonfigurację dla uproszczenia, ale można ją zastąpić własnymi ustawieniami readline (zgodnie z opisem w odpowiedzi Matt Day).
grawity
4
To świetna odpowiedź na informacje, głosuj pozytywnie. Należy jednak zauważyć, że wyłącza to Ctrl-w dla wszystkich programów, chyba że używają readline, co prawdopodobnie nie jest tym, czego ktokolwiek chce ... więc wypróbuj odpowiedź @fjarlq.
0
19

grawity napisał, że nie można tego kontrolować w .inputrcpliku, ale jest to niepoprawne.

Jeśli set bind-tty-special-chars offw twojej .inputrcmożna następnie dostosować zachowanie znaków specjalnych terminali.

Na przykład:

set bind-tty-special-chars off
Control-u: kill-whole-line
Control-w: backward-kill-word
fjarlq
źródło
2
Ma to tę zaletę, że działa dla wszystkich programów korzystających z readline - np python.
wchargin
3

Dla przypomnienia, odpowiedzią dotyczącą iTerm2 jest ustawienie Alt- Backspace(lub Opt ⌥- na Macu), aby wysyłał Kody Szesnastkowe 0xb1i 0x7faby wykonać backward-kill-wordakcję, która traktuje znaki niealfanumeryczne jako ograniczniki.

Dla wyróżnienia oto zachowanie, które opisuję, w którym naciskanie Opt ⌥- raz to zmienia:

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

do tego:

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

I kolejne prasy 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/

Oto jak to ustawienie wygląda w iTerm2: wprowadź opis zdjęcia tutaj

Tak więc, w odniesieniu do Putty i Terminalu, grawitacja jest świetna. Ale po kłopotliwej ilości czasu na szukanie sposobu zastosowania ustawienia w iTerm2, ten post superużytkownika wydaje się pojawiać najczęściej, więc wydawało się, że jest odpowiedzialny za dostarczenie odpowiednich informacji, ponieważ dotyczy iTerm2 jako odpowiedzi załączonej do tego pytania.

TCAllen07
źródło
Naprawdę zajęło mi to dużo czasu, a to rozwiązanie działa naprawdę w OS X (z iTerm2) podczas logowania do zdalnej powłoki bash. Dzięki!
Martijn,