Inny monit basha dla innego trybu edycji vi?

113

Gdy używasz trybu vi (set -o vi) z Bash, dobrze byłoby mieć podpowiedź zależną od trybu, w którym aktualnie jesteś (wstaw lub polecenie). Jak można dowiedzieć się o tym trybie edycji?

Btw, wydaje się, że jest to możliwe w ZSH :


źródło
Też jestem tego ciekawa. Szukałem w dokumentacji basha, ale niczego nie znalazłem.
Andrew Ferrier,

Odpowiedzi:

67

Świeże bash 4.3 i readline 6.3 mają coś dla was .. z listy zmian:

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.

Więc stawiając

set show-mode-in-prompt on

do / etc / inputrc lub ~ / .inputrc (thx stooj) powinny mieć wpływ na wszystkie twoje programy z obsługą readline;)

eMPee584
źródło
jakikolwiek status w tej sprawie? Próbuję znaleźć coś takiego (nie dla basha, ale dla innych podpowiedzi opartych na readline, których używam). Szukałem w Google i nie znalazłem żadnej innej aktualizacji (poza tym i artykułem, o którym wspomniałeś )
Mike HR
4
Po prostu dodając z eMPee584 - jeśli używasz basha 4.3 lub nowszego, dodaj następujące polecenie do zestawu plików ~ / .inputrc show-mode-in-prompt To dodaje + po lewej stronie zachęty, jeśli jesteś w trybie edycji i a: jeśli jesteś w trybie poleceń.
stooj
3
Więc podczas gdy to działa; czy jest sposób, aby przenieść się tam, gdzie ten znak trybu vi siedzi w monicie? Jeśli masz podpowiedzi wieloliniowe (niestandardowe), nie działa to tak dobrze :)
James Mills
W 4.3 jest zawsze na początku zachęty i niestety readline przerysuje tylko ostatnią linię wielowierszowej zachęty. Zobacz odpowiedź "Multiline prompt and .inputrc" dla obejścia lub zobacz odpowiedź na temat łatania basha 4.3 z poprawką 4.4.
studgeek
20

Bash 4.4 / Readline 7.0 doda obsługę ciągów trybu ustawianych przez użytkownika .

Możesz wypróbować wersje beta, ale w tej chwili wydają się one nieco wadliwe. Nie obsługują też jeszcze określania miejsca w monicie, w którym ma się pojawiać wskaźnik trybu (co moim zdaniem jest funkcją zabójczą).

Jeśli nie chcesz czekać i nie boisz się małej kompilacji, opublikowałem załatane wersje bash 4.3 i readline 6.3 na github, które obsługują tę funkcjonalność.

Z poprawionymi wersjami możesz robić takie rzeczy:

wprowadź opis obrazu tutaj

Więcej szczegółów, w tym sposób instalacji, można znaleźć pod adresem https://github.com/calid/bash

Dylan Cali
źródło
19

Po przeszukaniu google, przejrzeniu strony podręcznika bash, a następnie przejrzeniu kodu źródłowego basha (lib / readline / vi_mode.c) wygląda na to, że nie ma łatwego sposobu na zmianę znaku zachęty podczas przechodzenia z trybu wstawiania do trybu poleceń. Wygląda na to, że ktoś może tutaj załatać źródło basha, ponieważ są wezwania do uruchamiania i zatrzymywania trybów w źródle.

Widząc twój post, zaciekawiło mnie ustawienie trybu bash vi. Uwielbiam vi i dlaczego nie w linii poleceń. Wygląda jednak na to, że będziemy musieli śledzić, czy jesteśmy w trybie wstawiania bez szybkiej zmiany (tak mówi wiele postów na forum) .Bo to jest warte, zawsze jesteś w trybie wstawiania, chyba że naciśniesz ESC. Ułatwia to trochę, ale nie zawsze jest tak intuicyjne.

Podnoszę twoje pytanie, ponieważ jestem zainteresowany zobaczeniem, dokąd to zmierza.

Jeremy Heslop
źródło
7

Wielowierszowy monit i .inputrc

Inputrc ma opcję pokazania a +dla wstawiania i :dla trybu normalnego, dodając set show-mode-in-prompt ontak, ~/.inputrcjak napisał eMPee584, ale nie działa to dobrze z multilinią (ze starszymi wersjami bash i readline).

Rozwiązaniem jest pojedyncza linia PS1( >) i funkcja, która wyświetla coś przed monitem. Jest wbudowany w bash i nazywa się PROMPT_COMMAND.

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

PROMPT_COMMAND='prompt' 

Zwykłe łańcuchy zachęty nie są dostępne w echo printf. Służy -edo interpretacji kodów kolorów i nie trzeba dodawać \[lub \], co i tak nie działa.

Tryb wstawiania :

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

Tryb normalny :

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

Naciskając klawisz, powtarzam się tylko PS1, co dla mnie ma sens:

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

Zapowiedź (Źródło)

user3034472
źródło
Jeśli używasz kolorów w vi-cmd-mode-stringlub vi-ins-mode-string, powinny one być poprzedzone przedrostkiem \1i uzupełnione o \2. Zobacz tutaj . Ponadto, \[i \[nadal powinno być emitowane, ale będziesz potrzebować \\[i \\]wewnątrz printf.
Tom Hale
1

To jest to, co mam ~/.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

Tryb wstawiania ma kolor niebieski.

└──[ins]

Tryb poleceń ma kolor żółty.

└──[cmd]

Wadą jest to, że nie wyświetla się w ttyznaczeniu, działa tylko na emulatorze terminala, tylko kolory.

Jetchisel
źródło
0

Próbuję również uzyskać wskaźnik trybu BASH vi i wszyscy nauczyliście się, że brzmi to prosto i po prostu nie ma sposobu, aby to zrobić.

Moje obecne podejście to: naciśnij „a”, gdy nie wiem, który tryb jest. JEŻELI 'a' pojawia się po BASH PROMOT, dowiaduję się, że jestem w trybie 'INSERT'. NASTĘPNIE naciskam „POWRÓT” i kontynuuję. To dla mnie łatwy sposób na rozwiązanie tej małej irytacji.

Nawiasem mówiąc, ja 'alias a =' cal 'lub coś innego, aby nadać pustemu trafieniu' trochę 'użyteczności.

Andrew_1510
źródło
2
Bardziej sensowne byłoby dla mnie naciśnięcie "esc || c- [" zamiast a. Wtedy nie musisz szukać, aby wiedzieć, w jakim trybie jesteś; lub wstaw niechciane znaki, które musisz usunąć (lub naciśnij klawisz Return)
wom
0

dla zachęty Multiline, jak na tym obrazku

moja praca jest taka

mój monit 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):"

mam nadzieję, że ci to pomogło

znak
źródło
0

Różne style podpowiedzi i kursorów za pośrednictwem .inputrc

Najpierw upewnij się, że używasz wersji basha wyższej niż 4.3:

$ bash --version
GNU bash, version 4.4

Następnie umieść następujące wiersze w swoim ~/.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

W trybie poleceń kursor jest wyświetlany jako blok.
W trybie wstawiania kursor jest wyświetlany jako pionowy pasek.

Sam monit będzie wtedy wyglądał następująco, w zależności od trybu:

(cmd)$ ... 
(ins)$ ...
winklerrr
źródło