Czy istnieje sposób na użycie Ctrl-R po wpisaniu części polecenia w bash?

13

W bash polecenie Ctrl+ rjest bardzo przydatne, wpisuję Ctrl+ r whateveri przeszukuje moją historię w poszukiwaniu poleceń zawierających to słowo whatever. Ale jeśli napiszę whateveri zdam sobie sprawę, że chciałbym wyszukać to słowo i nacisnąć Ctrl+ rnic się nie dzieje.

Czy jest jakiś sposób, by uderzyć w klawisz i sprawić, żeby zachowywał się tak, jakbym wpisał Ctrl+ r whateverzamiast whatever Ctrl+ r?

Mam w swoim .inputrc:

"\C-p": history-search-backward

ale działa to tylko wtedy, gdy początek linii jest taki sam.

skeept
źródło

Odpowiedzi:

12

Możesz przeszukiwać historię bash, korzystając z tego, co już wpisałeś.

Załóżmy, że właśnie wpisałeś curl -I http://superuser.comi zapomniałeś wpisać Ctrl+ r:

$ curl -I http://superuser.com

Jeśli chcesz przeprowadzić wyszukiwanie w swojej historii, przejdź do początku wiersza w pierwszej kolejności ( Ctrl+ a), wpisz i-search ( Ctrl+ r) i wpisz Ctrl+ y. Powinno to przeprowadzić wyszukiwanie przy użyciu zawartości całego wpisanego już tekstu:

(reverse-i-search)`curl -I http://superuser.com': curl -I http://superuser.com/faq

Alternatywnie możesz użyć Ctrl+ wzamiast Ctrl+, yaby wyszukać, używając tylko pierwszego słowa wpisanego tekstu:

(reverse-i-search)`curl': curl -I http://superuser.com/faq

Powiązanie wszystkiego do jednego klucza

Jeśli chcesz to wszystko zrobić jednym naciśnięciem klawisza, możesz powiązać pojedynczy klawisz z makrem klawiatury. Jeśli chcesz użyć, powiedzmy, F12uruchom:

$ bind '"\e[24~":"\C-a\C-r\C-y"'

To potrwa do sesji.

Czyni to na stałe

Po prostu zdefiniuj makro w swoim ~/.inputrc:

"\e[24~":"\C-a\C-r\C-y"

Zauważ, że tutaj pomijamy pojedyncze cudzysłowy.

Ta odpowiedź może być przydatna.

hso
źródło
1
Nie jestem pewien, czy jest to problem z moją konfiguracją, ale po c-rwpisaniu wpisanie c-yniczego tam nie wkleja. Jeśli piszę c-ysam, po prostu wkleja tekst, więc nie mogę łączyć dwóch poleceń ...
przeglądałem
Czy najpierw przejdziesz do początku linii? (Ca)
hso
1
Masz rację, nie miałem zamiaru zaczynać linii. Teraz mam w moim .inputrc "\C-xr": "\C-a\C-r\C-y"i działa bardzo dobrze! Dziękuję za tę odpowiedź.
skeept
Wydaje mi się, że po raz trzeci googlowałem to control+a control+r control+y! Dzięki, ta odpowiedź jest zawsze dostępna! :)
Dr Beco,
2

Zaoszczędź cztery ostrzeżenia:

Unikaj sekundy Ctrl-R, dodając do swojego .bashrc(lub do swojego, .inputrcjeśli wolisz):

bind '"\er":"\C-a\C-r\C-y\C-r"' # alt-r = ctr-a ctr-r ctr-y ctr-r

Spowoduje to zmapowanie ALT-R do CTR-A CTR-R CTR-Y CTR-R

Opis:

  • ALT-R : klucz powiązania. Inną dobrą opcją jest \C-xr( CTR-X CTR-R )
  • CTR-A : Przejdź na początek linii (zapamiętywanie tego, co jest napisane)
  • CTR-R : Rozpocznij wyszukiwanie do tyłu
  • CTR-Y : Wklej to, co CTR-A zapamiętał podczas wyszukiwania
  • CTR-R : Uruchamia wyszukiwanie do tyłu z dotychczasowymi postaciami
Dr Beco
źródło
Nadal nie jest dla mnie jasne, dlaczego Cy wkleja polecenie w pole wyszukiwania (Ca nie powinno być poleceniem „kopiuj”, prawda?) I dlaczego Cw wkleja tylko pierwsze słowo.
marcus
tak, C-anie tylko się porusza, ale zapamiętuje (kopiuje) przenoszoną treść.
Dr Beco
Nie mogę potwierdzić tego zachowania (wystarczy wypróbować Ca Cy), myślę, że bardziej prawdopodobne jest, że Cr ma wbudowane specjalne przypadki, ale nie wiem, gdzie są udokumentowane.
marcus