默认状态行的格式是什么?


14

在这里了解了如何更新vim statusline 。而且我能够成功更新它。

但是,我想保留默认vim statusline的格式,并向其中添加更多信息,例如文件大小,文件类型等。

Vim的默认状态行是:

   <file-name>                              line_num,col_num        %file

我该怎么办?

  1. 我想在文件名后添加信息
  2. 显示状态行的当前格式(不:set statusline显示任何内容)

我试过了:

set statusline+=%y

但这会覆盖整个状态行,仅显示文件类型(%y)。

有什么提示吗?


2
如果您对Vim感兴趣,请签出Vi和Vim
muru

Answers:


15

就像@muru所说的那样,当设置为渲染它执行无法在设置中指定的操作的代码时,似乎不可能完全模拟默认状态行。但是,可能会很接近。这是启用后默认状态行外观的合理近似值:statuslinestatuslineruler

:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)

主要区别是行号和列号的位置。如果可以模拟默认的间距逻辑,则我无法找到一种方法来实现。也许这将足够满足您的目的。

我自己使用了一个拆分版本,.vimrc将Syntastic状态行信息放置在看起来像带有标尺的正常vim状态行的中间:

" start of default statusline
set statusline=%f\ %h%w%m%r\ 
" NOTE: preceding line has a trailing space character

" Syntastic statusline
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

" end of default statusline (with ruler)
set statusline+=%=%(%l,%c%V\ %=\ %P%)

7

该代码未将任何值设置为空的状态字符串,而只是使用一些默认值进行操作。见src/screen.c,功能win_redr_status()。显示的项目基于编译的功能,因此要重建确切的状态行,需要查看编译的功能。使用以下示例中的状态行可能会更简单:h statusline

Examples:
Emulate standard status line with 'ruler' set 
  :set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

宽度(14)之后的点符号(。)在%-14.(%l,%c%V%)什么意思?
Shamaoke

5

tl; dr

:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P

尽管我建议的解决方案与其他答案没有太大不同,但我想分享更详细的解释。

原始行为

首先,让我们弄清楚如何vim绘制状态线。负责的职能是win_redr_status()win_redr_ruler()

vim取缓冲,增加了一个空间,如果有任何标志遵循(如[Help][Preview][+][RO])。然后, 增加 标志

通常,它会为标尺分配18个字符单元。如果缓冲区名称部分不适合,则其余可用空间将从左侧vim 截断<在开头添加。

如果有足够的空间放置keymap,它将在末尾添加它(右对齐)。

现在,统治者。它由<row>,<col>-<virtcol> 零件和相对位置(右对齐)组成。

还有一个限制,即与缓冲区名部分必须至少一半的的宽度

现在,让我们采用docs建议的值:

:set statusline=%<%f\ %h%m%r%=%-14.(%l,%c%V%)\ %P

哪里

%< - where to truncate the line if too long
%f - buffer name (path to a file, or something)
%h - help flag
%m - modified flag
%r - readonly flag
%= - separater between the left (buffer name) and the right (ruler) parts
%-14.(...%) - minimum field width == 14
%l - line
%c - column
%V - virtual column
%P - percentage

因此,%<可以将first 省略,因为默认情况下缓冲区名称在开头被截断。然后,它缺少预览标志(%w)。同样,当窗口的18 * 2宽度小于字符宽度时,右侧部分占据状态行的一半以上。

因此,至少我们可以省略%<并添加%w

:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P

我们可以走得更远,确保正确的部分不超过状态行的一半:

set statusline=%!MyStatusLine()
function! MyStatusLine()
    let l:w = min([14,winwidth(0)/2-3])
    return '%f %h%w%m%r%=%-' . l:w . '.(%l,%c%V%) %P'
endfunction

然后,我们可以把它取决于功能vim编译

if has("quickfix")
    ...
endif

但是我要说那是不切实际的,并且先前的解决方案对于大多数意图和目的来说就足够了。但是,如果最后一种解决方案对您不起作用,请告诉我出什么问题了,我将尝试提出一个更好的解决方案。


劳伦斯·贡萨尔维斯(Laurence Gonsalves)建议的解决方案的问题在于,如果没有标志,则在左右部分之间有两个空格:

:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.