Answers:
就像@muru所说的那样,当设置为渲染它执行无法在设置中指定的操作的代码时,似乎不可能完全模拟默认状态行。但是,可能会很接近。这是启用后默认状态行外观的合理近似值:statusline
statusline
ruler
: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%)
该代码未将任何值设置为空的状态字符串,而只是使用一些默认值进行操作。见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.(%l,%c%V%)
什么意思?
: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%)