Bash: czy mogę ustawić Ctrl-Backspace, aby usunąć słowo wstecz?

19

When in shell (bash) - Chcę, aby Ctrl-Backspace był powiązany, aby „usunąć słowo wstecz”. Czy to możliwe?

Edytuj :

Używam konsoleterminala w KDE.

Cegła suszona na słońcu
źródło
2
Pytanie jest proste, nie ma na to żadnych skarg. Chciałbym tylko skomentować, że często dużo warte jest ułatwienie „standardowych” powiązań klawiszy, które już istnieją w wielu aplikacjach, zamiast dostosowywania bez żadnego prawdziwego zysku i pewności, że nigdy nie zobaczymy zachowania na obcych systemach. Ctrl+wdo czego powinieneś się przyzwyczaić, imho.
Daniel Andersson,
@ Daniel Andersson: lub alternatywnie - Możesz opracować sposób przeniesienia swoich ustawień na maszynę zagraniczną.
Adobe
Udostępnianie plików kropkowych to rozwiązany problem, ale niewiele pomaga na mniej lub bardziej lokalnych komputerach, na których masz dość otwarte uprawnienia. Jeśli jesteś w obcym systemie, najprawdopodobniej nie masz możliwości rekonfiguracji takich rzeczy (przynajmniej nie bez wiedzy współpracowników, którzy również korzystają z tej samej maszyny :-)). Ponadto każda nowa aplikacja będzie wymagać specjalnego traktowania.
Daniel Andersson,
6
Mam odwrotny problem, jestem przyzwyczajony do Ctrl-w„usuwania poprzedniego słowa” w konsoli i robienia tego instynktownie nawet w Eclipse lub Chrome, gdzie oznacza to zamknięcie karty / zamknięcie bieżącego pliku. Dość irytujące.
Ezequiel Muns,
1
Mam ten sam problem z Chrome SShInATab. Jak zrobić Ctrl-W bez Ctrl-W? :)
Riccardo SCE

Odpowiedzi:

11

Dlaczego nie użyć po prostu Alt+ Backspacelub Ctrl+, Wktóre są już zmapowane w większości terminali. Nie jestem pewien co do konsoli. Xmodmap (man xmodmap) może również służyć do mapowania innych niestandardowych kluczy. (Paradoksalnie xmodmap nie może bardzo dobrze odwzorować Backspace, ponieważ terminal zastępuje mapowania, ale działa dobrze z większością kluczy ...).

cześć
źródło
9
Ponieważ zwykłem Ctrl-Backspace w moim Emacsie. Wiedziałem o Ctrl-w. Alt-Backspace jest dla mnie nowy (+1).
Adobe
1
Dobra uwaga, @hellork. Możesz przechwycić control + backspace na serwerze X (poprzez xmodmap) i zamapować go na jakiś nieużywany znak (np. Alt-backspace).
4
Irytujące jest to, że ctrl + backspace jest bardzo powszechnym mapowaniem dla „usuwania słów wstecz” w większości aplikacji GUI na większości głównych systemów operacyjnych. Podobnie, Ctrl + W jest szeroko rozpowszechniony dla „zamykania okna”. Alt + w jest rzadko używany do czegokolwiek w GUI, o czym mogę myśleć. Standaryzacja byłaby świetna. Zastanawiam się, jakie byłyby większe zakłócenia, zmiana terminali lub zmiana GUI?
naught101
1
@naught, Control-W jest już domyślnym klawiszem wymazywania słów na terminalach unixowych. Tak, koliduje z konwencją Windows / GUI, ale tak naprawdę była pierwsza - od wielu lat. Obwiniaj Microsoft!
Alexis
11

Znalazłem ten wątek przez Google, ale odpowiedź nie była tym, co chciałem usłyszeć. Więc bawiłem się:

Na moim terminalu normalne backspace wysyła ^H, a ctrl + backspace wysyła ^?. Tak więc powinno być proste ponowne powiązanie, ^?aby usunąć słowo, które domyślnie jest dostępne za pomocą Ctrl + W.

Pierwsza (nieudana próba):

$ bind -P | grep 'C-w'
unix-word-rubout can be found on "\C-w".

Dlatego powinno to działać:

$ bind '"\C-?":unix-word-rubout'

Jednak to nie ... ktoś jest w stanie wyjaśnić?

Druga (udana) próba:

$ bind '"\C-?":"^W"'

Gdzie ^Wjest dosłowny / surowy ^W(naciśnij ctrl + V, a następnie ctrl + W, aby się pojawił).

daurnimator
źródło
Właściwie pierwsze rozwiązanie dla mnie zadziałało! Po drugie nie.
Drew Hoskins,
Druga próba wydaje się zastępować sam backspace, a nie Ctrl-Backspace?
user541686,
7

Po prostu edytuj swój ~/.inputrc(być może trzeba go utworzyć lub skopiować /etc/inputrctam), aby zawierał:

# Ctrl-Delete: delete next word
"\e[3;5~": shell-kill-word

# Ctrl-Backspace
"\C-H": shell-backward-kill-word

Spowoduje to również mapowanie Ctrl+, Deleteaby usunąć słowo obok kursora.

Treviño
źródło
Nie działa dla mnie.
Jonathan
6

Tutaj jest kilka dobrych odpowiedzi, ale rozwiązałem go w Konsoli, wybierając Ustawienia-> Edytuj bieżący profil-> Klawiatura-> Edytuj, a następnie dodając mapowanie od Backspace+Controldo \x17. (Znalazłem kod ASCII dla Ctrl-w przy użyciu showkey --ascii.)

Braden Anderson
źródło
Dzięki za zwrócenie uwagi na to showkey. Tak więc doszedłem do wniosku, że w ALT+Dprzypadku usunięcia słowa przed kursorem będzie to odpowiadać \x1b\x64.
loki
Dziękuję, rozwiązało to mój problem. W moim przypadku muszę ponownie przypisać Alt + Backspace, a jego kolejność to \x1b\x7f.
DDMC
3

To zależy od tego, co widzi bash. Podczas regularnej interakcji terminalu bash nie widzi naciśniętych klawiszy modyfikujących, tylko wynikowy znak. Na przykład Backspace jest już taki sam jak control-H. Przytrzymanie klawisza Shift lub Control nie ma znaczenia.

JEDNAK, twoja aplikacja terminalowa (xterm? Cmd? Terminal? Putty? Zależy od twojego systemu operacyjnego) może zobaczyć twoje naciśnięcia klawiszy i może mieć sposób na mapowanie kombinacji klawiszy Control-Backspace na coś, co bash może odróżnić od Backspace.

Alexis
źródło
Odkryłem, że mój bash nie widzi backspace. Ale może uda się to zrobić.
Adobe
@adobe, co masz na myśli? Wpisz „stty” na swoim terminalu, a następnie przeczytaj o tym instrukcję. Jeśli ^ H ma być postacią usuwaną, możesz ustawić ją na coś innego ... jeśli masz dobry powód.
1
Dobry przykład tego można znaleźć na stronie github.com/calj/gtconf/blob/master/zsh/zshrc . Konsole pozwala to zrobić. Skopiuj jeden z plików * .keytab z / usr / share / kde4 / apps / konsole / do ~ / .kde / share / apps / konsole i zmodyfikuj go za pomocą sugestii w powyższym linku, usuwając wiersz „key Backspace” i dodawanie: key Backspace-Shift-Control : "\x7f"i key Backspace-Shift+Control : "\E[9;3~"Zmieniaj także wiersz tytułu, gdy na nim jesteś: keyboard "Xfree4 Modlist"na przykład. Następnie możesz dodać "\e[9;3~": backward-kill-word"do ~ / .inputrc
Adam
2

Spróbuj tego:

bind '"\C-_":backward-kill-word'

Opcjonalnie dodaj następujące elementy do ~ / .inputrc, aby było trwałe:

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

Działa na bash 4.3.11 w Kubuntu 14.04

Fitzy
źródło
2
Jest mało prawdopodobne, aby Control-backspace był taki sam jak podkreślenie Control.
Thomas Dickey,
1
Ze wszystkich rzeczy, których próbowałem w tym wątku, zadziałało! Korzystanie z „GNU bash, wersja 4.3.48 (1) -release (x86_64-pc-linux-gnu)” na bashu na Windows / WSL
Markus Jevring
Działa to świetnie w cygwin, przy użyciu GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin).
zagyi
1

W Konsole:

  • Kliknij Settings -> Edit current profile
  • kliknij kartę „Klawiatura” -> [Edit...]
  • kliknij [Add]przycisk i pod Key Combinationtypem kolumny Backspace+Ctrl. W Outputtypie kolumny0x08 (która jest tradycyjnie znakiem cofania)

Teraz powinieneś być w stanie zmapować ten klucz backward-kill-wordza pośrednictwem

# ~/.bashrc

bind '"\x08":backward-kill-word'
aaaaaa
źródło
Dzięki. Działa dla mnie, przynajmniej w xfce4-terminal.
limon
0

Na większości terminali CTRL + W powinien już usunąć słowo wstecz. Działa to z Xterm i myślę, że działa z konsolą. CTRL + W to standardowe powiązanie klawiszy w programie tekstowym, który będzie działał z vimem w trybie wstawiania, emacsem i każdą powłoką.


źródło
5
Ctrl-w jest powiązany z „zamykaniem tabulatorów” w Emacsie, FireFoxie, Krusaderze - więc ustawiłem to jako kombinację zamykania tabulatorów również w Konsole.
Adobe,