Как показать текущий режим Vi при использовании сочетаний клавиш Vi в оболочке?

5742
sundar

Я использую сочетания клавиш vi в моей оболочке tcsh.

Теперь я не знаю, в каком режиме vi я нахожусь ( insertрежим или commandрежим), что приводит к большому разочарованию.

Кто-нибудь знает способ показать текущий режим vi в оболочке? (включив в подсказку или что-то)

15

7 ответов на вопрос

4
Bob Weber

Я не верю, что есть какой-либо способ визуально определить, в каком режиме вы находитесь, но если вы немного измените свое поведение, это не будет иметь значения.

Если вы хотите быть в командном режиме, нажмите ESC, прежде чем вводить команду.

Если вы хотите быть в режиме вставки, нажмите ESC и i, прежде чем вводить содержимое.

В конечном итоге вы будете часто нажимать ESC, но каждый пользователь vi, которого я когда-либо встречал, все равно делает это.

Проблема в том, что в оболочке дополнительные ESC не игнорируются - когда я даю дополнительный ESC, затем набираю команду (скажем, h, чтобы переместиться влево), он просто издает звуковой сигнал и ничего не делает. sundar 14 лет назад 1
Под «дополнительным ESC» я имею в виду нажатие ESC, когда я уже нахожусь в командном режиме - что я часто делаю, так как не знаю, в каком режиме я нахожусь. sundar 14 лет назад 2
Ты прав. Я использовал его так долго, что даже не замечал такого поведения. Опять самый простой ответ. Если вы нажмете ESC и h, и ничего не произойдет, нажмите h снова. Я думаю, что это открывает другой вопрос. Почему нажатие ESC в режиме «команда» сочетаний клавиш vi приводит к неправильной интерпретации следующего символа? Ви сама не делает этого. Я могу набрать ESC 10 раз, и следующая команда все еще работает, как и ожидалось. Bob Weber 14 лет назад 0
Еще один совет, выключите звонок. Это невероятно раздражает только по той причине, которую вы описываете - и потому, что оно подает звуковой сигнал при завершении вкладки. Существуют различные способы сделать это в зависимости от вашей среды. Bob Weber 14 лет назад 0
Хорошо, я сейчас пробую это решение. Сопоставление Caps Lock с Escape облегчило реализацию этого, но я еще не привык к ESC-i для режима вставки. Я надеюсь, что скоро буду. > Если вы нажмете ESC и h, и ничего не произойдет, снова нажмите h. Проблема в том, что это очень расстраивает и сильно нарушает поток. Это дополнительная вещь, о которой я должен подумать в дополнение к команде, которую я формирую. Я предпочитаю сочетания клавиш vi по той самой причине, что они находятся в моей мышечной памяти и дают меньше вещей для размышлений - такого рода разрывы сами по себе ... sundar 14 лет назад 1
3
nagul

Я просмотрел документацию и должен сказать, что не смог найти способ обнаружить и отобразить текущий режим vi. Я надеюсь, что у вас есть приятный сюрприз, и кто-то придумывает решение, но я, конечно, не могу найти способ сделать то, что вы просите.

Я думаю, что есть способ сделать это, но это огромное излишество для крошечного раздражения, и я не думаю, что это то, что вы имели в виду, когда задали этот вопрос. Если это правда, прекратите читать сейчас и наслаждайтесь жизнью.

OTOH, если это действительно ваша любимая мозоль, и она сводит вас с ума, и вы действительно отчаянно хотите решить эту проблему, вот моя идея, как это сделать:

  1. Получите копию расширенного программирования в среде UNIX® от Ричарда Стивенса.
  2. Прочитайте главы о потоках и терминале ввода / вывода.
  3. Загрузите исходный код в вышеупомянутую книгу, которая включает в себя пример потока, который может быть наслоен на терминал.
  4. Реализуйте свою обработку для комбинации клавиш Esc (или обоих сочетаний клавиш изменения режима), и укажите это через звонок или фоновые манипуляции текущей строки.

Вкратце, Unix реализует терминальный ввод-вывод в виде полнодуплексного потока ввода-вывода между драйвером устройства и пользовательским процессом, в который могут быть вставлены модули. Он организован в виде стека, поэтому вы можете наложить столько потоков, сколько захотите. Сумма введенных потоков создает ваше поведение терминала ввода / вывода.

Когда вводится символ, первый модуль проверяет его и передает его (если хочет). Когда ответ приходит в противоположном направлении, он снова получает возможность проверить и передать его. Вот как Ctrl-C обрабатывается на более высоком уровне, чем обычная символьная клавиша.

Вы можете создать двоичный файл, реализующий потоковый модуль, который при вызове работает бесшумно на переднем плане, проверяя и передавая все нажатия клавиш, выполняя предпочитаемое действие над нажатиями клавиш, которые вас интересуют. В любом случае, это будет выглядеть так, как будто вы работаете над оболочкой. Оооо. Вы можете вызвать этот двоичный файл в последней (или первой, или любой) строке вашего .tcshrc, и вы даже не узнаете, что он там есть.

Там хороший праймер здесь, но я не мог найти много на эту тему, наверное, потому, что мимо его премьер.

2
redacted

На этой странице есть довольно подробный скрипт, который устанавливает то, что вы хотите (и даже больше) в zsh . Возможно, он может быть адаптирован для работы с tcsh (я не очень знаком с этой оболочкой).

Я тоже не знаком с tcsh, но я думаю, что на странице, которую вы показывали, используются виджеты zsh (с zle). Я не думаю, что другие оболочки имеют это, но если они это сделают, это определенно добьется цели. BrianH 14 лет назад 0
0
nik

Редактирование командной строки с помощью tcsh

Существует два основных режима редактирования командной строки,
основанные на двух наиболее часто используемых текстовых редакторах, Emacs и vi.

При использовании привязок vi вы должны переключаться между режимами вставки и командования ;
разные команды полезны в каждом режиме.

В режиме vi есть два подрежима:режим вставки и командный режим.

  • Режим по умолчанию - вставка .
  • Вы можете переключаться между режимами нажатиемEsc .
  • В качестве альтернативы, в командном режиме
    ввод «a» (добавление) или «i» (вставка) вернет вас в режим вставки
    .

Другие заметки на странице tcshнастройки уже связаны выше.

Ваши ссылки идут на авторские книги О'Рейли ... BrianH 14 лет назад 2
0
J.j. Loneman

I had the same exact problem and by accident have found the solution. Although this thread is old, I couldn't find any other website that offered a solution, so I assume posting on this thread is okay.

Just reset the settings of your terminal program or shell. I'm currently using PuTTY, and I just deleted my saved settings for my saved connection, and recreated a saved session. Worked like a charm.

Hope this helps!

0
Dylan Cali

Пожалуйста, смотрите мой ответ на SO . Bash 4.4 / Readline 7.0 добавит поддержку этой функции, и тем временем я опубликовал исправленные версии Bash 4.3 / Readline 6.3 для github .

0
ber532k

Для тех, кто имеет эту точную проблему (как и я): я нашел решение в stackoverflow . Очевидно, в readline есть встроенная поддержка для этого, так что вы можете просто добавить следующее в свой ~/.inputrc:

set show-mode-in-prompt on 

И чтобы настроить фактическое использование символов:

set vi-ins-mode-string "custom-ins" set vi-cmd-mode-string "custom-cmd" 

Похожие вопросы