Wie wird der aktuelle Vi-Modus angezeigt, wenn Vi-Tastenkombinationen in der Shell verwendet werden?

6285
sundar

Ich verwende die vi-Tastenkombinationen in meiner Tcsh-Shell.

Nun weiß ich nicht, in welchem ​​vi-Modus ich bin ( insertModus oder commandModus), was zu viel Frustration führt.

Kennt jemand eine Möglichkeit, den aktuellen vi-Modus in der Shell anzuzeigen? (durch Aufforderung oder etwas)

15

7 Antworten auf die Frage

4
Bob Weber

Ich glaube nicht, dass es eine Möglichkeit gibt, visuell zu bestimmen, in welchem ​​Modus Sie sich befinden, aber wenn Sie Ihr Verhalten ein wenig ändern, ist es unwichtig.

Wenn Sie sich im Befehlsmodus befinden möchten, drücken Sie ESC, bevor Sie einen Befehl eingeben.

Wenn Sie sich im Einfügemodus befinden möchten, drücken Sie ESC und i, bevor Sie Inhalt eingeben.

Sie werden am Ende viel auf ESC drücken, aber jeder vi-User, den ich je getroffen habe, tut das trotzdem.

Das Problem ist, dass in der Shell die zusätzlichen ESCs nicht ignoriert werden. Wenn ich einen zusätzlichen ESC gebe und dann einen Befehl eingebe (sagen Sie h, um sich nach links zu bewegen), gibt er einfach einen Piepton aus und macht nichts. sundar vor 15 Jahren 1
Mit "extra ESC" meine ich die Betätigung von ESC, wenn ich mich bereits im Befehlsmodus befinde - was ich sehr oft tue, da ich nicht weiß, in welchem ​​Modus ich bin. sundar vor 15 Jahren 2
Du hast Recht. Ich habe es so lange gebraucht, dass ich dieses Verhalten nicht mehr wahrnehme. Wieder die einfachste Antwort. Wenn Sie ESC und h drücken und nichts passiert, drücken Sie erneut h. Ich denke, das eröffnet eine andere Frage. Warum wird durch Drücken von ESC im Befehlsmodus der vi-Tastenkombinationen das nächste Zeichen nicht korrekt interpretiert? vi selbst macht das nicht. Ich kann 10 mal ESC eingeben und der nächste Befehl funktioniert immer noch wie erwartet. Bob Weber vor 15 Jahren 0
Noch ein Tipp, schalten Sie die Glocke aus. Es ist unglaublich ärgerlich, nur aus dem von Ihnen beschriebenen Grund - und weil es beim Beenden des Registers piept. Je nach Ihrer Umgebung gibt es verschiedene Möglichkeiten. Bob Weber vor 15 Jahren 0
Ok, ich versuche gerade diese Lösung. Das Zuordnen von Caps Lock zu Escape hat die Implementierung vereinfacht, aber ich muss mich erst noch an ESC-i für den Einfügemodus gewöhnen. Ich hoffe ich werde es bald tun. > Wenn Sie ESC und h drücken und nichts passiert, drücken Sie erneut h. Das Problem dabei ist, dass es ziemlich frustrierend ist und den Fluss sehr bremst. Es ist eine zusätzliche Sache, über die ich zusätzlich zu dem Befehl, den ich gerade formiere, nachdenken muss. Ich bevorzuge vi-Keybindings, gerade weil sie sich in meinem Muskelgedächtnis befinden und eine Sache weniger zu denken gibt - diese Art bricht diesen Zweck selbst. sundar vor 15 Jahren 1
3
nagul

Ich habe die Dokumentation durchgesehen, und ich muss sagen, dass ich keinen Weg finden konnte, den aktuellen vi-Modus zu erkennen und anzuzeigen. Ich hoffe, dass Sie eine angenehme Überraschung haben und jemand eine Lösung findet, aber ich sehe keine Möglichkeit, das zu tun, was Sie fragen.

Ich denke, dass es einen Weg gibt, dies zu tun, aber es ist ein massiver Overkill für einen winzigen Ärger, und ich glaube nicht, dass Sie daran gedacht haben, als Sie diese Frage gestellt haben. Wenn dies wahr ist, hören Sie jetzt auf zu lesen und genießen Sie Ihr Leben.

OTOH, wenn dies wirklich dein Haustier ist, und es macht dich verrückt, und du willst dieses Problem wirklich unbedingt lösen, hier ist meine Idee, wie du damit umgehen sollst:

  1. Holen Sie sich eine Kopie der erweiterten Programmierung in der UNIX (R) -Umgebung von W. Richard Stevens.
  2. Lesen Sie die Kapitel zu Streams und Terminal I / O.
  3. Laden Sie den Quellcode in das oben genannte Buch herunter, das ein Beispiel für einen Stream enthält, der auf einem Terminal angeordnet werden kann.
  4. Implementieren Sie Ihr Handling für die Esc-Tastenkombination (oder beide Moduswechsel-Tastenkombinationen) und geben Sie dies durch eine Klingel oder Hintergrundmanipulation der aktuellen Zeile an.

