Cum se execută căutarea istoricului în modul Vi în bash

Vreau să găsesc alternativa la ctrl + R pentru a căuta istoricul în bash. Pot activa modul vi în bash, dar nu îl pot face să caute. Când fac /search sau ?search nu se întâmplă nimic. Mai trebuie să apăs ceva? Am încercat să apăsați Enter și apoi se întâmplă acest lucru:

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

Comentarii

  • Este <C-r> chiar nu funcționează pentru dvs. în modul vi pentru readline? Funcționează bine pentru mine cu cea mai recentă versiune de bash.
  • @ D.BenKnoble Da, da, dar cred că <C-r> este modul emacs și vreau să învăț modul vi.
  • <C-r> este doar o căutare recursivă; nu sunt sigur că are vreo legătură cu emacs vs vi, mai ales că ar putea fi o extensie specifică bash-ului (memoria mea este neclară pentru acel detaliu). Nu vă descurajez să utilizați /, doar că fiecare are utilizările sale (diferite).

Răspuns

Cu siguranță există căutarea stilului Vim în bash / readline. De fapt, linia dvs. de comandă este în esență o versiune redusă a editorului Vim, cu un număr semnificativ de comenzi în modul Normal disponibile pentru dvs. Mai multe despre asta într-o secțiune, dar prima căutare. Informația cheie de care aveți nevoie este că, în timp ce vă uitați la cursorul care clipește pe linia de comandă, vă aflați în echivalentul modului de inserare Vim. Deci, cum ajungem în modul normal? Apăsând Esc , desigur.

De acolo apăsați / , introduceți un termen de căutare și apăsați Enter . Acum puteți utiliza n și N pentru a vă deplasa înainte și înapoi prin rezultate. (Veți efectiv căuta înapoi în mod implicit cu n … căutând înainte de la început nu ar da rezultate deoarece nu există istoric în viitor!) Pentru a executa rezultatul curent ca o comandă apăsați Enter din nou.

Nu uitați că voi ” Totuși, sunteți în modul Normal, deci, dacă nu găsiți ceea ce căutați și doriți să reveniți la introducerea textului în modul Insert, faceți ceea ce faceți de obicei în Vim. Dacă apăsați i , de exemplu, o veți face. Sau puteți utiliza comanda Vim C care va elimina orice text după cursor și va intra în modul Insert, care este la îndemână. (Puteți preceda acest lucru cu 0 dacă ați mutat cursorul pe lângă prima coloană.) Sau utilizați A, a, R, s, s, I, Ctrl-C … veți obține imaginea.

Pe lângă diferitele comenzi care intră în modul Insert, puteți naviga cu b, B, e, E , w, W, 0, $, etc. Yank / delete / put există, de asemenea, și le puteți utiliza în comenzi de acțiune + navigare precum yB, c2e, d$, etc. 1 În cele din urmă, u ndo funcționează și! Mergeți mai departe și încercați și voi alte lucruri.

Oh, și dacă te pierzi puțin sau, așa cum mi se întâmplă din când în când, ceva funky cu înfășurarea liniei îți amestecă c / l, poți renunța la pretenție și să lovești v. Aceasta atrage conținutul liniei de comandă într-o instanță reală a Vim, astfel încât să puteți edita cu un Editor de text complet armat și operațional . După ce ați terminat, :wq pentru a trimite ceea ce aveți la shell pentru executare.

1 Din păcate, operatorul + comenzile de mișcare (caw, dis, yap etc.) nu sunt acceptate. Dar comentariul de mai jos al @EdNeville are un link către câteva setări de readline care vor adăuga aparent fiecare comandă op-motion de acolo este la fel ca și o serie de altele. Puteți rotunji cu adevărat experiența Vim bazată pe linia de comandă adăugându-le în fișierul dvs. .inputrc.


Informații suplimentare : Nu sunteți limitat să folosiți doar ceea ce set -o vi sau set -o emacs vă oferă. Puteți utiliza oricare dintre comenzile de readline disponibile. Cred că Ctrl-R ar trebui să fie disponibil chiar și în modul Vim, dacă nu, puteți încerca punând acest lucru în ~/.inputrc

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

Mai bine, puteți adăuga câteva comenzi altfel indisponibile, cum ar fi

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

Cu aceasta, după ce ați selectat o comandă din istoric (de ex.prin căutare Vim) apăsați Ctrl-O în loc de Enter și Bash va rula comanda și va insera următoarea comandă din istoric, gata de rulare.

Consultați secțiunea Citiți numele comenzilor în pagina manuală Bash pentru lista completă.

(Puteți configura acestea și din linia de comandă cu bind comanda, dar” mă aflu deja prea departe aici.)

Comentarii

  • Frumos. Un moment de învățare.
  • @niklas, acesta este răspunsul dvs.
  • @glennjackman Folosesc intens această funcționalitate. Îmi este foarte utilă.
  • @NiklasRosencrantz Da, am înțeles. Noi încercați să scrieți răspunsuri care sunt în general utile, mai degrabă decât concentrate exclusiv pe întrebător, așa că am adăugat informații suplimentare despre amestecarea comenzilor din diferite moduri.
  • De asemenea, puteți adăuga lucruri precum ciw dacă modificați .inputrc: usenix.org.uk/content/bash.html#input

Răspuns

ceea ce a menționat @ B-Layer funcționează destul de bine în bash și similar în zsh.

Deoarece utilizați deja VIM și dacă utilizați neovim sau vim8, puteți încerca și :terminal, care va deschide terminalul implicit în vim.

Apoi puteți utiliza comanda vim pentru a naviga la ieșirea terminalei, precum și pentru a naviga în istoricul comenzilor terminalului.

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

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *