Різні підказки bash для різних режимів редагування vi?


113

Під час використання режиму vi (set -o vi) з Bash, було б непогано мати підказку, яка залежить від режиму, в якому ви зараз перебуваєте (вставка або команда). Як дізнатися цей режим редагування?

До речі, це здається, що це можливо в ZSH :

bash  prompt 

Мені цікаво і про це. Полювали через документацію, але нічого не знайшли.
Ендрю Фер’є

Відповіді:


67

Свіжий 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) має впливати на всі ваші програми з включеною читанням;)


будь-який статус з цього приводу? Я намагаюся знайти щось подібне (не для bash, а для інших підказок на основі читальних рядків, які я використовую). Я гуглив і не знайшов жодного іншого оновлення (крім цього та статті, на яку ви посилалися )
Майк HR

4
Просто додавання від eMPee584 - якщо ви використовуєте bash 4.3 або новішої версії, додайте наступне до вашого / / .inputrc набору файлів show-mode-in-prompt. Це додає + в самому лівому куті підказки, якщо ви перебуваєте в режимі редагування , і: якщо ви перебуваєте в командному режимі.
stooj

3
Тож поки це працює; чи є спосіб перейти туди, де цей персонаж у режимі vi-mode сидить у його підказці? Якщо у вас є багато рядкові підказки (користувальницькі), це працює не так добре :)
James Mills

Для 4.3 це завжди на початку підказки, і, на жаль, readline перемальовує лише останній рядок рядкового рядка. Дивіться відповідь "Multiline prompt та .inputrc" для вирішення проблеми або див. Відповідь про виправлення bash 4.3 з виправленням 4.4 для цього.
studgeek

20

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

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

Якщо ви не хочете чекати і не боїтеся невеликої компіляції, я опублікував виправлені версії bash 4.3 та readline 6.3 до github, які підтримують цю функціональність.

З виправленими версіями ви можете робити такі речі:

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

Докладніші відомості, зокрема про встановлення, доступні на веб- сайті https://github.com/calid/bash


19

Після пошуку в Google, переглядаючи сторінку bash man, а потім переглядаючи вихідний код bash (lib / readline / vi_mode.c), схоже, немає простого способу змінити підказку при переході з режиму вставки в режим команд. Схоже, тут може виникнути можливість, щоб хтось зафіксував джерело bash, хоча є виклики для запуску та зупинки режимів у джерелі.

Побачивши ваш пост, мене зацікавило налаштування режиму bash vi. Я люблю vi, і чому б не в командному рядку. Однак, схоже, нам доведеться відслідковувати, чи перебуваємо ми в режимі вставки без швидкої зміни (так говорить багато дописів на форумі). Для того, що це варто, ти завжди перебуваєш у режимі вставки, якщо не натиснеш ESC. Це робить трохи простіше, але не завжди настільки інтуїтивно.

Я відповідаю на ваше запитання, оскільки мені цікаво бачити, куди це йде.


7

Підказки та рядки .inputrc

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

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

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

PROMPT_COMMAND='prompt' 

Звичайні рядки підказок недоступні у відголосі printf. -eЄ Interprete колірних кодів, і не потрібно , щоб додати \[або \], який не працює в будь-якому випадку.

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

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 _

Попередній перегляд (Джерело)


Якщо ви використовуєте кольори в vi-cmd-mode-stringабо vi-ins-mode-string, вони повинні бути встановлені префіксом за допомогою \1та встановити їх після \2. Дивіться тут . Також, \[і \[все ж слід випускати, але вам знадобиться \\[і \\]всередині printf.
Том Хейл

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значенням, він працює на термінальному емуляторі лише кольорами.


0

Я намагаюся отримати індикатор і для режиму BASH vi, і ви всі дізналися, що це звучить просто і просто немає можливості цього зробити.

Мій сучасний підхід: натиснути "a", коли я не впевнений, який режим. ЯКЩО "a" з'являється після BASH PROMOT, я дізнаюся, що перебуваю в режимі "ВСТАВИТЬ". ТОГО, я натискаю "ПОВЕРНУТИСЯ" і продовжую. Це простий спосіб для мене, щоб вирішити невеликий роздратування.

До речі, я "псевдонім a = 'cal", або щось інше, щоб дати порожній удар "мало" корисності.


2
Було б більше сенсу для мене просто натиснути "esc || c- [", а не a. Тоді вам не доведеться шукати, щоб знати, в якому режимі ви працюєте; вставки або небажаних символів , які ви повинні видалити (або натисніть клавішу повернення)
WOM

0

для підказки Multiline, як це зображення

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

мій баш-підказка

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

Різні підказки та стиль курсору через .inputrc

Спочатку переконайтеся, що ви використовуєте баш-версію вище 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)$ ...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.