Wie kann ich (g) Vim dazu bringen, die Zeichenanzahl der aktuellen Datei anzuzeigen?

85

Ich schreibe gerne Tutorials und Artikel für ein Programmierforum, das ich häufig besuche. Dieses Forum hat eine Zeichenbeschränkung pro Beitrag. Ich habe in der Vergangenheit Notepad ++ verwendet, um Beiträge zu schreiben. In der Statusleiste wird die Anzahl der lebenden Zeichen angezeigt. Ich fange an, gVim häufiger zu verwenden, und ich möchte zu diesem Zeitpunkt wirklich nicht mehr zu Notepad ++ zurückkehren, aber es ist sehr nützlich, diese Zeichenanzahl zu haben. Wenn ich über die Zählung hinausgehe, füge ich den Beitrag normalerweise in Notepad ++ ein, damit ich sehen kann, wann ich genug getrimmt habe, um das Limit zu überschreiten.

Ich habe Vorschläge gesehen, :set rulerdie helfen würden, aber dies gibt nur die Zeichenanzahl über den aktuellen Spaltenindex in der aktuellen Zeile an. Das wäre toll, wenn ich keine Absatzumbrüche verwenden würde, aber ich bin mir sicher, dass das Lesen von mehreren tausend Zeichen in einem Absatz nicht angenehm ist.

Ich habe die Hilfe gelesen und gedacht, dass rulerformatdies funktionieren würde, aber nachdem statuslineich mir das verwendete Format angesehen habe, habe ich nichts gefunden, was eine Zeichenanzahl für den aktuellen Puffer angibt.

Ich habe gesehen, dass es Plugins gibt, die dies hinzufügen, aber ich tauche immer noch in gVim ein und bin mir nicht sicher, ob ich zufällige Plugins laden möchte, bevor ich verstehe, was sie tun. Ich würde es vorziehen, etwas zu verwenden, das in vim eingebaut ist, aber wenn es nicht existiert, existiert es nicht.

Was soll ich tun, um mein Ziel zu erreichen? Wenn es sich um ein Plugin handelt, verwenden Sie es und wie gut funktioniert es?

OwenP
quelle

Antworten:

140

Drücken Sie g CTRL-Gim normalen Modus, um einige Statistiken zum Cursor und zur Datei anzuzeigen.

Wenn Sie unter Linux arbeiten, können wc -mSie die Anzahl der Zeichen in der aktuellen Datei ermitteln

:!wc -m %

Da es nicht in Echtzeit aktualisiert wird, möchten Sie diesen Befehl möglicherweise auf Folgendes abbilden:

map <F4> :!wc -m %<CR>
Mrucci
quelle
19
g CTRL-GIch wusste nicht, dass es das gibt. Nett!
Jason Down
Schön, dass ich es immer wieder vergesse! Knallbefehle in Vim
Eddie B
3
g <cg> funktioniert plattformübergreifend, was gut ist.
AndrewPK
Wo finde ich weitere Informationen zur Verwendung von ! [...] %?
Wok
Hilfe finden Sie hier: vimdoc.sourceforge.net/htmldoc/various.html#:!cmd . Wenn Sie stark von Shell-Befehlen Gebrauch machen, überprüfen Sie auch dieses Plugin: stevelosh.com/projects/clam .
Mrucci
24
:help count-items

schlägt vor, dass Sie entweder einen Probelauf eines Ersatzalas machen könnten

:%s/./&/gn

(der dann die Anzahl der übereinstimmenden Zeichen zurückmeldet) oder dass Sie sich strlen()für den visuell ausgewählten Text interessieren:

