Другое приглашение bash для разных режимов редактирования vi?

114

При использовании режима vi (set -o vi) с Bash было бы неплохо иметь подсказку, которая зависит от режима, в котором вы сейчас находитесь (вставка или команда). Как узнать этот режим редактирования?

Кстати, это представляется возможным в ZSH :


источник
Мне это тоже любопытно. Искал документацию по bash, но ничего не нашел.
Эндрю Феррье

Ответы:

68

В свежем bash 4.3 и readline 6.3 есть кое-что для вас, ребята ... из журнала изменений:

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

Так положив

set show-mode-in-prompt on

в / etc / inputrc или ~ / .inputrc (thx stooj) должны повлиять на все ваши программы с поддержкой readline;)

eMPee584
источник
какой статус по этому поводу? Я пытаюсь найти что-то подобное (не для bash, а для других подсказок на основе строки чтения, которые я использую). Я искал в Google и не нашел никаких других обновлений (кроме этой и статьи, на которую вы ссылались )
Mike HR
4
Просто добавление из eMPee584 - если вы используете bash 4.3 или выше, добавьте следующее в свой файл ~ / .inputrc set show-mode-in-prompt Это добавляет + в самый левый угол вашего приглашения, если вы находитесь в режиме редактирования , и a: если вы находитесь в командном режиме.
stooj
3
Итак, пока это работает; есть ли способ переместиться туда, где находится этот персонаж в режиме vi, в подсказке? Если у вас есть многострочные подсказки (пользовательские), это не так хорошо работает :)
Джеймс Миллс,
Для 4.3 он всегда находится в начале приглашения, и, к сожалению, readline перерисовывает только последнюю строку многострочного приглашения. См. Ответ «Многострочное приглашение и .inputrc» для обходного пути или ответ о исправлении bash 4.3 с исправлением 4.4 для этого.
Studgeek
21

Bash 4.4 / Readline 7.0 добавит поддержку строк режима, задаваемых пользователем .

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

Если вы не хотите ждать и не боитесь небольшой компиляции, я опубликовал на github исправленные версии bash 4.3 и readline 6.3, которые поддерживают эту функцию.

С пропатченными версиями вы можете делать такие вещи:

введите описание изображения здесь

Более подробная информация, в том числе о том, как установить, доступны на https://github.com/calid/bash.

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

После поиска в Google, просмотра страницы руководства bash, а затем просмотра исходного кода bash (lib / readline / vi_mode.c), похоже, нет простого способа изменить приглашение при переходе из режима вставки в командный режим. Похоже, здесь может быть возможность для кого-то исправить исходный код bash, хотя есть призывы к запуску и остановке режимов в источнике.

Увидев ваш пост, я заинтересовался настройкой режима bash vi. Мне нравится vi, и почему бы и нет в командной строке. Однако похоже, что нам придется отслеживать, находимся ли мы в режиме вставки, без быстрого изменения (так говорится во многих сообщениях на форуме). Как бы то ни было, вы всегда находитесь в режиме вставки, если не нажмете ESC. Делает это немного проще, но не всегда так интуитивно понятно.

Я поднимаю ваш вопрос, так как мне интересно посмотреть, к чему это приведет.

Джереми Хеслоп
источник
7

Многострочная подсказка и .inputrc

INPUTRC имеет возможность показать +для вставки и :для нормального режима, добавив set show-mode-in-prompt onв ~/.inputrcкак писало eMPee584, но это не очень хорошо работает с многострочными строками (с более старыми версиями Баша и Readline).

Решение состоит в том, чтобы иметь одну строку PS1( >) и функцию, которая выводит что-то перед подсказкой. Он встроен в bash и называется PROMPT_COMMAND.

function prompt {
    PS1=' > '
    echo -e "$(date +%R)  $PWD"
}

PROMPT_COMMAND='prompt' 

Обычные строки приглашения недоступны в echo printf. Он -eпредназначен для интерпретации цветовых кодов, и нет необходимости добавлять \[или \], что в любом случае не работает.

Режим вставки :

20:57   /home/sshbio/dotfiles/bash
+ > _

Нормальный режим:

20:57   /home/sshbio/dotfiles/bash
: > _

Нажимая вкладку , повторяется только PS1, что имеет смысл для меня:

20:57   /home/sshbio/dotfiles/bash
+ > ls _
bashrc      bash_profile     inputrc
+ > ls _

Предварительный просмотр (Источник)

user3034472
источник
Если используются цвета в vi-cmd-mode-stringили vi-ins-mode-string, они должны иметь префикс \1и после него \2. Смотрите здесь . Также,\[ и \[все равно должны выделяться, но вам нужно \\[и \\]внутри Printf.
Том Хейл
2

для многострочного приглашения, такого как это изображение

моя работа такая

моя подсказка bash

export PS1=" ┌錄 \[\e[32m\]\u\[\e[m\]\[\e[32m\]@\[\e[m\]\[\e[32m\]\h\[\e[m\] \w \\$ \n "

.inputrc

set show-mode-in-prompt on
set vi-ins-mode-string " └──錄 (ins):"
set vi-cmd-mode-string " └──錄 (cmd):"

надеюсь, это помогло вам

отметка
источник
1

Это то, что у меня есть ~/.inputrc

set show-mode-in-prompt on
set vi-ins-mode-string \1\e[34;1m\2└──[ins] \1\e[0m\2
set vi-cmd-mode-string \1\e[33;1m\2└──[cmd] \1\e[0m\2

Режим вставки окрашен в синий цвет.

└──[ins]

Командный режим окрашен в желтый цвет.

└──[cmd]

Обратной стороной является то, что он не отображается, то ttyесть работает только на эмуляторе терминала только с цветами.

Jetchisel
источник
0

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

Мой текущий подход: нажмите «а», когда я не уверен, какой режим. ЕСЛИ после BASH PROMOT появляется «a», я узнаю, что нахожусь в режиме «INSERT». ЗАТЕМ нажимаю «ВОЗВРАТ» и продолжаю. Для меня это простой способ решить небольшое раздражение.

Между прочим, я 'псевдоним a =' cal 'или что-то еще, чтобы дать пустому удару немного полезности.

Andrew_1510
источник
2
Для меня было бы разумнее просто нажать "esc || c- [", а не a. Тогда вам не нужно смотреть, в каком режиме вы находитесь; или вставьте ненужные символы, которые нужно удалить (или нажмите клавишу возврата)
wom
0

Другой стиль подсказки и курсора через .inputrc

Сначала вы должны убедиться, что вы используете версию bash выше, чем 4.3:

$ bash --version
GNU bash, version 4.4

Затем введите следующие строки в свой ~/.inputrc:

#################### VIM ####################
# FOR MORE INFORMATION CHECK:
# https://wiki.archlinux.org/index.php/Readline

# TURN ON VIM (E.G. FOR READLINE)
set editing-mode vi

# SHOW THE VIM MODE IN THE PROMPT (COMMAND OR INSERT)
set show-mode-in-prompt on

# SET THE MODE STRING AND CURSOR TO INDICATE THE VIM MODE
#   FOR THE NUMBER AFTER `\e[`:
#     0: blinking block
#     1: blinking block (default)
#     2: steady block
#     3: blinking underline
#     4: steady underline
#     5: blinking bar (xterm)
#     6: steady bar (xterm)
set vi-ins-mode-string (ins)\1\e[5 q\2
set vi-cmd-mode-string (cmd)\1\e[1 q\2

В командном режиме курсор отображается как блок.
В режиме вставки курсор отображается в виде вертикальной полосы.

Сама подсказка будет выглядеть так, в зависимости от режима:

(cmd)$ ... 
(ins)$ ...
Winklerrr
источник