How can I get (g)Vim to display the character count of the current file?
I like to write tutorials and articles for a programming forum I frequent. This forum has a character limit per post. I've used Notepad++ in the past to write posts and it keeps a live character count in the status bar. I'm starting to use gVim more and I really don't want to go back to Notepad++ at this point, but it is very useful to have this character count. If I go over the count, I usually end up pasting the post into Notepad++ so I can see when I've trimmed enough to get by the limit.
I've seen suggestions that :set ruler
would help, but this only gives the character count via the current column index on the current line. This would be great if I didn't use paragraph breaks, but I'm sure you'd agree that reading several thousand characters in one paragraph is not comfortable.
I read the help and thought that rulerformat
would work, but after looking over the statusline
format it uses I didn't see anything that gives a character count for the current buffer.
I've seen that there are plugins that add this, but I'm still dipping my toes into gVim and I'm not sure I want to load random plugins before I understand what they do. I'd prefer to use something built in to vim, but if it doesn't exist it doesn't exist.
What should I do to accomplish my goal? If it involves a plugin, do you use it and how well does it work?
Press g CTRL-G
in normal mode to display some statistics on the cursor and the file.
If you are in linux you can use wc -m
to get the character count in the current file
:!wc -m %
Since it is not updated in real-time, maybe you want to map this command to something like:
map <F4> :!wc -m %<CR>
:help count-items
suggests, that you could either do a dry-run of a replace ala
:%s/./&/gn
(which then reports back the number of matched chars) or that you do a fancy strlen()
on the visually selected text:
:echo strlen(@")
(" is the unnamed register)
since you can call an expression in your statusline like %{myfunc()}
that might be a good starting point. counting all the time could be a bit time consuming since you would have to select the whole text and then yank it, but maybe showing the number of bytes in the "-register is ok for you already. if you really want to know the number of chars in the buffer: just visually select ALL the text in the buffer and yank it. so, the solution would be:
:set statusline=%{strlen(@")}
which gives you the number of chars in the "-register (which is identical to the number of bytes if you select and yank the current buffer).
An enhancement to the answer of mrucci:
You can use wc
on linux without having to save the file first by directing the :w
command output as follows:
:w !wc -m
and you can map it to something as mentioned by mrucci.
:help statusline
gives you
o N Byte number in file of byte under cursor, first byte is 1.
Mnemonic: Offset from start of file (with one added)
which is also a good workaround for your problem. just go to the end of the buffer with G and the byte number shown in your statusline is the number of chars (not true with multi-byte chars of course). go back to where you came from with ctrlo.
If you're in the habit of using :w to save the file, each time you do this the status reports back the number of characters written. For instance, at the end of this sentence I did a :w (yes I'm using gvim to write this note) and it reported: 245C written.