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


15

Ich benutze die vi-Tastenkombinationen in meiner tcsh-Shell.

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

Kennt jemand eine Möglichkeit, den aktuellen vi-Modus in der Shell anzuzeigen? (durch Einfügen in die Eingabeaufforderung oder etwas)

Antworten:


4

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, spielt dies keine Rolle.

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 Inhalte eingeben.

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


1
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 (z. B. h, um nach links zu gehen), ertönt einfach ein Piepton und es wird nichts unternommen.
Sonntag,

2
Mit "extra ESC" meine ich das Drücken von ESC, wenn ich mich bereits im Befehlsmodus befinde - was ich oft tue, da ich nicht weiß, in welchem ​​Modus ich mich
befinde

Du hast Recht. Ich habe es so lange benutzt, dass ich dieses Verhalten nicht mehr bemerke. Wieder die einfachste Antwort. Wenn Sie ESC und h drücken und nichts passiert, drücken Sie h erneut. Ich denke, das wirft eine andere Frage auf. Warum führt das Drücken von ESC im Befehlsmodus der vi-Tastenkombinationen dazu, dass das nächste Zeichen nicht richtig interpretiert wird? vi selbst macht das nicht. Ich kann ESC 10 Mal eingeben und der nächste Befehl funktioniert immer noch wie erwartet.
Bob Weber

Ein weiterer Tipp, schalten Sie die Glocke aus. Es ist unglaublich ärgerlich, nur aus dem Grund, den Sie beschreiben - und weil es beim Vervollständigen der Registerkarte piept. Es gibt verschiedene Möglichkeiten, dies abhängig von Ihrer Umgebung zu tun.
Bob Weber

1
Ok, ich probiere gerade diese Lösung aus. Die Zuordnung von Feststelltaste 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 bald. > Wenn Sie ESC und h drücken und nichts passiert, drücken Sie h erneut. Das Problem dabei ist, dass es ziemlich frustrierend ist und den Fluss stark unterbricht. Es ist eine zusätzliche Sache, über die ich zusätzlich zu dem Befehl, den ich bilde, nachdenken muss. Ich bevorzuge vi Tastenkombinationen aus dem Grund, dass sie sich in meinem Muskelgedächtnis befinden und etwas weniger zum Nachdenken anregen - diese Art von Unterbrechungen selbst ...
Sonntag,

3

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

Ich denke, es gibt einen Weg, dies zu tun, aber es ist ein gewaltiger Overkill für einen winzigen Ärger, und ich glaube nicht, dass Sie das im Sinn hatten, als Sie diese Frage stellten. Wenn dies zutrifft, hören Sie jetzt auf zu lesen und genießen Sie Ihr Leben.

OTOH, wenn das wirklich dein Lieblingsfieber ist und es dich verrückt macht und du unbedingt dieses Problem lösen willst, hier ist meine Idee, wie du vorgehen sollst:

  1. Erwerben Sie eine Kopie von Advanced Programming in the UNIX (R) Environment 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 ein Terminal geschichtet werden kann.
  4. Implementieren Sie Ihre Behandlung für die Esc-Tastenkombination (oder beide Tastendrücke zum Ändern des Modus) und zeigen Sie sie über eine Glocke oder eine 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 überlagern können. Die Summe der eingespeisten Streams erzeugt Ihr Terminal-E / A-Verhalten.

Wenn ein Zeichen eingegeben wird, muss das erste Modul es überprüfen und weitergeben (wenn es möchte). Wenn die Antwort in die entgegengesetzte Richtung eingeht, kann sie erneut überprüft und weitergeleitet werden. Auf diese Weise wird eine Strg-C-Taste auf einer höheren Ebene als eine normale Zeichentaste behandelt.

Sie können eine Binärdatei erstellen, die ein Stream-Modul implementiert, das beim Aufrufen unbemerkt im Vordergrund ausgeführt wird, alle Tastenanschläge überprüft und weiterleitet und Ihre bevorzugte Aktion für die von Ihnen gewünschten Tastenanschläge ausführt. In jeder Hinsicht 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 einer beliebigen) Zeile Ihrer .tcshrc-Datei aufrufen, und Sie würden nicht einmal wissen, dass sie vorhanden ist.

Es gibt hier eine gute Grundierung , aber ich konnte nicht viel zu diesem Thema finden, wahrscheinlich, weil es nach der Grundierung ist .


2

Diese Seite hat ein ziemlich detailliertes Skript, das festlegt, was Sie in zsh wollen (und mehr) . Vielleicht könnte es angepasst werden, um mit tcsh zu arbeiten (ich kenne diese Shell nicht so gut).


Ich bin auch nicht mit tcsh vertraut, aber ich denke, die Seite, die Sie gezeigt haben, verwendet zsh-Widgets (mit zle). Ich denke nicht, dass andere Muscheln das haben, aber wenn sie das tun, würde das definitiv den Trick machen.
BrianH

0

Befehlszeilenbearbeitung mit tcsh

Es gibt zwei Hauptmodi zum Bearbeiten der Befehlszeile,
die auf den beiden 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 Submodi: Einfüge- und Befehlsmodus .

  • Der 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 oben bereits verlinkten tcshAnpassungsseite .


2
Ihre Links führen zu urheberrechtlich geschützten O'Reilly-Büchern ...
BrianH

0

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, die eine Lösung anbot. Daher gehe ich davon aus, dass das Posten in diesem Thread in Ordnung ist.

Setzen Sie einfach die Einstellungen Ihres Terminalprogramms oder Ihrer Shell zurück. Ich verwende zurzeit 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

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


0

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

set show-mode-in-prompt on

Und um den eigentlichen Charakter anzupassen, benutze:

set vi-ins-mode-string "custom-ins"
set vi-cmd-mode-string "custom-cmd"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.