Jak uruchomić przeszukiwanie historii w trybie Vi w bash

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

  • Is <C-r> naprawdę nie działa dla ciebie w trybie vi dla readline? U mnie działa dobrze z najnowszą wersją basha.
  • @ D.BenKnoble Tak, ale myślę, że <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.

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.

  1. http://vimcasts.org/episodes/neovim-terminal/
  2. https://neovim.io/doc/user/nvim_terminal_emulator.html
  3. https://github.com/vim/vim/blob/master/runtime/doc/terminal.txt

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *