Come eseguire la ricerca nella cronologia in modalità Vi in bash

Voglio trovare lalternativa a ctrl + R per cercare nella cronologia in bash. Posso abilitare la modalità vi in bash ma non posso farla cercare. Quando faccio /search o ?search non succede nulla. Cè qualcosaltro che dovrei premere? Ho provato a premere Invio e poi è successo questo:

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

Commenti

  • È <C-r> davvero non funziona per te in modalità vi per readline? Per me funziona bene con lultima versione di bash.
  • @ D.BenKnoble Sì, lo è, ma penso che <C-r> sia la modalità emacs e voglio imparare modalità vi.
  • <C-r> è solo una ricerca ricorsiva; non sono sicuro che abbia qualcosa a che fare con emacs vs vi, soprattutto perché potrebbe essere unestensione specifica di bash (la mia memoria è sfocata su quel dettaglio). Non ti sto scoraggiando dallusare /, solo che ognuno ha i suoi (diversi) usi.

Risposta

Esiste certamente una ricerca in stile Vim in bash / readline. In effetti, la tua riga di comando è essenzialmente una versione ridotta delleditor Vim con un numero significativo di comandi in modalità Normale disponibili. Altro su questo in un secondo, ma prima Cerca. Linformazione chiave di cui hai bisogno è che mentre fissi quel cursore lampeggiante sulla tua riga di comando sei nellequivalente della modalità di inserimento di Vim. Quindi come si arriva alla modalità Normale? Premendo Esc , ovviamente.

Da lì premi / , inserisci un termine di ricerca e premi Invio . Ora puoi usare n e N per spostarti avanti e indietro tra i risultati. (Effettuerai effettivamente una ricerca allindietro per impostazione predefinita con n … cercando in avanti dallinizio non darebbe alcun risultato poiché non cè cronologia in futuro!) Per eseguire il risultato corrente come comando, premi di nuovo Invio .

Non dimenticarti di te stesso sei in modalità Normale, quindi, se non trovi quello che stai cercando e vuoi tornare a inserire il testo in modalità Inserimento, fai quello che fai normalmente in Vim. Ad esempio, premere i lo farà. Oppure puoi usare il comando Vim C che rimuoverà qualsiasi testo dopo il cursore ed entrerà in modalità di inserimento, che è utile. (Puoi anteporre 0 se hai spostato il cursore oltre la prima colonna.) Oppure utilizza A, a, R, s, s, I, Ctrl-C … ottieni limmagine.

Oltre ai vari comandi che entrano in modalità di inserimento puoi navigare con b, B, e, E , w, W, 0, $, ecc. Ci sono anche Yank / delete / put e puoi usarli in azione + comandi di navigazione come yB, c2e, d$, ecc. 1 Infine, anche u ndo funziona! Vai avanti e prova tu stesso altre cose.

Oh, e se ti perdi un po o, come mi capita di tanto in tanto, un po di bizzarro con il ritorno a capo confonde il tuo c / l puoi lasciar perdere e premere v. Questo trasferisce i contenuti della tua riga di comando in unistanza reale di Vim in modo che tu possa modificare con un Editor di testo completamente armato e operativo . Una volta fatto, :wq per inviare ciò che hai alla shell per lesecuzione.

1 Ahimè, loperatore + i comandi di movimento (caw, dis, yap e così via) non sono supportati. Ma il commento di @EdNeville “di seguito contiene un link ad alcune impostazioni di readline che apparentemente aggiungeranno ogni comando op-motion esiste e molti altri. Puoi davvero completare la tua esperienza Vim basata sulla riga di comando aggiungendoli al tuo file .inputrc.


Ulteriori informazioni : non sei limitato a utilizzare solo ciò che set -o vi o set -o emacs ti dà. Puoi usare uno qualsiasi dei comandi readline disponibili. Credo che Ctrl-R dovrebbe essere disponibile anche in modalità Vim ma in caso contrario puoi provare inserendolo nel tuo ~/.inputrc

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

Meglio ancora, puoi aggiungere alcuni comandi altrimenti non disponibili come

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

Con questo, una volta selezionato un comando dalla cronologia (ad es.tramite la ricerca Vim) premi Ctrl-O invece di Enter e Bash eseguirà il comando e inserirà il comando successivo dalla cronologia, pronto per lesecuzione.

Vedi la sezione Readline Command Names nella manpage di Bash per un elenco completo.

(Puoi anche configurarli dalla riga di comando con bind ma sto già andando troppo lontano qui.)

Commenti

  • Bello. Un momento di apprendimento.
  • @niklas, questa è la tua risposta
  • @glennjackman Uso molto questa funzionalità. Veramente utile per me.
  • @NiklasRosencrantz Sì, ho capito. Noi prova a scrivere risposte che siano generalmente utili piuttosto che focalizzate esclusivamente sullinterrogante, quindi ho aggiunto le informazioni extra sulla combinazione di comandi da diverse modalità.
  • Puoi anche aggiungere cose come ciw se modifichi .inputrc: usenix.org.uk/content/bash.html#input

Risposta

ciò che @ B-Layer menzionato funziona abbastanza bene in bash e similmente in zsh.

Dato che stai già usando VIM e se utilizzi neovim o vim8, puoi anche provare :terminal, che aprirà il terminale predefinito in vim.

Quindi puoi usare il comando vim per navigare nelloutput del termminal, così come navigare nella cronologia dei comandi del terminale.

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *