Разные подсказки bash для разных режимов редактирования vi? - PullRequest
108 голосов
/ 24 июня 2009

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

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

Ответы [ 6 ]

60 голосов
/ 17 июня 2013

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

19 голосов
/ 22 января 2010

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

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

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

18 голосов
/ 26 октября 2015

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

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

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

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

enter image description here

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

7 голосов
/ 31 января 2016

Многострочный запрос и .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 (Источник)

0 голосов
/ 04 мая 2019

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

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

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

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

0 голосов
/ 19 сентября 2010

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

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

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

...