При использовании режима vi (set -o vi) с Bash было бы неплохо иметь подсказку, которая зависит от режима, в котором вы сейчас находитесь (вставка или команда). Как узнать этот режим редактирования?
Кстати, это представляется возможным в ZSH :
При использовании режима vi (set -o vi) с Bash было бы неплохо иметь подсказку, которая зависит от режима, в котором вы сейчас находитесь (вставка или команда). Как узнать этот режим редактирования?
Кстати, это представляется возможным в ZSH :
Ответы:
В свежем 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;)
Bash 4.4 / Readline 7.0 добавит поддержку строк режима, задаваемых пользователем .
Вы можете попробовать бета-версии, но на данный момент они кажутся немного ошибочными. Они также еще не поддерживают указание того, где в приглашении вы хотите, чтобы индикатор режима отображался (что, я думаю, является отличительной особенностью).
Если вы не хотите ждать и не боитесь небольшой компиляции, я опубликовал на github исправленные версии bash 4.3 и readline 6.3, которые поддерживают эту функцию.
С пропатченными версиями вы можете делать такие вещи:
Более подробная информация, в том числе о том, как установить, доступны на https://github.com/calid/bash.
После поиска в Google, просмотра страницы руководства bash, а затем просмотра исходного кода bash (lib / readline / vi_mode.c), похоже, нет простого способа изменить приглашение при переходе из режима вставки в командный режим. Похоже, здесь может быть возможность для кого-то исправить исходный код bash, хотя есть призывы к запуску и остановке режимов в источнике.
Увидев ваш пост, я заинтересовался настройкой режима bash vi. Мне нравится vi, и почему бы и нет в командной строке. Однако похоже, что нам придется отслеживать, находимся ли мы в режиме вставки, без быстрого изменения (так говорится во многих сообщениях на форуме). Как бы то ни было, вы всегда находитесь в режиме вставки, если не нажмете ESC. Делает это немного проще, но не всегда так интуитивно понятно.
Я поднимаю ваш вопрос, так как мне интересно посмотреть, к чему это приведет.
.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 _
для многострочного приглашения, такого как это изображение
моя работа такая
моя подсказка 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):"
надеюсь, это помогло вам
Это то, что у меня есть ~/.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
есть работает только на эмуляторе терминала только с цветами.
Я также пытаюсь получить индикатор для режима BASH vi, и вы все узнали, что это звучит просто, и пока что нет возможности сделать это.
Мой текущий подход: нажмите «а», когда я не уверен, какой режим. ЕСЛИ после BASH PROMOT появляется «a», я узнаю, что нахожусь в режиме «INSERT». ЗАТЕМ нажимаю «ВОЗВРАТ» и продолжаю. Для меня это простой способ решить небольшое раздражение.
Между прочим, я 'псевдоним a =' cal 'или что-то еще, чтобы дать пустому удару немного полезности.
.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)$ ...