Zählen Sie die markierte Zeichenfolgenlänge in VIM

23

Ich frage mich, ob es eine Möglichkeit gibt, markierte Symbole vim(einschließlich Leerzeichen) zu zählen.

AKTUALISIEREN

VIM-visueller Modus

Es wird die Anzahl der Zeilen angezeigt, wenn meine Auswahl mehrere Zeilen umfasst. Ich muss Symbole zählen.

Nemoden
quelle

Antworten:

28

Wenn ich nichts verpasse, macht Vim das schon. Wenn ich Text mit der Maus oder durch Tippen vund Bewegen des Cursors hervorhebe , sehe ich am unteren Bildschirmrand

- VISUAL - 12

Die Zahl rechts gibt die Anzahl der hervorgehobenen Zeichen an. Dies funktioniert nur, wenn sich die Auswahl in einer einzelnen Zeile befindet, andernfalls wird die Zeilenzahl angezeigt.

Sie können auch visuell einen Textbereich und einen Typ auswählen g Ctrl-G, der die Anzahl der ausgewählten Zeilen, Wörter und Bytes anzeigt.

garyjohn
quelle
4
(fassungslos) Wie zum Teufel habe ich Vim so lange und nie bemerken , dass ? Aber zu meiner Verteidigung dachte ich darüber nach, die Nummer programmatisch zu erhalten.
27.
Gute Antwort, aber werfen Sie einen Blick auf die aktualisierte Frage. Sowie @njd habe ich das nicht bemerkt.
Nemoden
1
@Nemoden: Versuchen Sie den zweiten Teil von Garyjohns Vorschlag (g Strg-G). Es sollte eine Zeile wie "Selected # of # Lines; # of # Words; # of # Bytes" anzeigen.
27.
Oh. Mein Fehler. Ich weiß nicht, warum ich die zweite Lösung übersprungen habe. Es klappt. Vielen Dank!
Nemoden
11
Dies ist auf einigen Systemen standardmäßig nicht aktiviert. Fügen set showcmdSie vimrces einfach zu Ihrem hinzu , um es zu aktivieren.
Tyler Holien
8

Vim wechselt zwischen der Anzeige der Zeichenanzahl und der Zeilenanzahl für visualisierten Text, je nachdem, was und wie Sie visualisieren (Patches für Vim 7.4, September 2015).

V will display line count
v$ will display character count

Wenn Sie mehr als eine Zeile anzeigen, wird nur die Anzahl der Zeilen angezeigt

g-CTRL-G displays 'byte count' which seems to be 'char count' +1 per line
zzapper
quelle
Wie die Frage schon sagt, wechselt auch normal vvon Zeichenzahl zu Zeilenzahl, wenn die Auswahl mehrere Zeilen umfasst. Allerdings g CTRL-Gmacht der Job gut.
Joeytwiddle
2
:function VisualLength()
:  exe 'normal "xy'
:  echo "Visual: " . strlen(@x) . "\n"
:  exe 'normal gv'
:endfunction

:map ,q "xy:call VisualLength()<CR>
  1. Zuerst ziehst du die aktuelle Auswahl (in den Puffer x)

  2. Dann zeigen Sie die Länge dieses Puffers an: strlen(@x)
    (Das in der Statuszeile angezeigte - VISUAL - verdeckt dies, daher müssen wir eine neue Zeile hinzufügen.)

  3. Markieren Sie den vorherigen visuellen Bereich: gv

Dabei wird nicht berücksichtigt, ob der visuelle Modus ein Zeilen-, Zeichen- oder Blockmodus war, aber in den meisten Fällen ist dies ausreichend.

njd
quelle
2

Ich sehe aus Ihrem Screenshot, dass Sie in Windows ausgeführt werden, so dass diese Antwort Ihnen möglicherweise nicht so viel hilft. Aber für andere ...

Eine unterbenutzte (IMO) Funktion von Vim ist, externe Befehle das schwere Heben ausführen zu lassen.

In diesem Fall können Sie den wcBefehl verwenden , wenn Sie sich auf einem UNIX-ähnlichen System befinden .

Am einfachsten ist es, den ausgewählten Text durch die Ausgabe des Befehls zu ersetzen, indem Sie Folgendes eingeben (mit ausgewähltem Text):

:!wc

(Dann drücken Sie die Eingabetaste).

Dies wird in Ihrer Befehlszeile angezeigt als:

'<,'>!wc

Nachdem Sie die Informationen gelesen haben, können Sie sie rückgängig machen u, um zu Ihrem Ausgangspunkt zurückzukehren.

Hinweis: Diese Verarbeitung erfolgt nur in ganzen Zeilen . Wenn Sie Teilzeilen wünschen, denke ich, dass @ garyjohns g_CTRL-GIhre beste Wette ist.

Sie können das Rückgängigmachen vermeiden, indem Sie stattdessen Folgendes ausführen:

:w !wc

Dadurch werden die ausgewählten Zeilen in die Standardeingabe des Befehls "geschrieben", und die Ausgabe des Befehls wird in einem neuen temporären Puffer angezeigt, wobei das Original unverändert bleibt. Siehe :help :write_cfür weitere Informationen.

Hinweis: Die :write_cInformationen stammen von: /programming/1237780/vim-execute-shell-command-without-filtering

Nun allgemeiner:

Dieses Beispiel mit wcist ziemlich simpel, aber Sie können sich vorstellen, wie mächtig dies ist. UNIX verfügt bereits über eine Vielzahl von Textverarbeitungsbefehlen, die Sie problemlos in Vim verwenden können, ohne Vimscript (yech) berühren zu müssen.

Darüber hinaus kann jedes Befehlszeilenprogramm, das Sie schreiben und das sich mit stdin / stdout befasst, jetzt nicht nur an Ihrem Terminal, sondern auch in Vim von Nutzen sein.

Ich finde mich zum Beispiel beim Laufen tidyund json-formatvon innen heraus vim, um Dateien, die ich mir anschaue, lesbarer zu machen.

Sie können dasselbe unter Windows tun, aber Windows verfügt nicht über einen so umfangreichen Befehlssatz. Sie können jedoch immer GNUWin32 oder ähnliches installieren , um diese Vorteile zu nutzen.

jwd
quelle
1

Für eine programmatische Methode innerhalb von Vimscript hat dies bei mir funktioniert, wenn die Auswahl auf eine Zeile beschränkt ist:

let amount = virtcol("'>") - virtcol("'<")

(Verwenden von virtcol(..)anstelle von col(..), sodass es erwartungsgemäß funktioniert, wenn :set ve=alles aktiv ist.)

Evgeni Sergeev
quelle