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

15

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

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

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

Сундар
источник

Ответы:

4

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

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

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

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

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

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

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

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

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

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

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

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

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

Нагул
источник
2

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

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

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

set show-mode-in-prompt on

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

set vi-ins-mode-string "custom-ins"
set vi-cmd-mode-string "custom-cmd"
ber532k
источник
0

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

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

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

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

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

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

Nik
источник
2
Ваши ссылки идут на авторские книги О'Рейли ...
BrianH
0

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

Просто сбросьте настройки вашей терминальной программы или оболочки. В настоящее время я использую PuTTY, и я просто удалил свои сохраненные настройки для своего сохраненного соединения и заново создал сохраненный сеанс. Работал как шарм.

Надеюсь это поможет!

Jj Loneman
источник
0

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

Дилан Кали
источник