Jak mogę uzyskać (g) Vima, aby wyświetlał liczbę znaków w bieżącym pliku?

85

Lubię pisać tutoriale i artykuły na forum programowania, które często odwiedzam. To forum ma limit znaków na post. W przeszłości używałem Notepad ++ do pisania postów, dzięki czemu liczba znaków na żywo jest wyświetlana na pasku stanu. Zaczynam więcej używać gVim i naprawdę nie chcę w tym momencie wracać do Notepad ++, ale bardzo przydatne jest, aby ta liczba znaków się liczyła. Jeśli przejdę liczbę, zwykle kończę wklejanie posta do Notepad ++, aby zobaczyć, kiedy przyciąłem wystarczająco, aby przekroczyć limit.

Widziałem sugestie, które :set rulermogłyby pomóc, ale daje to tylko liczbę znaków poprzez bieżący indeks kolumny w bieżącym wierszu. Byłoby świetnie, gdybym nie używał podziałów akapitów, ale jestem pewien, że zgodziłbyś się, że czytanie kilku tysięcy znaków w jednym akapicie nie jest wygodne.

Przeczytałem pomoc i pomyślałem, że rulerformatto zadziała, ale po przejrzeniu używanego statuslineformatu nie zobaczyłem niczego, co dałoby liczbę znaków dla bieżącego bufora.

Widziałem, że istnieją wtyczki, które to dodają, ale wciąż zanurzam palce w gVimie i nie jestem pewien, czy chcę załadować losowe wtyczki, zanim zrozumiem, co robią. Wolałbym użyć czegoś wbudowanego do vim, ale jeśli nie istnieje, to nie istnieje.

Co powinienem zrobić, aby osiągnąć swój cel? Jeśli dotyczy wtyczki, czy jej używasz i jak dobrze działa?

OwenP
źródło

Odpowiedzi:

140

Naciśnij g CTRL-Gw trybie normalnym, aby wyświetlić statystyki dotyczące kursora i pliku.

Jeśli jesteś w wc -msystemie Linux, możesz użyć, aby uzyskać liczbę znaków w bieżącym pliku

:!wc -m %

Ponieważ nie jest aktualizowany w czasie rzeczywistym, być może chcesz mapować to polecenie na coś takiego:

map <F4> :!wc -m %<CR>
mrucci
źródło
19
g CTRL-GNie wiedziałem, że to istnieje. Miły!
Jason Down,
Fajnie, wciąż zapominam o użyciu poleceń! Bang w Vimie
Eddie B
3
g <cg> działa na wielu platformach, co jest miłe.
AndrewPK
Gdzie mogę znaleźć więcej informacji na temat korzystania ! [...] %?
Wok
Pomoc jest tutaj: vimdoc.sourceforge.net/htmldoc/various.html#:!cmd . Jeśli często korzystasz z poleceń powłoki, sprawdź również tę wtyczkę: stevelosh.com/projects/clam .
mrucci
24
:help count-items

sugeruje, że możesz albo wykonać próbę zastępczą ala

:%s/./&/gn

(który następnie podaje liczbę dopasowanych znaków) lub że masz ochotę strlen()na wizualnie zaznaczony tekst:

:echo strlen(@")

(„jest nienazwanym rejestrem)

ponieważ możesz wywołać wyrażenie w linii statusu w %{myfunc()}ten sposób, może to być dobry punkt wyjścia. liczenie przez cały czas może być trochę czasochłonne, ponieważ musiałbyś zaznaczyć cały tekst, a następnie szarpać go, ale być może pokazanie liczby bajtów w rejestrze-jest już dla ciebie odpowiednie. jeśli naprawdę chcesz znać liczbę znaków w buforze: po prostu wizualnie zaznacz WSZYSTKIE teksty w buforze i przeciągnij je, więc rozwiązaniem byłoby:

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

co daje liczbę znaków w rejestrze „(która jest identyczna z liczbą bajtów, jeśli wybierzesz i zszarpiesz bieżący bufor).

akira
źródło
Rozwiązanie działa również w systemie Windows (które nie działają polecenia bash).
dastrobu,
Podoba mi się, że liczba nie znika po sekundzie jak g<CTRL-g>metoda z zaakceptowanej odpowiedzi.
Chester,
7

Rozszerzenie odpowiedzi mrucci:

Możesz używać wcw systemie Linux bez konieczności wcześniejszego zapisywania pliku, kierując dane :wwyjściowe polecenia w następujący sposób:

:w !wc -m

i możesz zmapować to na coś, o czym wspomniał mrucci.

architektoniczny
źródło
6
:help statusline

daje Ci

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

co jest również dobrym obejściem problemu. wystarczy przejść do końca bufora za pomocą, Ga liczba bajtów pokazana w linii statusu to liczba znaków (oczywiście nieprawda w przypadku znaków wielobajtowych). wróć do miejsca, z którego przybyłeś ctrlo.

akira
źródło
1
Jest to problematyczne w przypadku znaków wielobajtowych. Znalazłem to pytanie po wstawieniu% o w mojej linii statusu :)
Matt
@Matt: więc jakie jest rozwiązanie?
akira
1
Rozwiązanie mrucci „g ^ g” w trybie normalnym było dla mnie wystarczająco dobre. Potrzebowałem go do szybkiego debugowania, więc nie poświęciłem czasu, aby spróbować znaleźć te informacje w linii statusu.
Matt
1
Ponieważ dokumenty są niejasne i mylące, warto zauważyć, że konkretnym poleceniem, które należy wykonać, jest set statusline+=\ %o\ %N (co ciekawe, nie działa ono np. Dla elementu „t S”) . Jeśli więc zobaczysz, że linia statusu nie uległa zmianie, oznacza to, że musisz wykonać set laststatus=2. Dla mnie zastąpił on istniejącą przezroczystą linię statusu nową, będącą jednolitą czernią i posiadającą tylko element „liczba bajtów”.
Hi-Angel,
3

