我在这里阅读了有关如何更新 vim 状态行的信息。我能够成功更新它。
但是,我想保留默认 vim 状态行的格式,并为其添加更多信息,例如文件大小、文件类型等。
Vim 默认状态行是:
<file-name> line_num,col_num %file
Run Code Online (Sandbox Code Playgroud)
我怎么能做到以下几点?
:set statusline
显示任何内容)我试过:
set statusline+=%y
Run Code Online (Sandbox Code Playgroud)
但这会覆盖整个状态行并仅显示文件类型 ( %y
)。
任何提示?
Lau*_*ves 16
就像@muru 所说的那样,当被设置为渲染代码时,似乎不可能完全模拟默认状态行,statusline
它执行无法在statusline
设置中指定的事情。然而,有可能非常接近。这是默认状态行在ruler
启用时的外观的合理近似:
:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)
Run Code Online (Sandbox Code Playgroud)
主要区别在于行号和列号的定位。如果可以模拟默认间距逻辑,我一直无法想出一种方法来做到这一点。也许这对您的目的来说已经足够接近了。
我使用自己的拆分版本.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%)
Run Code Online (Sandbox Code Playgroud)
该代码不会将任何值设置为空状态字符串,而只是使用一些默认值进行操作。见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
Run Code Online (Sandbox Code Playgroud)
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Run Code Online (Sandbox Code Playgroud)
尽管我建议的解决方案与其他答案没有太大区别,但我想分享更详细的解释。
首先,让我们弄清楚如何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
Run Code Online (Sandbox Code Playgroud)
在哪里
%< - 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
Run Code Online (Sandbox Code Playgroud)
因此, first%<
可以省略,因为默认情况下缓冲区名称在开头被截断。然后,它缺少预览标志 ( %w
)。此外,当窗口小于18 * 2
字符宽度时,右侧部分占据状态行的一半以上。
所以,至少我们可以省略%<
和添加%w
:
:set statusline=%f\ %h%w%m%r%=%-14.(%l,%c%V%)\ %P
Run Code Online (Sandbox Code Playgroud)
我们可以更进一步,确保正确的部分不超过状态行的一半:
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
Run Code Online (Sandbox Code Playgroud)
然后,我们可以把它取决于功能vim
被编译。
if has("quickfix")
...
endif
Run Code Online (Sandbox Code Playgroud)
但我想说这不切实际,以前的解决方案足以满足大多数意图和目的。但是,如果最后一个解决方案对您不起作用,请告诉我哪里出了问题,我会尝试提出更好的解决方案。
Laurence Gonsalves 建议的解决方案的问题是,如果没有标志,则左右部分之间有两个空格:
:set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)
Run Code Online (Sandbox Code Playgroud)