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

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

我读到了如何更新 vim 状态行这里。而且我能够成功更新它。

但是,我想保留默认 vim 状态行的格式,只添加一些更多信息,例如文件大小、文件类型等。

Vim 默认状态行是:

   <file-name>                              line_num,col_num        %file

我怎样才能做到以下几点?

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

我试过:

set statusline+=%y

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

有什么提示吗?

答案1

就像@muru所说,这似乎不可能确切地当设置为渲染代码时模拟默认状态行,statusline它会执行设置中无法指定的操作statusline。然而,有可能非常接近。以下是ruler启用时默认状态行的合理近似方式:

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

主要区别在于行号和列号的定位。这也显示[-]在不可修改的缓冲区中。如果可以模拟默认的间距逻辑,我还没有找到一种方法来做到这一点。也许这对于您的目的来说已经足够接近了。

这与尝试模拟 中的默认状态行非常相似:help statusline,尽管该版本缺少预览标志。

我自己使用了它的拆分版本,.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%)

答案2

太长了;博士

: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 截断从左边开始并<在开头添加。

如果有空间键位图,它添加了它在最后(右对齐)。

现在,统治者。它包括<row>,<col>-<virtcol> 部分和相对的位置(右对齐)。

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

解决方案

现在让我们采用建议的值文档:

: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%)

答案3

该代码不会将任何值设置为空状态字符串,而只是使用一些默认值进行操作。看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

相关内容