Чи можна використовувати режим редагування Vim у командному рядку, не втрачаючи рекурсивного пошуку історії?


8

Я використовую zsh і, оскільки я завзятий користувач Vim, я просто перейшов на використання редагування стилю Vim у командному рядку. (Це означає, що якщо я наберіть ls foo/barі вирішу, що хочу cdзамість цього, я можу натиснути, Esc ^щоб повернутися до початку і cw cdзмінити lsна cd.

Це все денді, але проблема полягає в тому, що я більше не можу використовувати Ctrl+Rрекурсивний пошук історії. Чи є інший спосіб це зробити, або я можу якось перекрити вкладку Vim, щоб повернути її назад?


Важкий вибір! garyjohnпоказує спосіб Vim, як це зробити, і JdeBPпоказує, як повернути прив'язку клавіш для Ctrl + R назад! Я збираюся пограти з обома методами і згодом прийму відповідь. Я вирішу, виходячи з 1) який метод здається мені простішим і 2) який отримує більше результатів. Дякую обом!
Натан Лонг

Відповіді:


6

Звичайно, ви більше не можете використовувати Ctrl+ R. Якщо ви ознайомтеся з посібником із Z Shell, то ви побачите, що history-incremental-search-backwardу emacsграфічній картці віджета є лише прив’язка ключа . У клавішах vi немає ключових прив’язок для цього.

Але як ви також знайдете, прочитавши посібник (це глава 18), додавання прив'язки ключів є досить простою вправою у використанні bindkeyкоманди:

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

Вам навіть не потрібно використовувати zleкоманду для відображення віджета на функції оболонки, оскільки це стандартний віджет.

Якщо ви звернетесь до відповіді на це ж запитання, яке знаходиться у вікі Z Z Shell , ви побачите команди, які спеціально додають це до клавішів vi "команда" та "режим вставки":

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

Також зауважте, що, як вказує garyjohn , у клавіатурній карті vi "command", /символ прив'язується до vi-history-search-backwardвіджета. Різниця між цим віджетом та history-incremental-search-backwardвіджетом полягає у поведінці віджетів, яка застосовується, коли він перебуває в режимі пошуку історії. Ось кілька відмінностей, які ви помітите:

  • Переключення режимів vi:
    • Режим пошуку в history-incremental-search-backwardперемиканнях між mainта vicmdклавішними клавішами, коли ви викликаєте vi-cmd-modeвіджет, поки він залишається в режимі пошуку. тобто з emacsрежиму presssing на Escклавішах або Ctrl+ XCtrl+ Vклавіша перемикає режим пошуку між emacsі vicmdрозкладками. (Виклик history-incremental-search-backwardз vicmdрозкладки клавіатури, таким чином , клопітно, якщо ви пов'язуєте що - то vi-cmd-modeв vicmdрозкладці клавіатури , а також.)
    • Режим пошуку vi-history-search-backwardрозглядає vi-cmd-modeвіджет як accept-lineі закінчує пошук, повторно перейшовши в режим команд, з якого ви ввели пошук. тобто (з типовими прив'язками) /переходить у режим пошуку з командного режиму і Escповертається в командний режим.
  • Повторний пошук:
    • У програмах розпізнаються history-incremental-search-backwardяк history-incremental-search-backwardі vi-rev-repeat-searchвіджети. тобто (припускаючи, що ви змінили прив’язки, як описано вище) і Ctrl+, Rі Nбуде шукати попередній рядок відповідності.
    • В vi-history-search-backward, vi-rev-repeat-searchрозпізнається лише віджет. тобто (припускаючи, що ви змінили прив'язки, як описано вище) Ctrl+ Rспричинить звуковий сигнал і буде проігноровано.

Моя м’язова пам’ять благословляє вас!
Натан Лонг

4

У режимі vi в режимі bash при введенні <Esc>/<string><Enter>буде шукати історію команд <string>. nбуде шукати далі в історії; Nбуде шукати вперед. zshell може бути однаковим.


1
Це цікаво, однак - я часто використовую пошук як рух у Vim. Я думаю, я не можу використовувати його для переміщення в команді, яку я зараз редагую, оскільки вона прив’язана до історії пошуку, так?
Натан Лонг

Правильно. Але ви можете (принаймні у баші) використовувати f, F, t, T, ';' (крапка з комою) та "," (кома) для переміщення вперед та назад до окремих символів у рядку.
garyjohn

1

Я вважаю за краще використовувати:

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

Таким чином я можу набрати ESC /textта побачити командний рядок. Якщо я хочу пройти наступний матч, я набираюESC n

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.