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?

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>

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).


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.


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.


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

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'

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.


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 ;-)


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.