Hur man kör historiksökningen i Vi-läge i bash

Jag vill hitta alternativet till ctrl + R för sökhistorik i bash. Jag kan aktivera vi-läge i bash men jag kan inte låta det söka. När jag gör /search eller ?search händer ingenting. Finns det något mer jag borde trycka på? Jag försökte trycka på enter och sedan händer detta:

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

Kommentarer

  • Är <C-r> verkligen inte fungerar för dig i vi-läge för readline? Det fungerar bra för mig med den senaste versionen av bash.
  • @ D.BenKnoble Ja det är det, men jag tror att <C-r> är emacs-läge och jag vill lära mig vi-läge.
  • <C-r> är bara rekursiv sökning; inte säker på att det har något att göra med emacs vs vi, särskilt eftersom det kan vara en bash-specifik förlängning (mitt minne är otydligt med den detalj). Jag avskräcker dig inte från att använda /, bara att var och en har sina (olika) användningsområden.

Svar

Vim-stil söker verkligen i bash / readline. I själva verket är din kommandorad i huvudsak en nedskalad version av Vim-redigeraren med ett stort antal kommandon för normalt läge tillgängliga för dig. Mer om det på en sekund men först Sök. Den viktigaste informationen du behöver är att när du stirrar på den blinkande markören på din kommandorad är du i motsvarighet till Vims infogningsläge. Så hur kommer vi till normalt läge? Genom att trycka på Esc , naturligtvis.

Hit därifrån / , ange en sökterm och tryck Enter . Nu kan du använda n och N för att flytta fram och tillbaka genom resultaten. (Du söker effektivt bakåt som standard med n … söker framåt från början skulle inte ge några resultat eftersom det inte finns någon historik i framtiden!) För att köra det aktuella resultatet som ett kommando, tryck Enter igen.

Glöm inte att du ” är dock i normalt läge, så om du inte hittar det du letar efter och vill återgå till att skriva in text i infogningsläge gör du vad du brukar göra i Vim. Att slå i , till exempel, gör det. Eller så kan du använda Vim-kommandot C som tar bort all text efter markören och går in i Insert-läge, vilket är praktiskt. (Du kan föregå det med 0 om du flyttade markören förbi den första kolumnen.) Eller använd A, a, R, s, s, I, Ctrl-C … du får bilden.

Förutom de olika kommandona som går in i Insert-läget kan du navigera med b, B, e, E , w, W, 0, $ etc. Yank / delete / put finns också där, och du kan använda dem i dem i aktion + navigeringskommandon som yB, c2e, d$ osv. 1 Slutligen fungerar u ndo också! Fortsätt och prova några andra saker själv.

Åh, och om du går lite vilse eller, som händer mig en gång i taget, lite funkiness med radbrytning klättrar i din c / l kan du släppa förevändningen och slå v. Detta drar innehållet i din kommandorad till en faktisk instans av Vim så att du kan redigera med en Fullt beväpnad och operativ textredigerare När du är klar :wq för att skicka in det du har till skalet för körning.

1 Ack, operatören + rörelsekommandon (caw, dis, yap, etc.) stöds inte. Men @EdNeville s kommentar nedan har en länk till några inställningar för läsraden som kommer att lägga till till synes varje op-motion-kommando där finns såväl som ett antal andra. Du kan verkligen avrunda din kommandoradsbaserade Vim-upplevelse genom att lägga till dem i din .inputrc-fil.


Ytterligare information : Du är inte begränsad till att bara använda vad set -o vi eller set -o emacs ger dig. Du kan använda vilka som helst tillgängliga kommandon för läsraden. Jag tror att Ctrl-R borde vara tillgängliga även i Vim-läge men om inte kan du prova sätta detta i din ~/.inputrc

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

Ännu bättre, du kan lägga till några annars otillgängliga kommandon som

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

Med detta, när du väl har valt ett kommando från historiken (t.ex.via Vim-sökning) tryck Ctrl-O istället för Enter och Bash kör kommandot och infogar nästa kommando från historiken, redo att köras.

Se avsnittet Readline Command Names i Bash-manpage för fullständig lista.

(Du kan också konfigurera dessa från kommandoraden med bind -kommando men jag kommer redan för långt här.)

Kommentarer

  • Trevligt. Ett lärande ögonblick.
  • @niklas, det här är ditt svar
  • @glennjackman Jag använder den här funktionen kraftigt. Verkligen användbart för mig.
  • @NiklasRosencrantz Japp, jag förstod. Vi försök att skriva svar som i allmänhet är användbara snarare än enbart fokuserade på frågeställaren så jag lade till extra information om blandningskommandon från olika lägen.
  • Du kan också lägga till saker som ciw om du ändrar .inputrc: usenix.org.uk/content/bash.html#input

Svar

vad @ B-Layer nämner fungerar ganska bra i bash och liknande i zsh.

Eftersom du redan använder VIM , och om du använder neovim eller vim8, kan du också prova :terminal öppnar standardterminalen i vim.

Sedan kan du använda vim-kommandot för att navigera i termminalens utgång samt navigera i terminalkommandornas historik.

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *