4

I have this lines for my statusline

 set statusline=%{&paste?'\ \ paste\ ':''}
 set statusline+=\ %{expand('%:~:.')!=#''?expand('%:~:.'):'[No\ Name]'}
 set statusline+=%{&readonly?'\ \ [RO]':!&modifiable?'\ \ [RO]':''}

I removed other parts for avoiding useless complexity. As you can see, I need to put two spaces before [RO] in the third/last line when I only get one in output. Why is that?

Edit: My version is NVIM v0.3.0-dev

3N4N
  • 5,684
  • 18
  • 45

1 Answers1

3

Inside a %{} the first space character in the expression seems to be always removed. For example, let &statusline="%{' ]'}" displays the string " ]". It also seems to be independent of fillchars. That is, if set fillchars=stl:^, "^]^^^^" will be displayed. Why this happens or if it's intentional is quite mysterious to me (hopefully someone else can answer this question).

A workaround is to use a different space character, e.g., a non breaking space 0xA0:

let &statusline="%{'\ua0xyz'}"

or

set statusline=%{\"\\ua0xyz\"}
Mass
  • 14,080
  • 1
  • 22
  • 47
  • Thanks for answering. I don't need a workaround, not really. I just wanted to know what I'm doing wrong. – 3N4N May 27 '18 at 15:15
  • Understood, let's wait for some other answers. I'm hoping one of the vim-airline maintainers see this, because they probably have the most experience with extreme statusline customization. – Mass May 27 '18 at 15:18