不用 vim-airline, 不用 lightline.vim, 如何使用纯手工制作一个与之媲美的 statusline

2016-12-27 23:13:33 +08:00
 simple26

首先看一下最后的效果:

https://github.com/liuchengxu/space-vim/blob/master/docs/img/statusline.png

知己知彼,百战不殆。先来分析一下使用 airline 与 lightline 有什么好处?

  1. 漂亮,酷炫,这毋庸置疑。
  2. airline 与很多插件集成的非常好,真是省心又省力。

那有什么不足之处呢?

  1. airline 可能会导致 100 ms 的启动延迟。具体可以看这里 https://github.com/liuchengxu/space-vim/issues/24
  2. 定制性依旧不高,或者说深度定制的门槛有点高,不是那么容易上手。我曾经尝试过深入修改过 airline ,不过并不顺利。
  3. 它们所提供的信息可能过于庞杂,显得有些冗余。

那么如何通过纯手工制作一个与 airline/lightline 相比也还不错的 statusline 呢?

什么叫不错?这个因人而异,按照我个人的审美而言,首先不能太单调(我只关心漂不漂亮),其次得显示出一些有用的信息。那么就会涉及到以下一些内容:

为了漂亮,我们可能还会选择添加一些 Unicode 字符进去。

function! Buf_total_num()
    return len(filter(range(1, bufnr('$')), 'buflisted(v:val)'))
endfunction
function! File_size(f)
    let l:size = getfsize(expand(a:f))
    if l:size == 0 || l:size == -1 || l:size == -2
        return ''
    endif
    if l:size < 1024
        return l:size.' bytes'
    elseif l:size < 1024*1024
        return printf('%.1f', l:size/1024.0).'k'
    elseif l:size < 1024*1024*1024
        return printf('%.1f', l:size/1024.0/1024.0) . 'm'
    else
        return printf('%.1f', l:size/1024.0/1024.0/1024.0) . 'g'
    endif
endfunction
set statusline=%<%1*[B-%n]%*
" TOT is an abbreviation for total
set statusline+=%2*[TOT:%{Buf_total_num()}]%*
set statusline+=%3*\ %{File_size(@%)}\ %*
set statusline+=%4*\ %F\ %*
set statusline+=%5*『\ %{exists('g:loaded_ale')?ALEGetStatusLine():''}』%{exists('g:loaded_fugitive')?fugitive#statusline():''}%*
set statusline+=%6*\ %m%r%y\ %*
set statusline+=%=%7*\ %{&ff}\ \|\ %{\"\".(&fenc==\"\"?&enc:&fenc).((exists(\"+bomb\")\ &&\ &bomb)?\",B\":\"\").\"\ \|\"}\ %-14.(%l:%c%V%)%*
set statusline+=%8*\ %P\ %*
" default bg for statusline is 236 in space-vim-dark
hi User1 cterm=bold ctermfg=232 ctermbg=179
hi User2 cterm=None ctermfg=214 ctermbg=242
hi User3 cterm=None ctermfg=251 ctermbg=240
hi User4 cterm=bold ctermfg=169 ctermbg=239
hi User5 cterm=None ctermfg=208 ctermbg=238
hi User6 cterm=None ctermfg=246 ctermbg=237
hi User7 cterm=None ctermfg=250 ctermbg=238
hi User8 cterm=None ctermfg=249 ctermbg=240

简单介绍一下重点:%1*[foo]%*, hi User1 ......, 改变的便是 [foo] 部分的 style, 比如前景色,背景色,粗体等等。如果你也想要尝试自己定制一番,按照个人喜好照葫芦画瓢即可 :p.

顺便介绍一下 space-vim 的 statusline 值得关注的一些部分,[B-1] 代表 buffer 1, 1 为当前 buffer 对应的编号。[TOT 3], TOT 指的是 total, 当前共有多少 buffer ,可以使用 Tab 快速切换。 『 ... 』 这里面显示的是 ale 语法检查的信息。其他部分比较显然,值得关注的点也不多就不介绍了。

末了,说一下上面的缺点:所有 window 的 statusline 都是很相似的,可能不能像 airline/lightline 那样容易区分出哪个是当前光标所在的 window 。 而且跟你的 colorscheme 可能不搭。不过我个人来讲,愿意接受这些不足。

仅仅是分享一个方案,如何选择取决于你自己。

6107 次点击
所在节点    Vim
29 条回复
simple26
2016-12-30 15:25:23 +08:00
@ashfinal 也没那么夸张... spacemacs 我个人的启动时间一般是 5 6 秒

关于 vim 的启动时间 你可以看一下 @chemzqm 给出的链接 相信如果你做不到他那样的优化的话 打开一个 400 行的文件时间通常会超过 500 ms
ashfinal
2016-12-30 17:29:56 +08:00
@simple26 难道有冷热启动之说?我一般刚退出再重启在 3.x s 的样子,但隔段时间启动印象中都是超过 10 s.

vim 刚按照 @chemzqm 提供的方法试了下, 322 ms. 还行吧,没直观感受,懒得优化。

最近得空看看 spacemacs ,挺好的发行版。就是我还什么都没做呢,就看到它启动加载了 207 个包!!!

(˶‾᷄ ⁻̫ ‾᷅˵) 这要配置成完全顺手的,得多长时间呐?愁~ 有空就折腾折腾,没空先用 vim 吧。毕竟我的 .vimrc 文件才 800 行,刨除空行、注释、跨平台适配等一堆,也就 400 行左右?顶多一天就看完了(并完全理解了)。妈呀,还是有空再折腾 spacemacs 吧。●__●
simple26
2016-12-30 17:57:17 +08:00
@ashfinal 100 ms 的差距通常感觉不出来, 300 500 ms 一般就会有所察觉了... 我主要是针对一些影响比较大的插件手动加载,比如 ultisnips 和 YouCompleteMe, 并不依赖插件管理器自动加载。我的方式上面已经给出来了,如果你有更好的方式,一定要告诉我....

哪那么有空.... 难道每天真的就是陪它们玩哈 :p ... spacemacs 能使用就行,深度定制这种事情还是有时间有心再说. 不过我个人的经验来说,就算默认的 spacemacs 也还不错,没什么“尴尬” 之处...., 毕竟有那么人在使用,在完善。
ashfinal
2016-12-30 19:13:25 +08:00
@simple26 我也没有哇 事实上根本没管。统共 26 个插件, 322 ms 。还行的样子?
用的 plug.vim 管理,说是有懒加载。然而我根本没理,一概是“ Plug xxxx/xxx ”。

刚把插件全禁了, 42 ms 。好吧 …… 插件影响还是有的。
不过总体还行,等啥时候插件超过 50 个或者启动超过 1 s 再说了……

spacemacs 挺好的,刚发现 Markdown 文档是支持行内图片预览的。这个好,不用多开预览器了。不过我最近正在转向 reST ,发现竟然不支持(反正还没搞定)。悲剧啊!(易中天脸

得空再看看
simple26
2017-01-12 21:26:41 +08:00
@chemzqm let root = easygit#smartRoot(1) 想请教您这是什么意思?我找了一圈 easygit 没找到 easygit#smartRoot() 的定义...
chemzqm
2017-01-12 21:51:11 +08:00
simple26
2017-01-12 21:56:30 +08:00
@chemzqm 感谢,眼花了.....
livc
2017-12-05 14:56:20 +08:00
> TOT 指的是 total, 当前共有多少 buffer,可以使用 Tab 快速切换。

请问这个 tab 切换是你的 statusline 自带的功能吗,还是自己配?
simple26
2017-12-05 20:53:22 +08:00
@livc 自己配
nnoremap <Tab> :bn<CR>
nnoremap <S-Tab> :bp<CR>

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/330610

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX