Jeg vil finde alternativet til ctrl + R til søgehistorik i bash. Jeg kan aktivere vi-tilstand i bash, men jeg kan ikke få det til at søge. Når jeg gør /search
eller ?search
sker der intet. Er der noget mere, jeg skal trykke på? Jeg prøvede at trykke på enter og så sker dette:
$ set -o vi $ ls|grep f $ /gr -bash: /gr: No such file or directory $
Kommentarer
Svar
Der er bestemt Vim-stil søgning i bash / readline. Faktisk er din kommandolinje i det væsentlige en nedskaleret version af Vim-editoren med et betydeligt antal normale tilstandskommandoer til rådighed for dig. Mere om det på et øjeblik, men først Søg. Det vigtigste stykke information, du har brug for, er at når du stirrer på den blinkende markør på din kommandolinje, er du i ækvivalent med Vims Insert-tilstand. Så hvordan kommer vi til Normal-tilstand? Ved at trykke på Esc selvfølgelig.
Hit derfra / , indtast et søgeudtryk og tryk Enter . Nu kan du bruge n og N for at bevæge sig frem og tilbage gennem resultaterne. (Du søger effektivt tilbage bagud som standard med n
… søger fremad fra starten ville ikke give nogen resultater, da der ikke er nogen historie i fremtiden!) For at udføre det aktuelle resultat som en kommando, skal du trykke på Enter igen.
Glem ikke, at du ” er dog i normal tilstand, så hvis du ikke finder det, du leder efter og vil vende tilbage til indtastning af tekst i Indsæt-tilstand, skal du gøre det, du normalt gør i Vim. At ramme i , for eksempel, gør det. Eller du kan bruge Vim-kommandoen C
, som fjerner enhver tekst efter markøren og går ind i Insert-tilstand, hvilket er praktisk. (Du kan gå forud for det med 0
, hvis du flyttede markøren forbi den første kolonne.) Eller brug A
, a
, R
, s
, s
, I
, Ctrl-C
… du får billedet.
Udover de forskellige kommandoer, der går ind i Insert-tilstand, kan du navigere med b
, B
, e
, E
, w
, W
, 0
, $
osv. Yank / delete / put er der også, og du kan bruge dem i dem i handling + navigationskommandoer som yB
, c2e
, d$
osv. 1 Endelig fungerer u
ndo også! Gå videre og prøv nogle andre ting selv.
Åh, og hvis du går lidt vild eller, som det sker med mig en gang imellem, noget funkiness med linieindpakning forvrænger din c / l, kan du droppe foregivelsen og trykke v
. Dette trækker indholdet af din kommandolinje i en faktisk forekomst af Vim, så du kan redigere med en Fuldt bevæbnet og operationel teksteditor Når det er gjort, skal :wq
indsende det, du har, til skallen til udførelse.
1 Ak, operatøren + bevægelseskommandoer (caw
, dis
, yap
osv.) understøttes ikke. Men @EdNeville “s kommentar nedenfor har et link til nogle indstillinger for readline , der tilsyneladende tilføjer hver op-motion-kommando der er såvel som et antal andre. Du kan virkelig afrunde din kommandolinjebaserede Vim-oplevelse ved at føje dem til din .inputrc-fil.
Yderligere oplysninger : Du er ikke begrænset til kun at bruge det, der set -o vi
eller set -o emacs
giver dig. Du kan bruge en hvilken som helst af de tilgængelige readline-kommandoer. Jeg mener Ctrl-R
skal være tilgængelig selv i Vim-tilstand, men hvis ikke, kan du prøve sætter dette i din ~/.inputrc
…
set editing-mode vi "\C-r": reverse-search-history "\C-s": forward-search-history
Endnu bedre, du kan tilføje nogle ellers utilgængelige kommandoer som
"\C-o": operate-and-get-next
Med dette, når du først har valgt en kommando fra historikken (f.eks.via Vim-søgning) tryk på Ctrl-O
i stedet for Enter
, og Bash kører kommandoen og indsætter den næste kommando fra historikken, klar til at køre.
Se afsnittet Readline Command Names i Bash-manpage for en komplet liste.
(Du kan også konfigurere disse fra kommandolinjen med bind
-kommando, men jeg kommer allerede for langt herfra.)
Kommentarer
- Dejligt. Et læringsmoment.
- @niklas, dette er dit svar
- @glennjackman Jeg bruger meget af denne funktionalitet. Virkelig nyttigt for mig.
- @NiklasRosencrantz Ja, jeg forstod. Vi prøv at skrive svar, der generelt er nyttige i stedet for udelukkende at fokusere på spørgeren, så jeg tilføjede de ekstra oplysninger om blandingskommandoer fra forskellige tilstande.
- Du kan også tilføje ting som
ciw
hvis du ændrer .inputrc: usenix.org.uk/content/bash.html#input
Svar
hvad @ B-Layer nævnt fungerer ret godt i bash og lignende i zsh.
Da du allerede bruger VIM , og hvis du bruger neovim
eller vim8
, kan du også prøve :terminal
, åbner standardterminalen i vim
.
Derefter kan du bruge vim-kommandoen til at navigere i terminalterminalens output samt navigere i terminalkommandoernes historie.
Ref.
<C-r>
virkelig ikke fungerer for dig i vi-mode for readline? Det fungerer fint for mig med den nyeste version af bash.<C-r>
er emacs-tilstand, og jeg vil gerne lære vi-tilstand.<C-r>
er bare rekursiv søgning; ikke sikker på, at det har noget at gøre med emacs vs vi, især da det måske er en bash-specifik udvidelse (min hukommelse er uklar på den detalje). Jeg fraråder dig ikke at bruge/
, bare at hver har sine (forskellige) anvendelser.