vimstatusline

Display current column in status line


How to display the current column in the status line?

Having read :h statusline I found %c which looks promising, but it counts bytes and not characters. I'd like to have the column separated by characters, not bytes. %v works if no tabs are being used. Here an example:

123 56789
“äå µåäö”
   ^ this is a tab

I'd like to display the number indicated in the first row. The following works for the first to third column until the tab comes into play.

:set statusline=%v

The following works only for the first line, but not the second one.

:set statusline=%c

Given the abovementioned example vim displays 5 if the cursor is on the digit five in the first row, which is what I want. If I move down one row so the cursor is located on the µ I'd like to display 5 as well, %c displays 9 and %v depends on the value of tabstop.


Solution

  • I think you have to use an expression in the 'statusline' option: %{<exp>}. So grab the line, trim it to the cursor column, replace all characters with a 1-byte character, and count the length of the string:

    :let &stl = "%{strlen(substitute(strpart(getline('.'), 0, col('.')), '.', 'x', 'g'))}"