Разные bash подсказки для разных режимов редактирования vi?

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

B.t.w, это возможно в ZSH:

Ответ 1

Fresh 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(спасибо stooj) должен влиять на все ваши программы, поддерживаемые readline;)

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

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

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

PROMPT_COMMAND='prompt' 

Обычные строки подсказки не доступны в эхо 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 _

Preview(Источник)

Ответ 5

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

IE: пусть script называется bash -vi, который выполняет "set -o vi; PS1='desired vi mode prompt';"


Изменить: (Пока не могу комментировать) Я вижу, я не слишком внимательно прочитал вопрос и не обратил внимания на ссылку на режим ввода и команды. Не знаете, как это установить. Обычно это не проблема для меня, так как я использую только командный режим для кратких операций - я могу понять, почему это было бы полезно.

Ответ 6

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

Мой текущий подход: нажмите 'a', когда я не уверен, какой режим. IF 'a' появляется после BASH PROMOT, я узнаю, что я в режиме INSERT. Затем я нажимаю "ВОЗВРАТ" и продолжаю. Это легкий способ решить небольшую досаду.

Кстати, я 'alias a =' cal ', или что-то еще, чтобы дать пустому хиту "небольшую полезность".

Ответ 7

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

у меня такая работа

моя подсказка 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):"

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