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
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.
<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.<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).