Kurz gesagt, Unix implementiert Terminal-E / A als Vollduplex-E / A-Stream zwischen dem Gerätetreiber und dem Benutzerprozess, in den Module eingefügt werden können. Es ist als Stapel organisiert, sodass Sie beliebig viele Streams schichten können. Die Summe der injizierten Streams erzeugt das E / A-Verhalten des Terminals.

Wenn ein Zeichen eingegeben wird, kann das erste Modul es prüfen und weitergeben (falls gewünscht). Wenn die Antwort in der entgegengesetzten Richtung eintrifft, hat sie erneut die Möglichkeit, sie zu überprüfen und weiterzuleiten. Auf diese Weise wird eine Strg-C auf einer höheren Ebene als eine normale Zeichentaste behandelt.

Sie können ein Binärprogramm erstellen, das ein Stream-Modul implementiert, das bei Aufruf automatisch im Vordergrund ausgeführt wird, alle Tastatureingaben überprüft und weiterleitet und Ihre bevorzugte Aktion für die Tastatureingaben ausführt, die Sie interessieren. Für alle Zwecke und Zwecke sieht es so aus, als würden Sie an der Shell arbeiten. Oooh Sie können diese Binärdatei in der letzten (oder ersten oder beliebigen) Zeile Ihres .tcshrc aufrufen, und Sie würden nicht einmal wissen, dass sie vorhanden ist.

Es gibt eine gute Grundierung hier, aber ich kann nicht viel zu diesem Thema finden, wahrscheinlich, weil es hinter seiner höchsten Vollkommenheit ist.

2
redacted

Diese Seite enthält ein ziemlich detailliertes Skript, das das, was Sie wollen (und mehr) in zsh festlegen . Vielleicht könnte es für die Arbeit mit tcsh angepasst werden (ich bin mit dieser Shell nicht besonders vertraut).

Ich bin auch nicht mit tcsh vertraut, aber ich glaube, die von Ihnen gezeigte Seite verwendet zsh-Widgets (mit zle). Ich glaube nicht, dass andere Muscheln das haben, aber wenn sie es tun, würde das definitiv den Trick tun. BrianH vor 15 Jahren 0
0
nik

Befehlszeilenbearbeitung mit tcsh

Es gibt zwei Hauptmodi zum Bearbeiten der Befehlszeile,
die auf den zwei am häufigsten verwendeten Texteditoren Emacs und vi basieren.

Bei den vi- Bindungen müssen Sie zwischen dem Einfüge- und dem Befehlsmodus wechseln .
In jedem Modus sind verschiedene Befehle nützlich.

Der vi- Modus verfügt über zwei Untermodi, den Einfüge- und den Befehlsmodus .

  • Standardmodus ist Einfügen .
  • Sie können zwischen den Modi wechseln, indem Sie drückenEsc .
  • Alternativ kann im Befehlsmodus, tippen 'a' (append) oder 'i' (Insert) werden Sie zurück zum Einfügen - Modus
    .

Weitere Hinweise auf der bereits oben verlinkten tcshAnpassungsseite .

Ihre Links führen zu urheberrechtlich geschützten O'Reilly-Büchern ... BrianH vor 15 Jahren 2
0
J.j. Loneman

Ich hatte genau das gleiche Problem und habe aus Versehen die Lösung gefunden. Obwohl dieser Thread alt ist, konnte ich keine andere Website finden, auf der eine Lösung angeboten wurde. Daher gehe ich davon aus, dass die Veröffentlichung in diesem Thread in Ordnung ist.

Setzen Sie einfach die Einstellungen Ihres Terminalprogramms oder der Shell zurück. Ich verwende derzeit PuTTY und habe gerade meine gespeicherten Einstellungen für meine gespeicherte Verbindung gelöscht und eine gespeicherte Sitzung neu erstellt. Lief wie am Schnürchen.

Hoffe das hilft!

0
Dylan Cali

Bitte sehen Sie meine Antwort auf SO . Bash 4.4 / Readline 7.0 wird diese Funktionalität unterstützen, und in der Zwischenzeit habe ich gepatchte Versionen von Bash 4.3 / Readline 6.3 in github veröffentlicht .

0
ber532k

Für alle, die genau dieses Problem haben (wie ich): Ich habe bei stackoverflow eine Lösung gefunden . Offensichtlich gibt es in Readline native Unterstützung dafür. Sie können also einfach Folgendes zu Ihrem hinzufügen ~/.inputrc:

set show-mode-in-prompt on 

Und um die tatsächliche Charakterverwendung anzupassen:

set vi-ins-mode-string "custom-ins" set vi-cmd-mode-string "custom-cmd"