Hvordan kjøre historikksøket i Vi-modus i bash

Jeg vil finne alternativet til ctrl + R for å søke historie i bash. Jeg kan aktivere vi-modus i bash, men jeg kan ikke få det til å søke. Når jeg gjør /search eller ?search skjer ingenting. Er det noe mer jeg burde trykke på? Jeg prøvde å trykke på enter og så skjer dette:

$ set -o vi $ ls|grep f $ /gr -bash: /gr: No such file or directory $ 

Kommentarer

  • Er <C-r> virkelig ikke fungerer for deg i vi-modus for readline? Det fungerer bra for meg med den nyeste versjonen av bash.
  • @ D.BenKnoble Ja, det er det, men jeg tror <C-r> er emacs-modus og jeg vil lære vi-modus.
  • <C-r> er bare rekursivt søk; ikke sikker på at det har noe å gjøre med emacs vs vi, spesielt da det kan være en bash-spesifikk utvidelse (minnet mitt er uklart på den detaljene). Jeg fraråder deg ikke å bruke /, bare at hver har sine (forskjellige) bruksområder.

Svar

Det er absolutt Vim-stil som søker i bash / readline. Faktisk er kommandolinjen din i hovedsak en nedskalert versjon av Vim-editoren med et betydelig antall kommandoer i Normalmodus tilgjengelig. Mer om det på et sekund, men først Søk. Nøkkelen informasjon du trenger er at når du stirrer på den blinkende markøren på kommandolinjen din, er du i tilsvarer Vims Insert-modus. Så hvordan kommer vi til Normal-modus? Ved å trykke Esc , selvfølgelig.

Derfra trykk / , skriv inn et søkeord og trykk Enter . Nå kan du bruke n og N for å gå frem og tilbake gjennom resultatene. (Du søker effektivt bakover som standard med n … søker fremover fra starten ville ikke gi noen resultater siden det ikke er noen historie i fremtiden!) For å utføre gjeldende resultat som en kommando, trykk Enter igjen.

Ikke glem at du » er i Normal-modus, skjønt, så hvis du ikke finner det du leter etter, og vil komme tilbake til å skrive inn tekst i Sett inn-modus, gjør det du vanligvis gjør i Vim. Å treffe i , for eksempel, vil gjøre det. Eller du kan bruke Vim-kommandoen C som fjerner tekst etter markøren og går inn i Sett inn-modus, noe som er praktisk. (Du kan gå foran 0 hvis du flyttet markøren forbi den første kolonnen.) Eller bruk A, a, R, s, s, I, Ctrl-C … du får bildet.

Foruten de forskjellige kommandoene som går inn i Insert-modus kan du navigere med b, B, e, E , w, W, 0, $ osv. Yank / delete / put er også der, og du kan bruke dem i dem i handling + navigasjonskommandoer som yB, c2e, d$ osv. 1 Endelig fungerer u ndo også! Prøv å prøve noen andre ting selv.

Åh, og hvis du blir litt tapt eller, som det hender meg en gang i blant, noe funkiness med linjebryting krypterer c / l, kan du slippe pretensen og trykke v. Dette trekker kommandolinjens innhold til en faktisk forekomst av Vim, slik at du kan redigere med en Fullt bevæpnet og operativ tekstredigerer Når du er ferdig, :wq for å sende inn det du har til skallet for utføring.

1 Alas, operatøren + bevegelseskommandoer (caw, dis, yap osv.) støttes ikke. Men @EdNeville «s kommentar nedenfor har en lenke til noen innstillinger for readline som tilsynelatende vil legge til hver op-motion-kommando der er i tillegg til en rekke andre. Du kan virkelig avrunde kommandolinjebasert Vim-opplevelse ved å legge dem til .inputrc-filen.


Tilleggsinformasjon : Du er ikke begrenset til å bruke akkurat det set -o vi eller set -o emacs gir deg. Du kan bruke hvilken som helst av de tilgjengelige readline-kommandoene. Jeg mener Ctrl-R burde være tilgjengelig selv i Vim-modus, men hvis ikke, kan du prøve sette dette i ~/.inputrc

set editing-mode vi "\C-r": reverse-search-history "\C-s": forward-search-history 

Enda bedre, du kan legge til noen ellers utilgjengelige kommandoer som

"\C-o": operate-and-get-next 

Med dette, når du har valgt en kommando fra historikken (f.eks.via Vim-søk) trykk Ctrl-O i stedet for Enter og Bash vil kjøre kommandoen og sette inn neste kommando fra historikken, klar til å kjøre.

Se Readline Command Names delen i Bash manpage for fullstendig liste.

(Du kan også konfigurere disse fra kommandolinjen med bind kommando, men jeg kommer allerede for langt her.)

Kommentarer

  • Hyggelig. Et læringsøyeblikk.
  • @niklas, dette er svaret ditt
  • @glennjackman Jeg bruker mye av denne funksjonaliteten. Virkelig nyttig for meg.
  • @NiklasRosencrantz Jepp, jeg forsto. Vi prøv å skrive svar som generelt er nyttige i stedet for å bare fokusere på spørgeren, så jeg la til ekstra informasjon om blandingskommandoer fra forskjellige moduser.
  • Du kan også legge til ting som ciw hvis du endrer .inputrc: usenix.org.uk/content/bash.html#input

Svar

hva @ B-Layer nevnt fungerer ganske bra i bash og lignende i zsh.

Siden du allerede bruker VIM , og hvis du bruker neovim eller vim8, kan du også prøve :terminal åpner standardterminalen i vim.

Deretter kan du bruke vim-kommandoen til å navigere i utgangen av terminalen, samt navigere i historikken til terminalkommandoene.

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *