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
ciw
jeś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.