Jeśli masz zwyczaj używania: w, aby zapisać plik, za każdym razem, gdy to robisz, status zgłasza liczbę zapisanych znaków. Na przykład na końcu tego zdania zrobiłem: w (tak, używam gvima do napisania tej notatki) i napisałem: napisano 245C.

Erin Thomas
źródło
Pięknie gra w golfa za jednym razem.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
3

Możesz dołączyć wyrażenie, aby wyświetlić liczbę bajtów bufora w linii statusu za pomocą:

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

Lub możesz zmienić zmienną opcji bezpośrednio, aby uniknąć ucieczki:

:let &statusline .= ' %{ line2byte(line("$")+1)-1 }B'
akira
źródło
Kiedy próbuję, gVim skarży się na niezamkniętą sekwencję ekspresyjną. Zauważyłem, że brakuje Ci nawiasu, ale naprawienie tego też nie pomaga. Oto, co przepisałem na:: set statusline =% {line2byte (line ("$"))}}
OwenP
@OwenP: powinno być teraz naprawione
akira
1
Prawdopodobnie chcesz, ...%{ line2byte(line(\"$\")+1))-1 }aby zawierał znaki ostatniego wiersza w liczbie. Takie podejście nie będzie jednak poprawnie liczyć znaków wielobajtowych.
intuicyjnie
1
Myślę też, że musisz uciec z przestrzeni lub po prostu się ich pozbyć.
intuicyjnie
Edytowane w celu uwzględnienia sugestii @ intuited, również dołączane do linii statusu, zamiast ją zastępować.
joeytwiddle
0

Obejście Używałem, dopóki nie zaakceptowałem odpowiedzi mrucci:

Dowiedziałem się przez przypadek, że kiedy: w, aby zapisać plik, polecenie wyświetla liczbę zapisanych bajtów. Jest to mniej więcej liczba postaci, więc do tej pory było wystarczająco blisko. Podoba mi się również odpowiedź mrucciego, być może nawet bardziej niż ta, ponieważ zawiera ona także liczbę słów.

OwenP
źródło
0

Jeśli przechowujesz kopię pliku swojego tekstu, po prostu napisz tekst na dysk - liczba znaków jest wyświetlana domyślnie.

Jeśli nie chcesz, aby plik, wystarczy zapisać tekst /dev/null: :w!/dev/null.

Możesz także wcpoliczyć swoje postacie: :%!wc -c- ale nie zapomnij nacisnąć, Uaby przywrócić tekst.

Jeśli potrzebujesz tego często, po prostu przypisz te polecenia do sekwencji klawiszy: :map #wc :w!/dev/null^[- zwróć uwagę, że ^[należy je wprowadzić jako Ctrl+ V Esc.

Jako pierwszy wskaźnik rozmiaru tekstu po prostu włącz numery linii; przyznał: to wymaga trochę arytmetyki umysłowej ;-)

kdo
źródło
0

Po otrzymaniu tego pytania i przeczytaniu odpowiedzi (dzięki mrucci) dodałem te linie do mojego pliku inicjującego .vimrc.

# 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>

Pozostawiam to vimowi: pomóż użytkownikom dowiedzieć się, co robią.

Osobiście uważam, że warto zacząć od mapowania Vima; lub, ponieważ rzadko używam ich jako pierwszej postaci polecenia.

David E.
źródło