Zmień kształt (lub kolor) kursora, aby wskazać tryb vi w bash

30

Wyjaśnienie: Nie pytam, jak zmienić kursor podczas używania vima w terminalu . Chcę, aby kursor zmienił się podczas przełączania między trybem wprowadzania a trybem poleceń w trybie vi Basha:

set -o vi <CR> type some text <ESC> (the cursor changes shape/color)
i (cursor change back) etc... 

Znalazłem skrypt, który umożliwia zmianę koloru kursora przy zmianie trybu w zsh , ale nie chcę zmieniać powłok tylko dla tej jednej funkcji.

Czy istnieje sposób, aby kursor zmienił kształt, tak jak w gvim (lub nawet po prostu kolor) podczas przełączania między trybami poleceń i wstawiania w wierszu poleceń Bash?

joecan
źródło
To samo pytanie w SO dla Putty, brak odpowiedzi :( - stackoverflow.com/questions/2393383/...
studgeek

Odpowiedzi:

5

dodaj te dwa wiersze do ~ / .inputrc :

set vi-ins-mode-string \1\e[5 q\2
set vi-cmd-mode-string \1\e[2 q\2
holytrousers
źródło
4
Ta odpowiedź byłaby o wiele bardziej przydatna, jeśli wyjaśnisz, co robią i podasz kontekst, np. Czy ustawienia wymagają od użytkownika konkretnej wersji Readline.
Anthony G - sprawiedliwość dla Moniki
:) oto instrukcja: gnu.org/software/bash/manual/html_node/…
holytrousers
1
Działa to tylko na terminalach i emulatorach terminali, które rozumieją DECSCUSR.
JdeBP
Musiałem dodać set show-mode-in-prompt onw ~/.inputrcrównież do tej pracy.
ronakg
4

Skopiowano stąd - Styl vim edycji wiersza poleceń

Powinien być dostępny w wersji bash4.3 - patrz dziennik zmian -

j.  New user-settable variable, show-mode-in-prompt, adds a characters to the
    beginning of the prompt indicating the current editing mode.

bash4.3 jest obecnie na rcetapie, powinieneś być w stanie uzyskać pakiety dla większości dystrybucji bez kompilacji ze źródła, ale nie w głównych repozytoriach. Na przykład. Ubuntu (amd64) tutaj i Debian (eksperymentalne repo) tutaj .

Graeme
źródło
Uwaga: monit nie zostanie zaktualizowany, jeśli użyjesz niestandardowego PS1, który zawiera znak nowej linii. znaleziono tutaj
pgericson
@pgericson Wygląda na to, że działa z niestandardowym PS1 zawierającym dla mnie nową linię na bash 4.4.12.
DuBistKomisch
2

Nie znalazłem prawdziwego rozwiązania, ale być może mogłoby to pomóc Tobie (lub komuś innemu) w znalezieniu lepszego.

Musisz utworzyć skrypt (np. Kmtest.sh)

#!/bin/bash
# Script "kmtest.sh"

TEST=`bind -v | awk '/keymap/ {print $NF}'`
if [ "$TEST" = 'vi-insert' ]; then
   echo -ne "\033]12;Green\007"
else
   echo -ne "\033]12;Red\007"
fi

i po dodaniu go do PS1, coś takiego:

export PS1="\u@\h \$(kmtest.sh)> "

ale jak powiedziałem, nie jest to, czego chcesz, ponieważ zmienia kolor kursora dopiero po cr. Powodzenia

gb

gogolb
źródło
Czy to naprawdę działało dla ciebie? Nie działało to dla mnie; po prostu zmienił kursor na czerwony. Nie sądzę, że kmtest.sh jest uruchamiany za każdym razem, gdy przełączam się między trybami wstawiania i poleceń. Wygląda na to, że byłby uruchamiany tylko po utworzeniu monitu.
joecan
1

Wygląda na to, że można to zrobić poprzez hakowanie readline. Być może moglibyśmy naciskać, aby stała się ona głównym nurtem?

Oto moja odpowiedź na SO https://stackoverflow.com/a/12201092/255961, którą zaktualizuję, jeśli otrzymam więcej informacji.

studgeek
źródło
1

Chociaż nie jest to dokładnie to, czego chcesz (dynamiczna zmiana kursora), bash 4.4 / readline 7.0 doda obsługę dynamicznej zmiany pytania . Będziesz mógł określić niestandardowe wskaźniki trybu dla trybów wstawiania / poleceń (różni się to od bieżącej show-mode-in-promptopcji, która jest zakodowana w użyciu +i :).

Niestety te wersje są obecnie w fazie beta i wydaje się, że nie zostały jeszcze usunięte wszystkie błędy. Brakuje również możliwości określenia, gdzie w pytaniu ma się pojawiać wskaźnik trybu.

Tymczasowo opublikowałem łatane wersje bash 4.3 / readline 6.3 na github z tą funkcjonalnością.

Dylan Cali
źródło
0

Zadałem to samo pytanie jakiś czas temu na AskUbuntu, kiedy przechodziłem z Gvim do Console Vim.

Otrzymałem jedną odpowiedź, ale wiązało się to z przełączaniem ustawień terminala gnome, a ustawienia te obowiązywały na wszystkich terminalach. W ten sposób kursor terminalu gnomów mógł czasami utknąć w złym stanie.

Nadal jestem zainteresowany tym, czy uzyskasz zadowalające rozwiązanie, ale z czasem dostosowałem się do braku informacji o stanie trybu w kursorze. Być może po prostu częściej naciskam klawisz Escape (np. escAby upewnić się, że jestem w trybie poleceń; esc iaby upewnić się, że jestem w trybie wstawiania); być może patrzę na stan wyświetlany na dole ekranu; być może właśnie zinternalizowałem ten tryb.

Jeromy Anglim
źródło
3
Żeby wyjaśnić, twoje pytanie nie jest takie samo jak moje. Pytałeś, jak zmienić kursor w Vimie na konsoli. Jest to dobrze udokumentowane na wiki Vima . Chcę wiedzieć, jak to zrobić w trybie vi Basha .
joecan