Chcę znaleźć alternatywę dla ctrl + R w historii wyszukiwania w bash. Mogę włączyć tryb vi w bashu, ale nie mogę przeprowadzić wyszukiwania. Gdy robię /search lub ?search, nic się nie dzieje. Czy jest coś więcej, co powinienem wcisnąć? Próbowałem nacisnąć Enter, a potem stało się to:
$ set -o vi $ ls|grep f $ /gr -bash: /gr: No such file or directory $
Komentarze
Odpowiedź
Z pewnością istnieje wyszukiwanie w stylu Vima w bash / readline. W rzeczywistości twoja linia poleceń jest zasadniczo zmniejszoną wersją edytora Vim z dostępną znaczną liczbą poleceń trybu normalnego. Więcej na ten temat za sekundę, ale najpierw Szukaj. Kluczową informacją, której potrzebujesz, jest to, że kiedy patrzysz na ten migający kursor w linii poleceń, jesteś w odpowiedniku trybu wstawiania Vima. Jak więc przejść do trybu normalnego? Naciskając Esc oczywiście.
Stamtąd naciśnij / , wprowadź wyszukiwane hasło i naciśnij Enter . Teraz możesz użyć n i N , aby poruszać się w tę i z powrotem w wynikach. (Będziesz efektywnie wyszukiwać wstecz, używając n … wyszukując do przodu od początku nie dałoby żadnych wyników, ponieważ w przyszłości nie ma historii!) Aby wykonać bieżący wynik jako polecenie, ponownie naciśnij Enter .
Nie „zapomnij, że Ty” jednak w trybie normalnym, więc jeśli nie znajdziesz tego, czego szukasz i chcesz wrócić do wprowadzania tekstu w trybie wstawiania, zrób to, co zwykle robisz w Vimie. Na przykład naciśnięcie i zrobi to. Możesz też użyć polecenia Vima C, które usunie tekst za kursorem i przejdzie do trybu wstawiania, co jest przydatne. (Możesz poprzedzić to ciągiem 0, jeśli przesuniesz kursor poza pierwszą kolumnę). Lub użyj A, a, R, s, s, I, Ctrl-C … masz obraz.
Oprócz różnych poleceń, które wchodzą w tryb wstawiania, możesz nawigować za pomocą b, B, e, E , w, W, 0, $, itp. Yank / delete / put tam są i możesz ich w nich używać w akcji + polecenia nawigacyjne, takie jak yB, c2e, d$, itd. 1 Wreszcie u ndo też działa! Śmiało i sam spróbuj innych rzeczy.
Och, a jeśli trochę się zgubisz lub, jak mi się czasem zdarza, trochę funky z zawijaniem linii zakłóci twoje c / l, możesz porzucić udawanie i nacisnąć v. To przenosi zawartość wiersza poleceń do rzeczywistej instancji Vima, dzięki czemu można ją edytować za pomocą w pełni uzbrojonego i operacyjnego edytora tekstu . Po zakończeniu :wq, aby przesłać to, co masz do wykonania, do powłoki.
1 Niestety, operator + Polecenia ruchu (caw, dis, yap itp.) nie są obsługiwane. Ale komentarz @EdNeville „poniżej zawiera link do niektórych ustawień readline , które pozornie dodają każde dostępne polecenie op-motion, a także wiele innych. Możesz naprawdę wzbogacić swoje doświadczenie Vima z wierszem poleceń, dodając je do pliku .inputrc.
Dodatkowe informacje : nie musisz ograniczać się tylko do tego, co set -o vi lub set -o emacs daje ci. Możesz użyć dowolnego z dostępnych poleceń readline. Uważam, że Ctrl-R powinno być dostępne nawet w trybie Vim, ale jeśli nie, możesz spróbować umieszczając to w swoim ~/.inputrc …
set editing-mode vi "\C-r": reverse-search-history "\C-s": forward-search-history
Jeszcze lepiej, możesz dodać kilka inaczej niedostępnych poleceń, takich jak
"\C-o": operate-and-get-next
Dzięki temu po wybraniu polecenia z historii (np.przez wyszukiwanie Vim) naciśnij Ctrl-O zamiast Enter, a Bash uruchomi polecenie i wstawi następne polecenie z historii, gotowe do uruchomienia.
Zobacz sekcję Readline Command Names na stronie podręcznika Bash, aby zapoznać się z pełną listą.
(Możesz również skonfigurować je z wiersza poleceń za pomocą bind, ale już zaszedłem za daleko.)
Komentarze
- Fajnie. Chwila do nauki.
- @niklas, to jest twoja odpowiedź
- @glennjackman Bardzo intensywnie korzystam z tej funkcji. Naprawdę przydatne.
- @NiklasRosencrantz Tak, rozumiem. spróbuj napisać odpowiedzi, które są ogólnie przydatne, a nie koncentrują się wyłącznie na pytającym, więc dodałem dodatkowe informacje o mieszaniu poleceń z różnych trybów.
- Możesz także dodać takie rzeczy, jak
ciwjeśli zmodyfikujesz plik .inputrc: usenix.org.uk/content/bash.html#input
Odpowiedź
To, o czym @ B-Layer wspomniała, działa całkiem nieźle w bashu i podobnie w zsh.
Ponieważ już używasz VIM , a jeśli używasz neovim lub vim8, możesz też wypróbować :terminal, który otworzy domyślny terminal w vim.
Następnie możesz użyć polecenia vim, aby nawigować po wyjściu terminala, a także przeszukiwać historię poleceń terminala.
Ref.
<C-r>naprawdę nie działa dla ciebie w trybie vi dla readline? U mnie działa dobrze z najnowszą wersją basha.<C-r>to tryb emacs i chcę się nauczyć tryb vi.<C-r>to po prostu wyszukiwanie rekurencyjne; nie jestem pewien, czy ma to coś wspólnego z emacs vs vi, zwłaszcza, że może to być rozszerzenie specyficzne dla basha (moja pamięć jest niewyraźna w tym szczególe). Nie zniechęcam Cię do korzystania z/, tylko że każdy ma swoje (inne) zastosowania.