Вопрос или проблема
Я использую привязки клавиш vi в моей оболочке tcsh.
Сейчас я не знаю, в каком режиме vi я нахожусь (режиме вставки
или командном
), что приводит к большому разочарованию.
Кто-нибудь знает способ показать текущий режим vi в оболочке? (например, добавив в командную строку или что-то подобное)
Я не верю, что существует какой-либо способ определить визуально, в каком вы режиме, но если вы немного измените свое поведение, это не будет иметь значения.
Если вы хотите быть в командном режиме, нажмите ESC перед вводом команды.
Если вы хотите быть в режиме вставки, нажмите ESC и i перед вводом содержимого.
Вы будете часто нажимать ESC, но каждый пользователь vi, которого я когда-либо встречал, всё равно так делает.
Тем, у кого та же проблема (как и у меня): я нашел решение на stackoverflow. Оказывается, в readline есть родная поддержка этого, поэтому вы можете просто добавить следующее в ваш ~/.inputrc
:
set show-mode-in-prompt on
И для настройки символа используйте:
set vi-ins-mode-string "custom-ins"
set vi-cmd-mode-string "custom-cmd"
Я посмотрел документацию и должен сказать, что не нашел способов определять и отображать текущий режим vi. Надеюсь, вас приятно удивят и кто-то придумает решение, но я определенно не вижу способа сделать то, что вы спрашиваете.
Я думаю, есть способ сделать это, но это явный перебор для небольшой неприятности, и я не думаю, что это то, что вы имели в виду, задавая этот вопрос. Если это так, перестаньте читать и наслаждайтесь жизнью.
С другой стороны, если это действительно ваша навязчивая идея, и это сводит вас с ума, и вы действительно абсолютно хотите разобраться с этой проблемой, вот моя идея, как к этому подойти:
- Приобретите копию Advanced Programming in the UNIX(R) Environment от W. Richard Stevens.
- Прочитайте главы, посвященные потокам данных и терминальному вводу/выводу.
- Скачайте исходный код к упомянутой книге, который содержит пример потока, который можно наложить на терминал.
- Реализуйте обработку комбинации клавиш Esc (или обоих нажатий, переключающих режимы) и указывайте это с помощью сигнала или манипуляций с фоном текущей строки.
Вкратце, Unix реализует терминальный ввод/вывод как двусторонний поток данных между драйвером устройства и пользовательским процессом, в который могут быть вставлены модули. Это организовано как стек, так что вы можете накладывать сколько угодно потоков. Сумма инъекций потоков создаёт ваше поведение терминального ввода/вывода.
Когда вносится символ, первый модуль получает возможность его проанализировать и передать (если захочет). Когда ответ приходит в противоположном направлении, он снова получает возможность анализировать и передавать. Так, например, обработка Ctrl-C выполняется на более высоком уровне, чем обычная клавиша символа.
Вы можете создать бинарный файл, реализующий модуль потока, который при вызове работает в тихом режиме на переднем плане, анализируя и передавая все нажатия клавиш, выполняя ваши предпочтительные действия с клавишами, которые вас интересуют. Для всех намерений и целей, это будет выглядеть так, как будто вы работаете в оболочке. Ооо. Вы можете вызвать этот бинарный файл на последней (или первой, или любой) линии вашего .tcshrc, и вы даже не будете знать, что он там.
Здесь есть хороший вводный курс здесь, хотя я не смог найти много информации по этой теме, вероятно, потому что она устарела.
Эта страница содержит довольно детализированный скрипт, который настраивает то, что вам нужно (и даже больше) в zsh. Возможно, его можно адаптировать для работы с tcsh (я не очень хорошо знаком с этой оболочкой).
Командное редактирование в tcsh
Существует два основных режима редактирования командной строки,
основанных на двух наиболее часто используемых текстовых редакторах, Emacs и vi.С привязками клавиш vi вы должны переключаться между режимами вставки и командного управления;
разные команды полезны в каждом режиме.Режим vi имеет два подрежима: режим вставки и командного управления.
- Режим по умолчанию — режим вставки.
- Вы можете переключаться между режимами, нажимая
Esc
.- Кроме того, в командном режиме,
нажатие ‘a’ (добавить) или ‘i’ (вставить) вернет вас в режим вставки.
Больше заметок на странице tcsh
кастомизации, которая уже была связана выше.
У меня была точно такая же проблема, и я случайно нашел решение. Хотя эта ветка старая, я не мог найти другой сайт, предлагающий решение, поэтому считаю, что размещение в этой ветке допустимо.
Просто сбросьте настройки вашей терминальной программы или оболочки. Я в настоящее время использую PuTTY, и я просто удалил свои сохраненные настройки для моего сохраненного соединения и пересоздал сохраненную сессию. Сработало, как по волшебству.
Надеюсь, это поможет!
Пожалуйста, ознакомьтесь с моим ответом на SO. Bash 4.4 / Readline 7.0 добавят поддержку этой функциональности, а пока я опубликовал исправленные версии Bash 4.3 / Readline 6.3 на github.
Для тех, кто борется с этим сегодня, взгляните на этот симпатичный плагин zsh vi-mode: https://github.com/jeffreytse/zsh-vi-mode. Он довольно популярен и использует разные значки курсора для разных режимов.
.
Ответ или решение
Как отобразить текущий режим Vi в оболочке при использовании Vi клавиш навигации?
Введение
Пользователи tcsh, которые предпочитают ключевые команды Vi для навигации по командной строке, могут сталкиваться с проблемой, когда сложно определить текущий режим редактирования: insert или command. Это может вызывать значительное неудобство при вводе команд ввиду неявности текущего состояния редактора.
Возможное решение
Хотя изначально кажется, что tcsh не предоставляет встроенных методов для отображения текущего режима Vi в командной строке, существуют способы, которые могут помочь в этом вопросе.
Реализация в Readline
Для пользователей оболочек, таких как bash, существует более простое решение благодаря библиотеке Readline. Чтобы активировать отображение текущего режима Vi в строке комманд, необходимо:
- Внести изменения в файл
~/.inputrc
, добавив следующие строки:
set show-mode-in-prompt on
set vi-ins-mode-string "вставка"
set vi-cmd-mode-string "команда"
Эти настройки позволят видеть индикатор текущего режима прямо в командной строке.
Aльтернативные подходы
Если вы используете tcsh и указанный выше метод недоступен, есть несколько подходов, которые могут помочь:
- Модификация терминальных настроек или использование программного обеспечения: Обновление конфигураций терминала, например, в PuTTY, может непреднамеренно исправить проблему, как это было отмечено одним из пользователей.
- Адаптация скриптов из других оболочек: Например, скрипты для zsh, которые меняют стиль курсора в зависимости от режима, могут быть адаптированы для использования с tcsh. Подробнее об этом можно узнать на специализированных форумах или ресурсах по настройке zsh.
Выводы
Несмотря на отсутствие нативной поддержки в некоторых оболочках, пользователи tcsh и других оболочек с поддержкой Vi keybindings могут использовать различные подходы для улучшения своей работы в командной строке:
- Конфигурация Readline: Поддержка этой функции особенно полезна в таких оболочках, как bash.
- Открытые и экспериментальные инструменты: Рассмотрение дополнительных инструментов или скриптов, доступных для других оболочек, с возможной адаптацией для вашего окружения.
- Обновление настроек внешнего ПО: При помощи сброса или пересохранения настроек терминала.
Подобные решения могут значительно улучшить пользовательский опыт, облегчая процесс взаимодействия с командной строкой.