Jak spustit vyhledávání historie v režimu Vi v bash

Chci najít alternativu k ctrl + R pro hledání historie v bash. Mohu povolit režim vi v bash, ale nemohu ho vyhledávat. Když udělám /search nebo ?search nic se neděje. Je něco víc, co bych měl stisknout? Zkusil jsem stisknout klávesu Enter a pak se to stalo:

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

Komentáře

  • Je <C-r> opravdu pro vás nefunguje v režimu vi pro readline? Funguje mi dobře s nejnovější verzí bash.
  • @ D.BenKnoble Ano, je, ale myslím, že <C-r> je režim emacs a já se chci naučit režim vi.
  • <C-r> je pouze rekurzivní vyhledávání; nejste si jisti, že to má něco společného s emacs vs vi, zejména proto, že by to mohlo být rozšíření specifické pro bash (moje paměť je na tomto detailu fuzzy). Nedoporučuji vám používat /, jen každý z nich má své (jiné) využití.

Odpovědět

Určitě existuje vyhledávání stylů Vim v bash / readline. Ve skutečnosti je váš příkazový řádek v podstatě zmenšenou verzí editoru Vim se značným počtem příkazů v normálním režimu, které máte k dispozici. Více o tom za sekundu, ale nejdříve Hledat. Klíčovou informací, kterou potřebujete, je to, že když se díváte na blikající kurzor na příkazovém řádku, jste v ekvivalentu režimu Vimova vložení. Jak se tedy dostaneme do normálního režimu? Stisknutím klávesy Esc , samozřejmě.

Odtud stiskněte / , zadejte hledaný výraz a stiskněte Enter . Nyní můžete použít n a N pro pohyb tam a zpět ve výsledcích. (Ve výchozím nastavení budete efektivně hledat vzad a n … hledat vpřed od začátku nedal bych žádné výsledky, protože v budoucnu nebude žádná historie!) Chcete-li provést aktuální výsledek jako příkaz, stiskněte Enter znovu.

Nezapomeňte, že vy “ jste v normálním režimu, takže pokud nenajdete, co hledáte, a chcete se vrátit k zadávání textu v režimu Vložit, udělejte to, co obvykle děláte ve Vimu. Například stisknutí klávesy i to udělá. Nebo můžete použít příkaz Vim C, který odstraní veškerý text za kurzorem a vstoupí do režimu Vložit, což je užitečné. (Tomu můžete předcházet 0, pokud jste kurzor přesunuli za první sloupec.) Nebo použijte A, a, R, s, s, I, Ctrl-C … získáte obrázek.

Kromě různých příkazů, které vstupují do režimu Vložit, můžete procházet pomocí b, B, e, E , w, W, 0, $ atd. Jsou tam také Yank / delete / put a můžete je v nich použít v akci + navigační příkazy jako yB, c2e, d$ atd. 1 Nakonec u ndo funguje také! Jděte do toho a vyzkoušejte některé další věci sami.

Ach, a pokud se trochu ztratíte, nebo, jak se mi občas stane, nějaká funkčnost se zalamováním řádků zakóduje vaše c / l, můžete odhodit předstírání a stisknout v. Tím se obsah vašeho příkazového řádku vtáhne do skutečné instance Vim, takže jej můžete upravovat pomocí plně ozbrojeného a provozního textového editoru . Po dokončení :wq odešlete do shellu to, co máte k provedení.

1 Bohužel, operátor + pohybové příkazy (caw, dis, yap atd.) nejsou podporovány. Ale @EdNeville níže uvedený komentář obsahuje odkaz na některá nastavení readline , která zdánlivě přidá každý příkaz op-motion existuje stejně jako řada dalších. Svůj zážitek z Vim založené na příkazovém řádku můžete opravdu zaokrouhlit přidáním do souboru .inputrc.


Další informace : Nejste omezeni na používání toho, co set -o vi nebo set -o emacs vám dává. Můžete použít kterýkoli z dostupných příkazů readline. Věřím, že Ctrl-R by měl být k dispozici i v režimu Vim, ale pokud ne, můžete to zkusit vložením do ~/.inputrc

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

Ještě lépe, můžete přidat některé jinak nedostupné příkazy jako

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

Tímto způsobem, jakmile vyberete příkaz z historie (např.pomocí vyhledávání Vim) stiskněte Ctrl-O místo Enter a Bash spustí příkaz a vloží další příkaz z historie, připravený ke spuštění.

Úplný seznam najdete v části Názvy příkazových řádků pro čtení na stránce Bash.

(Můžete je také nakonfigurovat z příkazového řádku pomocí bind příkaz, ale už se sem dostávám příliš daleko.)

Komentáře

  • Pěkné. Učební moment.
  • @niklas, toto je vaše odpověď
  • @glennjackman Tuto funkci velmi využívám. Opravdu užitečné pro mě.
  • @NiklasRosencrantz Ano, rozuměl jsem. zkuste napsat odpovědi, které jsou obecně užitečné, nikoli pouze zaměřené na tazatele, a tak jsem přidal další informace o míchání příkazů z různých režimů.
  • Můžete také přidat věci jako ciw pokud upravíte .inputrc: usenix.org.uk/content/bash.html#input

Odpověď

to, co zmínila @ B-Layer, funguje docela dobře v bash a podobně v zsh.

Protože již používáte VIM , a pokud používáte neovim nebo vim8, můžete také vyzkoušet :terminal, které otevře výchozí terminál v vim.

Potom můžete pomocí příkazu vim procházet výstup terminálu a procházet historii příkazů terminálu.

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *