Ändern Sie die Form (oder Farbe) des Cursors, um den vi-Modus in bash anzuzeigen

30

Zur Verdeutlichung: Ich frage nicht, wie ich den Cursor ändern soll, wenn ich vim in einem Terminal verwende . Ich möchte, dass sich der Cursor ändert, wenn ich im vi-Modus von Bash zwischen Eingabe- und Befehlsmodus wechsle:

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

Ich habe ein Skript gefunden , das das Ändern der Farbe des Cursors bei Modusänderungen in zsh ermöglicht , aber ich möchte nicht nur für diese eine Funktion die Shells ändern.

Gibt es eine Möglichkeit, den Cursor dazu zu bringen, die Form zu ändern, wie in gvim (oder sogar nur die Farbe), wenn zwischen dem Befehls- und dem Einfügemodus in der Bash-Befehlszeile gewechselt wird?

joecan
quelle
Dieselbe Frage in SO für Putty, keine Antwort tho :( - stackoverflow.com/questions/2393383/…
Studgeek

Antworten:

5

füge diese zwei Zeilen zu ~ / .inputrc hinzu :

set vi-ins-mode-string \1\e[5 q\2
set vi-cmd-mode-string \1\e[2 q\2
holytrousers
quelle
4
Diese Antwort ist viel nützlicher, wenn Sie erklären, was sie tun, und einen Kontext bereitstellen, z. B., wenn die Einstellungen erfordern, dass der Benutzer eine bestimmte Version von Readline hat.
Anthony G - Gerechtigkeit für Monica
:) Hier ist der manuelle Eintrag: gnu.org/software/bash/manual/html_node/…
holytrousers
1
Dies funktioniert nur auf Terminals und Terminalemulatoren, die DECSCUSR verstehen.
JdeBP
Ich musste hinzufügen set show-mode-in-prompt onin ~/.inputrcauch diese Arbeit zu machen.
Ronakg
4

Von hier kopiert - Befehlszeilenbearbeitung im VIM-Stil

Sollte in bash4.3 verfügbar sein - siehe Changelog -

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 ist derzeit in der rcPhase, Sie sollten in der Lage sein, Pakete für die meisten Distributionen zu erhalten, ohne sie aus dem Quellcode zu kompilieren, jedoch nicht in den Hauptrepositorys. Z.B. Ubuntu (amd64) hier und Debian (experimentelles Repo) hier .

Graeme
quelle
Beachten Sie Folgendes: Die Eingabeaufforderung wird nicht aktualisiert, wenn Sie eine benutzerdefinierte PS1 verwenden, die ein Zeilenumbruchzeichen enthält. hier
pgericson
@pgericson Es scheint mit einer benutzerdefinierten PS1 zu funktionieren, die eine neue Zeile für mich in Bash 4.4.12 enthält.
DuBistKomisch
2

Ich habe keine wirkliche Lösung gefunden, aber vielleicht könnte Ihnen (oder jemand anderem) dies helfen, eine bessere Lösung zu finden.

Sie müssen ein Skript erstellen (zB 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

und nachdem du es zu deiner PS1 hinzugefügt hast, so etwas wie:

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

aber wie gesagt, es ist nicht das, was du willst, weil es die Cursorfarbe erst nach einem cr ändert. Viel Glück

gb

gogolb
quelle
Hat das bei dir tatsächlich geklappt? Es hat bei mir nicht funktioniert; es hat den Cursor nur rot gemacht. Ich glaube nicht, dass kmtest.sh jedes Mal ausgeführt wird, wenn ich zwischen Einfüge- und Befehlsmodus wechsle. Es scheint, als würde es nur beim Erstellen der Eingabeaufforderung ausgeführt.
joecan
1

Es sieht so aus, als gäbe es eine Möglichkeit, dies durch Hacken der Readline zu erreichen. Vielleicht könnten wir darauf drängen, dass es zum Mainstream wird?

Hier ist meine Antwort auf SO https://stackoverflow.com/a/12201092/255961, die ich aktualisieren werde, wenn ich weitere Informationen erhalte.

Studgeek
quelle
1

Während es nicht genau das ist, was Sie wollen (den Cursor dynamisch ändern), wird Bash 4.4 / Readline 7.0 Unterstützung für das dynamische Ändern der Eingabeaufforderung hinzufügen . Sie können benutzerdefinierte Modusindikatoren für Einfüge- / Befehlsmodi angeben (Dies ist anders als die aktuelle show-mode-in-promptOption, die für die Verwendung mit +und fest codiert ist :).

Leider befinden sich diese Versionen derzeit in der Beta und scheinen noch nicht alle Fehler behoben zu haben. Außerdem fehlt ihnen die Möglichkeit, in der Eingabeaufforderung anzugeben, wo die Modusanzeige erscheinen soll.

In der Zwischenzeit habe ich gepatchte Versionen von Bash 4.3 / Readline 6.3 auf Github mit dieser Funktionalität veröffentlicht.

Dylan Cali
quelle
0

Ich habe die gleiche Frage vor einiger Zeit bei AskUbuntu gestellt, als ich von Gvim auf Console Vim umgestiegen bin.

Ich erhielt eine Antwort, die jedoch das Umschalten der Einstellungen des Gnome-Terminals beinhaltete. Diese Einstellungen wurden auf alle Terminals angewendet. Somit war es möglich, dass der Gnome-Terminal-Cursor zeitweise im falschen Zustand steckte.

Ich bin immer noch daran interessiert, ob Sie eine zufriedenstellende Lösung erhalten, aber im Laufe der Zeit habe ich mich an das Fehlen von Modusstatusinformationen im Cursor gewöhnt. Vielleicht drücke ich einfach öfter die Escape-Taste (z. B. escum sicherzustellen, dass ich mich im Befehlsmodus befinde; esc ium sicherzustellen, dass ich mich im Einfügemodus befinde). Vielleicht schaue ich mir den Status an, der unten auf dem Bildschirm angezeigt wird. vielleicht habe ich gerade den modus verinnerlicht.

Jeromy Anglim
quelle
3
Nur zur Klarstellung, Ihre Frage ist nicht die gleiche wie meine. Sie haben gefragt, wie der Cursor in Vim auf der Konsole geändert werden soll. Dies ist im Vim-Wiki gut dokumentiert . Ich möchte wissen, wie das im vi-Modus von Bash gemacht wird .
joecan