Sådan køres historiksøgningen i Vi-tilstand i bash

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

  • Er <C-r> virkelig ikke fungerer for dig i vi-mode for readline? Det fungerer fint for mig med den nyeste version af bash.
  • @ D.BenKnoble Ja, det er det, men jeg tror <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.

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.

  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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *