Hoe de geschiedeniszoekactie in Vi-modus in bash uitvoeren

Ik wil het alternatief vinden voor ctrl + R om de geschiedenis in bash te doorzoeken. Ik kan de vi-modus inschakelen in bash, maar ik kan het niet laten zoeken. Als ik /search of ?search doe, gebeurt er niets. Is er nog iets dat ik moet indrukken? Ik heb geprobeerd op enter te drukken en dan gebeurt dit:

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

Reacties

  • Is <C-r> werkt u echt niet voor u in vi-modus voor readline? Het werkt prima voor mij met de nieuwste versie van bash.
  • @ D.BenKnoble Ja dat is het, maar ik denk dat <C-r> de emacs-modus is en ik wil leren vi-modus.
  • <C-r> is slechts een recursieve zoekopdracht; niet zeker of het iets te maken heeft met emacs vs vi, vooral omdat het een bash-specifieke extensie kan zijn (mijn geheugen is wazig over dat detail). Ik ontmoedig je niet om / te gebruiken, alleen dat elk zijn (verschillende) toepassingen heeft.

Antwoord

Er is zeker zoeken in Vim-stijl in bash / readline. In feite is uw opdrachtregel in wezen een verkleinde versie van de Vim-editor met een aanzienlijk aantal normale modusopdrachten die voor u beschikbaar zijn. Meer daarover in een seconde maar eerst zoeken. Het belangrijkste stuk informatie dat je nodig hebt, is dat als je naar die knipperende cursor op je opdrachtregel staart, je in het equivalent bent van Vims invoegmodus. Dus hoe komen we in de normale modus? Door op Esc , natuurlijk.

Van daaruit drukt u op / , voert u een zoekterm in en drukt u op Enter . Nu kunt u n en N om heen en weer te bladeren door de resultaten. (U "zult effectief standaard achteruit zoeken met n ... vooruit zoeken vanaf het begin zou geen resultaten geven aangezien er geen geschiedenis is in de toekomst!) Om het huidige resultaat als een commando uit te voeren, drukt u nogmaals op Enter .

Vergeet niet dat u bevinden zich echter in de normale modus, dus als je niet vindt wat je zoekt en weer tekst wilt invoeren in de invoegmodus, doe dan wat je normaal doet in Vim. Als u bijvoorbeeld op i drukt, is dit voldoende. Of je kunt het Vim-commando C gebruiken om alle tekst na de cursor te verwijderen en de invoegmodus te openen, wat handig is. (U kunt dat vooraf laten gaan met 0 als u de cursor voorbij de eerste kolom heeft verplaatst.) Of gebruik A, a, R, s, s, I, Ctrl-C ... je krijgt de afbeelding.

Naast de verschillende opdrachten die de invoegmodus openen, kun je navigeren met b, B, e, E , w, W, 0, $, etc. Yank / delete / put zijn er ook, en je kunt ze erin gebruiken in actie + navigatiecommandos zoals yB, c2e, d$, etc. 1 Eindelijk, u ndo werkt ook! Ga je gang en probeer zelf wat andere dingen.

Oh, en als je een beetje verdwaalt of, zoals ik af en toe overkomt, een beetje funky met line wrapping je c / l door elkaar haalt, kun je de pretentie laten vallen en op . Dit trekt de inhoud van je opdrachtregel naar een daadwerkelijke instantie van Vim, zodat je deze kunt bewerken met een Volledig bewapende en operationele teksteditor . Als je klaar bent, :wq om wat je hebt naar de shell te sturen voor uitvoering.

1 Helaas, de operator + bewegingsopdrachten (caw, dis, yap, enz.) "worden niet ondersteund. Maar de opmerking van @EdNeville "s onderstaande opmerking bevat een link naar enkele readline-instellingen die schijnbaar zullen toevoegen elk op-motion-commando is er, evenals een aantal andere. Je kunt je op de opdrachtregel gebaseerde Vim-ervaring echt afronden door ze toe te voegen aan je .inputrc-bestand.


Aanvullende informatie : u bent niet beperkt tot het gebruik van wat set -o vi of set -o emacs geeft je. Je kunt elk van de beschikbare readline-opdrachten gebruiken. Ik denk dat Ctrl-R zelfs in de Vim-modus beschikbaar zou moeten zijn, maar zo niet, dan kun je het proberen plaats dit in uw ~/.inputrc ...

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

Nog beter, u kunt enkele anders niet beschikbare commandos toevoegen, zoals

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

Hiermee, als je eenmaal een commando uit de geschiedenis hebt geselecteerd (bijv.via Vim search) druk op Ctrl-O in plaats van Enter en Bash zal het commando uitvoeren en het volgende commando uit de geschiedenis invoegen, klaar om uit te voeren.

Zie Readline Command Names sectie in de Bash manpage voor een complete lijst.

(Je kunt deze ook vanaf de command line configureren met de bind maar ik" kom hier al te ver weg.)

Reacties

  • Leuk. Een leermoment.
  • @niklas, dit is je antwoord
  • @glennjackman Ik maak veel gebruik van deze functionaliteit. Echt nuttig voor mij.
  • @NiklasRosencrantz Ja, ik heb het begrepen. We probeer antwoorden te schrijven die over het algemeen nuttig zijn in plaats van uitsluitend gericht op de vraagsteller, dus heb ik de extra informatie toegevoegd over het mixen van commandos uit verschillende modi.
  • Je kunt ook dingen toevoegen als ciw als je .inputrc: usenix.org.uk/content/bash.html#input

Answer

wat @ B-Layer noemde, werkt redelijk goed in bash en op vergelijkbare wijze in zsh.

Omdat je VIM al gebruikt , en als je neovim of vim8 gebruikt, kun je ook :terminal proberen, wat opent de standaardterminal in vim.

Vervolgens kunt u het vim-commando gebruiken om door de uitvoer van de termminal te navigeren, evenals door de geschiedenis van de terminal-commandos te navigeren.

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *