Измените форму курсора (или цвет), чтобы указать режим vi в bash

30

Чтобы уточнить: я не спрашиваю, как изменить курсор при использовании vim в терминале . Я хочу, чтобы курсор менялся при переключении между режимом ввода и командного режима в vi-режиме Bash:

set -o vi <CR> type some text <ESC> (the cursor changes shape/color)
i (cursor change back) etc... 

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

Есть ли способ заставить курсор изменить форму, как в gvim, (или даже просто цвет) при переключении между режимами команд и вставки в командной строке Bash?

joecan
источник
Тот же вопрос в SO для Putty, но ответа нет :( - stackoverflow.com/questions/2393383/…
studgeek

Ответы:

5

Добавьте эти две строки в ~ / .inputrc :

set vi-ins-mode-string \1\e[5 q\2
set vi-cmd-mode-string \1\e[2 q\2
holytrousers
источник
4
Этот ответ будет гораздо полезнее, если вы объясните, что они делают, и предоставите некоторый контекст, например, требуют ли настройки, чтобы у пользователя была определенная версия Readline.
Энтони Дж - справедливость для Моники
:) вот ручной ввод: gnu.org/software/bash/manual/html_node/...
holytrousers
1
Это будет работать только на терминалах и эмуляторах терминалов, которые понимают DECSCUSR.
JdeBP
Я должен был добавить set show-mode-in-prompt onв ~/.inputrcтакже , чтобы сделать эту работу.
Ронакг
4

Скопировано здесь - редактирование командной строки в стиле vim

Должен быть доступен в bash4.3 - см. Список изменений -

j.  New user-settable variable, show-mode-in-prompt, adds a characters to the
    beginning of the prompt indicating the current editing mode.

bash4.3 в настоящее время находится на rcстадии разработки, вы должны иметь возможность получать пакеты для большинства дистрибутивов без компиляции из исходного кода, но не в основных репозиториях. Например. Ubuntu (amd64) здесь и Debian (экспериментальное репо) здесь .

Graeme
источник
Обратите внимание, что: приглашение не будет обновлено, если вы используете пользовательский PS1, который содержит символ новой строки. нашел здесь
pgericson
@pgericson Кажется, что он работает с пользовательской PS1, содержащей для меня новую строку на bash 4.4.12.
DuBistKomisch
2

Я не нашел реального решения, но, возможно, это поможет вам (или кому-то другому) найти лучшее решение.

Вы должны создать скрипт (например, kmtest.sh)

#!/bin/bash
# Script "kmtest.sh"

TEST=`bind -v | awk '/keymap/ {print $NF}'`
if [ "$TEST" = 'vi-insert' ]; then
   echo -ne "\033]12;Green\007"
else
   echo -ne "\033]12;Red\007"
fi

и после добавления его в свой PS1, что-то вроде:

export PS1="\u@\h \$(kmtest.sh)> "

но, как я уже сказал, это не то, что вы хотите, потому что он меняет цвет курсора только после cr. Удачи

гигабайт

gogolb
источник
Это на самом деле работает для вас? Это не сработало для меня; он просто сделал курсор красным. Я не думаю, что kmtest.sh запускается каждый раз, когда я переключаюсь между режимами вставки и командования. Кажется, что он будет запущен только при создании приглашения.
Joecan
1

Похоже, что есть способ сделать это путем взлома readline. Возможно, мы могли бы настаивать на том, чтобы это было включено?

Вот мой ответ на ТА https://stackoverflow.com/a/12201092/255961, который я обновлю, если получу больше информации.

studgeek
источник
1

Хотя это не совсем то, что вам нужно (динамическое изменение курсора), bash 4.4 / readline 7.0 добавит поддержку динамического изменения подсказки . Вы сможете указать индикаторы пользовательских режимов для режимов вставки / команд (это отличается от текущей show-mode-in-promptопции, которая жестко задана для использования +и :).

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

Тем временем я опубликовал исправленные версии bash 4.3 / readline 6.3 на github с этой функциональностью.

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

Я задал тот же вопрос некоторое время назад в AskUbuntu, когда переходил из Gvim в Console Vim.

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

Я по-прежнему интересуюсь, получите ли вы удовлетворительное решение, но со временем я приспособился к отсутствию информации о состоянии режима в курсоре. Возможно, я просто чаще нажимаю escape (например, escчтобы убедиться, что я в командном режиме; esc iчтобы убедиться, что я в режиме вставки); возможно, я смотрю на состояние, отображаемое внизу экрана; возможно я только что усвоил режим.

Джером англим
источник
3
Просто чтобы уточнить, ваш вопрос не совпадает с моим. Вы спросили, как изменить курсор в Vim на консоли. Это хорошо задокументировано в вики Vim . Я хочу знать, как это сделать в vi-режиме Bash .
Joecan