Klawisz Escape powłoki systemu Windows (usuń całą linię) w Bash

13

W wierszu poleceń systemu Windows (PowerShell i cmd), po naciśnięciu Escklawisza na linii, wszystko, co wpisałeś w wierszu polecenia, jest usuwane.

Przekonałem się, że naciśnięcie Escklawisza w linii poleceń bash nic nie robi. Naciśnięcie, Esca następnie backspaceusuwa słowo, ale należy to zrobić dla każdego słowa.

Uczę się Basha przyrostowo i czasami wpisuję coś głupiego na środku linii i czuję, że lepiej jest pisać od nowa. Aby to zrobić, naciśnięcie backspacejest jedynym sposobem, jaki znalazłem do tej pory.

Co robisz?

Mam świadomość clearpolecenia i Ctrl-Lskrótu, ale nie mówię o wyczyszczeniu całego terminalu. Tylko linia.

Animesh
źródło
1
Jakiś czas temu opublikowałem listę przydatnych skrótów klawiaturowych readline na superużytkowniku. Może ci się również przydać. (Readline to biblioteka, której bash używa do edycji linii).
jw013
hej jw013, dziękuję za miłą edycję. :-)
Animesh

Odpowiedzi:

15

Chcesz kill-whole-line, ale nie jest to domyślnie powiązane w bash. backward-kill-line( CtrlX Backspace) i unix-line-discard( CtrlU) oba usuwają od bieżącego punktu do początku linii, więc po prostu przejdź do końca linii i użyj jednego z nich.

Ignacio Vazquez-Abrams
źródło
Masz rację, to nie jest z niczym związane. Właśnie się tego dowiedziałem bind -P. Chyba Ctrl-Ui wtedy Ctrl-Yjest to jedyna opcja.
Animesh
Przekonasz się, że wiele domyślnych powiązań pochodzi z sekwencji klawiszy w edytorze Emacsa i że te powiązania pojawiają się również w innym miejscu.
Blrfl
@Blrfl, aby rozszerzyć swój komentarz, większość tych skrótów klawiszowych została wyodrębniona do biblioteki readline , z której korzysta wiele programów wiersza poleceń i dlatego wszystkie one mają podobne klawisze edycji wiersza.
jw013,
6

Ctrl+aprzechodzi na początek linii i Ctrl+kusuwa do końca linii

lemen
źródło
Spróbuj ^Unajpierw, w większości implementacji trybu edycji linii poleceń Emacsa już usuwa pełną linię. W tych, w których usuwa tylko lewy kursor (na przykład linia odczytu GNU), naciśnij ^Knastępnie.
mirabilos
3

Aby nieco rozwinąć odpowiedź Ignacio Vazquez-Abramsa, możesz uzyskać (prawie) podobne do Windows zachowanie z Escklawisza bash, wiążąc kill-whole-linego Escz następującym poleceniem

bind '"\e":kill-whole-line'

Jeśli dodasz wiersz do ~/.inputrcpliku, powiązanie będzie się utrzymywać między sesjami.

Zauważ jednak, że jest to bardzo niestandardowe, ponieważ bash faktycznie używa tego Escklucza jako innego klawisza modyfikującego (takiego jak nietrwały Alt lub Ctrl). Jeśli spojrzysz na listę istniejących powiązań klawiszy (z bind -P), prawdopodobnie zobaczysz kilka poleceń powiązanych z kombinacjami klawiszy, które zaczynają się od „\ e” (np.

"\eb": backward-word

który ustawia kombinację Esc+, Baby przesunąć kursor z powrotem do najnowszego początku słowa - raczej jak Ctrl+ , z tym wyjątkiem, że musisz zwolnić Esc(jak również Boczywiście), jeśli chcesz to zrobić więcej niż raz z rzędu ).

I to wyjaśnia, dlaczego powiedziałem, że twoje zachowanie jest prawie podobne do systemu Windows: po naciśnięciu Escbash sprawdza, czy używasz go w połączeniu z innym klawiszem; więc jeśli go kill-whole-linepowiążesz, pomiędzy naciśnięciem (a raczej zwolnieniem) Esca wyczyszczeniem linii dla ciebie jest trochę opóźnienia .

Jeśli jednak nie przejmujesz się tym i wolisz żyć z opóźnieniem niż przeszkolić się przy innym naciśnięciu klawisza, możesz to zrobić.

(Uwaga: wiele informacji tutaj otrzymałem w wyniku przeczytania - i podążenia za linkami - tej odpowiedzi ).

Wilson F.
źródło
1
To było bardzo pomocne, dziękuję i działa mniej więcej tak, jak reklamowano. Ale zauważyłem, że wywoływało to irytujące zachowanie, gdy inne polecenia są wykonywane „nieprawidłowo”, takie jak naciśnięcie DEL na końcu linii: Wyczyści to linię i zastąpi ją [19;lub podobnie wyglądającym kodem ucieczki. W końcu znalazłem mapowanie "\e\e"do kill-whole-line(tj tap Esc dwukrotnie, aby wyczyścić linię) ładnym kompromisu.
j_random_hacker
@j_random_hacker: Hm, podoba mi się to. I tak często uderzam Esckilka razy, więc mogę spróbować. Obecnie mam to przypisane do Ctrl+, Delale nigdy tego nie pamiętam.
Wilson F