我读到了如何更新 vim 状态行这里。而且我能够成功更新它。
但是,我想保留默认 vim 状态行的格式,只添加一些更多信息,例如文件大小、文件类型等。
Vim 默认状态行是:
<file-name> line_num,col_num %file
我怎样才能做到以下几点?
- 我想在文件名后添加信息
- 显示状态行的当前格式(
: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