Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

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?

share|improve this question
add comment

9 Answers 9

up vote 44 down vote accepted

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>
share|improve this answer
3  
g CTRL-G I didn't know this existed. Nice! –  Jason Down Jun 13 '12 at 18:50
    
Nice I keep forgetting to use !bang commands in Vim –  Eddie B Jan 16 '13 at 1:38
1  
g <c-g> works cross-platform which is nice. –  AndrewPK Jan 17 at 18:39
    
Where can I find more info about the use of ! [...] %? –  Wok Feb 14 at 20:59
    
Help is here: vimdoc.sourceforge.net/htmldoc/various.html#:!cmd . If you make heavy use of shell commands, check also this plugin: stevelosh.com/projects/clam . –  mrucci Feb 15 at 8:10
add comment
: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).

share|improve this answer
add comment
: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.

share|improve this answer
1  
This is problematic with multi-byte characters. I found this question after putting %o in my statusline :) –  Matt Feb 1 '13 at 2:53
    
@Matt: so, whats the solution? –  akira Feb 1 '13 at 7:02
    
mrucci's solution "g^g" in normal mode was good enough for me. I needed it for a quick debug, so I haven't taken the time to try and get that information in the statusline. –  Matt Feb 1 '13 at 7:13
add comment

You can append an expression to display the buffer's bytecount in the statusline with:

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

Or you can change the option variable directly to avoid all that escaping:

:let &statusline .= ' %{ line2byte(line("$")+1)-1 }B'
share|improve this answer
    
When I try this, gVim complains about an unclosed expression sequence. I noticed you are missing a parenthesis, but fixing that doesn't help either. Here's what I rewrote it to: :set statusline=%{ line2byte(line("$")) } –  OwenP Jun 7 '10 at 17:51
    
@OwenP: should be fixed now –  akira Jun 8 '10 at 4:55
1  
Probably you want ...%{ line2byte(line(\"$\")+1))-1 } so that it includes the last line's characters in the count. This approach won't count multibyte characters correctly, though. –  intuited Jun 8 '10 at 5:29
1  
Also I think you need to escape the spaces, or just get rid of them. –  intuited Jun 8 '10 at 6:04
    
Edited to include @intuited's suggestions, also appended to the statusline rather than overwrite it. –  joeytwiddle Jun 14 at 21:40
add comment

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.

share|improve this answer
add comment

Workaround I've been using until I accepted mrucci's answer:

I found out by accident that when I :w to save the file, the command outputs the number of bytes written. This is more or less a character count, so that's been close enough so far. I do like mrucci's answer as well, possibly more than this one because it has a word count too.

share|improve this answer
add comment

If you keep a file copy of your text, just write your text to disk - the character count is displayed by default.

If you do not want to keep a file, just save your text to /dev/null: :w!/dev/null.

You can also let wc count your characters: :%!wc -c - but don't forget to hit U to restore your text.

If you need this often, just map these commands to a key sequence: :map #wc :w!/dev/null^[ - note that the ^[ must be entered as Ctrl+V Esc.

As a first indicator of text size, just turn on line numbers; admitted: this needs some mental arithmetics ;-)

share|improve this answer
add comment

After having this question and reading the answers (thanks mrucci) I added these lines to my .vimrc initialization file.

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

I leave it to vim :help users to figure out what they do.

Personally I find it useful to start Vim mappings with ; or , since I rarely use them as the first character of a command.

share|improve this answer
add comment

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.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.