Jak mogę usunąć słowo wstecz w linii poleceń (bash i zsh)?


118

Jak mogę usunąć słowo wstecz w wierszu polecenia? Naprawdę jestem przyzwyczajony do tego, że niektórzy redaktorzy usuwają ostatnie „słowo” za pomocą Ctrl+ Backspace, i chciałbym również, aby ta funkcja była dostępna w wierszu poleceń.

Obecnie używam Bash i chociaż mógłbym przeskoczyć słowo do tyłu, a następnie usunąć słowo do przodu, wolę mieć to jako klawisz szybkiego dostępu lub wydarzenie jako Ctrl+ Backspace.

Jak to osiągnąć?

Odpowiedzi:


169

ctrlwto standardowe „słowo zabicia” (alias werase). ctrluzabija całą linię ( kill).

Możesz je zmienić za pomocą stty.

-bash-4.2$ stty -a
speed 38400 baud; 24 rows; 80 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
        -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
        -extproc -xcase
iflags: -istrip icrnl -inlcr -igncr -iuclc ixon -ixoff ixany imaxbel
        -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -ocrnl -onocr -onlret -olcuc oxtabs -onoeot
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
        eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
        min = 1; quit = ^\; reprint = ^R; start = ^Q; status = <undef>;
        stop = ^S; susp = ^Z; time = 0; werase = ^W;
-bash-4.2$ stty werase ^p
-bash-4.2$ stty kill ^a
-bash-4.2$

Zauważ, że nie trzeba umieszczać rzeczywistego znaku kontrolnego na linii, stty rozumie umieszczenie, ^a następnie postać, którą uderzyłbyś z kontrolą.

Po zrobieniu tego, jeśli uderzę ctrlp, usunie słowo z linii. A jeśli uderzę ctrla, usunie całą linię.


Za pomocą sttypolecenia próbowałem przypisać „słowo zabicia” Ctrl+BckSpc, wpisując, stty werasea następnie Ctrl-v Ctrl-Backspace. To wstawia dosłowny znak Ctrl-Backspace jako argument stty werase. Niestety nie wymaga pisania, Ctrl-Backspaceaby usunąć słowo, ale działa tylko z Backspacekluczem. Chciałbym więc poprzeć prośbę @terdon, aby dowiedzieć się, jak to zrobić. Aby zresetować weraseustawienia domyślne, użyj stty werase Ctrl-v Ctrl-w.
Timothy Martin

@TimothyMartin Trochę utknąłem, jak to zrobić ctrl-backspace. Backspace jest zwykle wysyłane jako albo ctrl-halbo ctrl-?, więc ctrl-backspacejakoś się ctrl-ctrl-backspace. Próbowałem dowiedzieć się, czy wysłano coś innego, ale przynajmniej kit po prostu wysyła backspace podczas pisania ctrl-backspace.
kurtm 10.10.2013

3
ctrl + w skutecznie usuwa słowo, ale również kopiuje do schowka, usuwając wszystko, co zapisałeś (lub przesuwasz w dół?).
Elijah Lynn

1
esc - usuń po prostu działało :-)
Rene Wooller,

1
to ... zmienia życie. mój Boże.
przewodowe00

27

Możesz to również zrobić za pomocą CtrlW.

Inną opcją jest ustawienie własnego skrótu, ale będzie to zależeć od używanego emulatora terminala. Dla xtermi rxvtbyć może innych dodaj tę linię do ~/.inputrc(utwórz plik, jeśli nie istnieje):

## rxvt, xterm
"\b":backward-kill-word

gnome-terminali wygląda na to, że AltBackspacedomyślnie ma, ale najwyraźniej wymaga łatania readline()w celu uzyskania CtrlBackspace.

Zobacz także:



-2

Na Macu możesz użyć:

Fn+Delete


2
To usuwa 1 znak przed kursorem, a nie 1 słowo za
Dannid

Nie wiem, czy nadal jest to istotne, ale byłoby to <Alt> + <Backspace> na Macu.
Hassan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.