15

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

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

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

7 ответов7

4

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

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

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

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

3

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

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

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

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

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

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

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

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

2

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

0

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

0

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

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

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

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

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

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

0

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

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

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

0

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

set show-mode-in-prompt on

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .