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 :
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 :
Odpowiedzi:
Ś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;)
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:
Więcej szczegółów, w tym sposób instalacji, można znaleźć pod adresem https://github.com/calid/bash
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.
.inputrc
Inputrc ma opcję pokazania a +
dla wstawiania i :
dla trybu normalnego, dodając set show-mode-in-prompt on
tak, ~/.inputrc
jak 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 -e
do 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 _
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 tty
znaczeniu, działa tylko na emulatorze terminala, tylko kolory.
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.
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
.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)$ ...