:echo strlen(@")

("ist das unbenannte Register)

da Sie einen Ausdruck in Ihrer Statuszeile so aufrufen können %{myfunc()}, könnte dies ein guter Ausgangspunkt sein. Das Zählen der gesamten Zeit kann etwas zeitaufwändig sein, da Sie den gesamten Text auswählen und dann ziehen müssen, aber vielleicht ist es für Sie schon in Ordnung, die Anzahl der Bytes im "-Register anzuzeigen. Wenn Sie die Anzahl wirklich wissen möchten Anzahl der Zeichen im Puffer: Wählen Sie einfach ALLEN Text im Puffer visuell aus und ziehen Sie ihn heraus. Die Lösung wäre also:

 :set statusline=%{strlen(@")}

Dies gibt Ihnen die Anzahl der Zeichen im "-Register (die identisch mit der Anzahl der Bytes ist, wenn Sie den aktuellen Puffer auswählen und ziehen).

Akira
quelle
Die Lösung funktioniert auch unter Windows (was bei Bash-Befehlen nicht der Fall ist).
Dastrobu
Ich mag es, dass die Zählung nicht nach einer Sekunde verschwindet, wie es die g<CTRL-g>Methode in der akzeptierten Antwort tut .
Chester
7

Eine Erweiterung der Antwort von Mrucci:

Sie können wcLinux verwenden, ohne die Datei zuerst speichern zu müssen, indem Sie die :wBefehlsausgabe wie folgt ausführen:

:w !wc -m

und Sie können es etwas zuordnen, wie von Mrucci erwähnt.

architektonisch
quelle
6
:help statusline

gibt Ihnen

o N   Byte number in file of byte under cursor, first byte is 1.
      Mnemonic: Offset from start of file (with one added)

Dies ist auch eine gute Lösung für Ihr Problem. Gehen Sie einfach zum Ende des Puffers mit Gund die in Ihrer Statuszeile angezeigte Bytenummer ist die Anzahl der Zeichen (natürlich nicht bei Multi-Byte-Zeichen). Geh zurück zu dem Ort, mit dem du gekommen bist ctrlo.

Akira
quelle
1
Dies ist bei Mehrbyte-Zeichen problematisch. Ich habe diese Frage gefunden, nachdem ich% o in meine Statuszeile eingefügt habe :)
Matt
@Matt: Also, was ist die Lösung?
Akira
1
mruccis lösung "g ^ g" im normalen modus war gut genug für mich. Ich brauchte es für ein schnelles Debugging, also habe ich mir nicht die Zeit genommen, diese Informationen in der Statuszeile abzurufen.
Matt
1
Da die Dokumente vage und verwirrend sind, ist es erwähnenswert, dass der spezifische Befehl, den man ausführen muss, set statusline+=\ %o\ %N (interessanterweise funktioniert er nicht für z. B. "t S" -Element) . Wenn Sie dann die Statuszeile unverändert sehen, müssen Sie sie ausführen set laststatus=2. Für mich hat es die vorhandene transparente Statuszeile durch die neue ersetzt, die durchgehend schwarz ist und nur die Anzahl der Bytes enthält.
Hi-Angel
3

Wenn Sie es gewohnt sind, Folgendes zu verwenden: w, um die Datei zu speichern, gibt der Status jedes Mal die Anzahl der geschriebenen Zeichen zurück. Zum Beispiel habe ich am Ende dieses Satzes ein: w gemacht (ja, ich benutze gvim, um diese Notiz zu schreiben) und es wurde gemeldet: 245C geschrieben.

Erin Thomas
quelle
Dies ist ein wunderschöner Golf für den einmaligen Gebrauch.
Ciro Santilli am
3

Sie können einen Ausdruck anhängen, um den Bytecount des Puffers in der Statuszeile anzuzeigen:

:set statusline+=\ %{\ line2byte(line(\"$\")+1)-1\ }B

Oder Sie können die Optionsvariable direkt ändern, um all das zu vermeiden:

:let &statusline .= ' %{ line2byte(line("$")+1)-1 }B'
Akira
quelle
Wenn ich das versuche, beschwert sich gVim über eine nicht geschlossene Expressionssequenz. Mir ist aufgefallen, dass Ihnen eine Klammer fehlt, aber das hilft auch nicht. Folgendes habe ich umgeschrieben:: set statusline =% {line2byte (line ("$"))}
OwenP
@OwenP: sollte jetzt behoben sein
akira
1
Möglicherweise möchten Sie ...%{ line2byte(line(\"$\")+1))-1 }, dass die Zeichen der letzten Zeile in die Zählung einbezogen werden. Bei diesem Ansatz werden Multibyte-Zeichen jedoch nicht korrekt gezählt.
Intuited
1
Außerdem denke ich, du musst den Räumen entkommen oder sie einfach loswerden.
Intuited
Bearbeitet, um @intuiteds Vorschläge einzuschließen, auch an die Statuszeile angehängt, anstatt sie zu überschreiben.
Joeytwiddle
0

Problemumgehung, die ich verwendet habe, bis ich die Antwort von mrucci akzeptierte:

Ich habe zufällig herausgefunden, dass beim Speichern der Datei der Befehl die Anzahl der geschriebenen Bytes ausgibt. Dies ist mehr oder weniger eine Zeichenanzahl, das war also bisher nah genug. Ich mag auch Mruccis Antwort, möglicherweise mehr als diese, weil sie auch eine Wortanzahl hat.

OwenP
quelle
0

Wenn Sie eine Dateikopie Ihres Textes behalten, schreiben Sie einfach Ihren Text auf die Festplatte - die Zeichenanzahl wird standardmäßig angezeigt.

Wenn Sie nicht über eine Datei behalten möchten, speichern Sie einfach Ihren Text auf /dev/null: :w!/dev/null.

Sie können auch wcIhre Zeichen zählen lassen : :%!wc -c- Vergessen Sie aber nicht, zu drücken U, um Ihren Text wiederherzustellen.

Wenn Sie dies häufig benötigen, ordnen Sie diese Befehle einfach einer Tastenfolge zu: :map #wc :w!/dev/null^[- Beachten Sie, dass das ^[als Ctrl+ eingegeben werden muss V Esc.

Schalten Sie als ersten Indikator für die Textgröße einfach die Zeilennummern ein. zugegeben: das braucht ein bisschen gedankliche arithmetik ;-)

kdo
quelle
0

Nachdem ich diese Frage gestellt und die Antworten gelesen hatte (danke mrucci), fügte ich diese Zeilen meiner .vimrc-Initialisierungsdatei hinzu.

# get full statistics on the current buffer (not perfect, may redraw screen)
map ;gg           G$g<C-G>''
# get full statistics on the current position in the buffer
map ;gh           g<C-G>

Ich überlasse es vim: Benutzern helfen, herauszufinden, was sie tun.

Persönlich finde ich es nützlich, Vim-Mappings mit zu starten. oder, da ich sie selten als erstes Zeichen eines Befehls benutze.

David E.
quelle