Posso usare la modalità di modifica di Vim sulla riga di comando senza perdere la ricerca cronologica ricorsiva?


8

Sto usando zsh e, dato che sono un appassionato utente di Vim, sono appena passato all'utilizzo della modifica in stile Vim sulla riga di comando. (Ciò significa che se scrivo ls foo/bare decido di volerlo cdinvece, posso premere Esc ^per tornare all'inizio e cw cdpassare lsa cd.

Questo è tutto dandy, ma il problema è che non posso più usare Ctrl+Rper fare ricerche ricorsive nella cronologia. C'è un altro modo per farlo, o posso in qualche modo sovrascrivere il tasto Vim per ripristinarlo?


Una scelta difficile! garyjohnmostra un modo Vim per farlo, e JdeBPmostra come riavere i tasti per Ctrl + R! Giocherò con entrambi i metodi e accetterò una risposta in seguito. Deciderò in base a 1) quale metodo mi sembra più semplice e 2) quale ottiene più voti. Grazie a tutti e due!
Nathan Long,

Risposte:


6

Ovviamente non puoi più usare Ctrl+ R. Se consulti il ​​manuale di Z Shell vedrai che history-incremental-search-backwardnella emacskeymap è presente solo un'associazione chiave per il widget . Non ci sono combinazioni di tasti per questo nelle mappe dei tasti vi.

Ma come troverai anche leggendo il manuale (È il capitolo 18.), l'aggiunta di un'associazione di tasti è un esercizio abbastanza semplice nell'uso del bindkeycomando:

bindkey "^R" history-incremental-search-backward

Non è nemmeno necessario utilizzare il zlecomando per mappare il widget su una funzione shell, poiché si tratta di un widget standard.

Se consulti la risposta a questa stessa domanda che si trova sul wiki di Z Shell , vedrai i comandi per l'aggiunta specifica di questo alle mappe dei tasti vi "command" e "insert mode":

bindkey -M viins '^R' history-incremental-search-backward
bindkey -M vicmd '^R' history-incremental-search-backward

Si noti inoltre che, come sottolinea garyjohn , nella mappa dei tasti vi "command", il /carattere è associato al vi-history-search-backwardwidget. La differenza tra questo widget e il history-incremental-search-backwardwidget è il comportamento del widget che si applica quando si è nella modalità di ricerca della cronologia. Ecco un paio di differenze che noterai:

  • Cambio modalità vi:
    • La modalità di ricerca si history-incremental-search-backwardalterna tra le mappe dei tasti maine vicmdquando si richiama il vi-cmd-modewidget rimanendo comunque nella modalità di ricerca. cioè dalla emacsmodalità premendo il Esctasto o i tasti Ctrl+ XCtrl+ si Vcommuta la modalità di ricerca tra i tasti emacse vicmd. (Richiamare history-incremental-search-backwarddalla vicmdmappa della tastiera è quindi problematico, a meno che non si legano qualcosa vi-cmd-modenella vicmdmappa della tastiera come bene.)
    • La modalità di ricerca vi-history-search-backwardconsidera il vi-cmd-modewidget come accept-linee termina la ricerca, rientrando nella modalità di comando da cui è stata immessa la ricerca. ovvero (con i collegamenti predefiniti) /entra nella modalità di ricerca dalla modalità di comando e Esctorna alla modalità di comando.
  • Ripetendo una ricerca:
    • In history-incremental-search-backward, vengono riconosciuti sia history-incremental-search-backwardil vi-rev-repeat-searchwidget sia il widget. cioè (presumendo che tu abbia modificato i collegamenti come sopra) entrambi Ctrl+ Re Ncercherà una linea di corrispondenza precedente.
    • In vi-history-search-backward, vi-rev-repeat-searchviene riconosciuto solo il widget. cioè (presumendo che tu abbia modificato i collegamenti come sopra) Ctrl+ Rcauserà un bip e sarà ignorato.

La mia memoria muscolare ti benedice!
Nathan Long,

4

Nella modalità vi di bash, digitando si <Esc>/<string><Enter>cercherà la cronologia dei comandi <string>. ncercherà più indietro nella storia; Ncercherà in avanti. zshell potrebbe essere lo stesso.


1
È interessante, però: uso spesso la ricerca come movimento in Vim. Immagino di non poterlo usare per spostarmi all'interno del comando che sto attualmente modificando, dato che è ancorato alla ricerca nella cronologia, eh?
Nathan Long,

Giusto. Ma puoi (almeno in bash) usare f, F, t, T, ';' (punto e virgola) e ',' (virgola) per spostarsi avanti e indietro su caratteri particolari nella riga.
garyjohn,

1

Preferisco usare:

bindkey -M vicmd '/' history-incremental-search-backward

In questo modo posso digitare ESC /texte vedere la riga di comando. Se voglio andare alla prossima partita che scrivoESC n

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.