Czy mogę używać trybu edycji Vima w wierszu poleceń bez utraty rekurencyjnego wyszukiwania historii?

8

Używam zsh i, ponieważ jestem zapalonym użytkownikiem Vima, właśnie przełączyłem się na edycję w stylu Vima w wierszu poleceń. (Oznacza to, że jeśli piszę ls foo/bari zdecyduję, że chcę, cdzamiast tego, mogę uderzyć, Esc ^aby przejść z powrotem do początku i cw cdprzejść lsna cd.

To wszystko dandys, ale problem polega na tym, że nie mogę już używać Ctrl+Rrekurencyjnego przeszukiwania historii. Czy istnieje inny sposób, aby to zrobić, czy mogę w jakiś sposób ominąć klawisze Vima, aby je odzyskać?

Nathan Long
źródło
Trudny wybór! garyjohnpokazuje sposób Vima, jak to zrobić i JdeBPpokazuje, jak odzyskać skrót klawiszowy dla Ctrl + R z powrotem! Będę grać obiema metodami i przyjmuję odpowiedź później. Zdecyduję na podstawie 1), która metoda wydaje mi się łatwiejsza, i 2) która zyskuje więcej głosów pozytywnych. Dziękuję wam obu!
Nathan Long,

Odpowiedzi:

6

Oczywiście nie możesz już używać Ctrl+ R. Jeśli zajrzysz do instrukcji Z Shell, zobaczysz, że history-incremental-search-backwardwidżet w emacsmapie klawiszy zawiera tylko przypisanie klawiszy . W mapach klawiszy vi nie ma dla niego żadnych powiązań klawiszy.

Ale jak można również przeczytać w podręczniku (rozdział 18.), dodanie powiązania klawiszy jest dość prostym ćwiczeniem w użyciu bindkeypolecenia:

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

Nie musisz nawet używać zlepolecenia do mapowania widgetu na funkcję powłoki, ponieważ jest to standardowy widget.

Jeśli przejrzysz odpowiedź na to samo pytanie, które znajduje się na wiki Z Shell , zobaczysz polecenia do specjalnego dodania tego do mapowania klawiszy „polecenie” i „tryb wstawiania” vi:

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

Zwróć też uwagę, że jak wskazuje garyjohn , w mapie klawiszy vi „polecenia” /postać jest powiązana z vi-history-search-backwardwidżetem. Różnica między tym widżetem a history-incremental-search-backwardwidżetem polega na tym, że zachowanie widżetu ma zastosowanie, gdy jest się w trybie wyszukiwania historii. Oto kilka różnic, które zauważysz:

  • Przełączanie trybów vi:
    • Tryb wyszukiwania history-incremental-search-backwardprzełącza między mapami klawiszy maina vicmdmapami klawiszy, gdy wywołujesz vi-cmd-modewidget, pozostając w trybie wyszukiwania. tzn. w emacstrybie naciśnięcie Escklawisza lub Ctrl+ XCtrl+ Vprzełącza tryb wyszukiwania między mapami klawiszy emacsi vicmd. (Wywoływanie history-incremental-search-backwardz vicmdmapy klawiszy jest więc kłopotliwe, chyba że coś wiążesz również vi-cmd-modez vicmdmapą klawiszy).
    • Tryb wyszukiwania w vi-history-search-backwardtraktuje vi-cmd-modewidżet jako accept-linei zakończy wyszukiwanie, ponownie wchodząc w tryb poleceń, z którego wprowadzono wyszukiwanie. tj. (z domyślnymi powiązaniami) /wchodzi w tryb wyszukiwania z trybu poleceń i Escwraca do trybu poleceń.
  • Powtarzanie wyszukiwania:
    • W history-incremental-search-backwardzarówno widżety , jak history-incremental-search-backwardi vi-rev-repeat-searchwidżety są rozpoznawane. tzn. (zakładając, że zmieniłeś powiązania jak wyżej) zarówno Ctrl+ Ri Nbędą szukać poprzedniej pasującej linii.
    • W vi-history-search-backward, tylko vi-rev-repeat-searchwidżet jest rozpoznawany. tzn. (zakładając, że zmieniłeś powiązania jak wyżej) Ctrl+ Rwygeneruje sygnał dźwiękowy i zostanie zignorowany.
JdeBP
źródło
Moja pamięć mięśni cię błogosławi!
Nathan Long
4

W trybie vi basha pisanie <Esc>/<string><Enter>przeszuka historię poleceń <string>. nbędzie szukać dalej w historii; Nbędzie szukać do przodu. Zshell może być taki sam.

garyjohn
źródło
1
To ciekawe - często używam wyszukiwania jako ruchu w Vimie. Chyba nie mogę go użyć do poruszania się w poleceniu, które aktualnie edytuję, ponieważ jest powiązane z historią wyszukiwania, co?
Nathan Long,
Dobrze. Ale możesz (przynajmniej w bash) użyć f, F, t, T, ';' (średnik) i polecenia „,” (przecinek), aby przejść do przodu i do tyłu do określonych znaków w linii.
garyjohn
1

Wolę używać:

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

W ten sposób mogę wpisać ESC /texti zobaczyć wiersz poleceń. Jeśli chcę przejść do następnego meczu, piszęESC n

Jonas Fagundes
źródło