From a99156db53a1c6211a75131774c690c856672381 Mon Sep 17 00:00:00 2001 From: itchyny Date: Sat, 21 Nov 2020 00:23:25 +0900 Subject: [PATCH] improve s:line() --- autoload/lightline.vim | 50 +++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/autoload/lightline.vim b/autoload/lightline.vim index b7f5841..9131dde 100644 --- a/autoload/lightline.vim +++ b/autoload/lightline.vim @@ -2,7 +2,7 @@ " Filename: autoload/lightline.vim " Author: itchyny " License: MIT License -" Last Change: 2020/11/20 21:34:03. +" Last Change: 2020/11/21 00:23:15. " ============================================================================= let s:save_cpo = &cpo @@ -379,6 +379,10 @@ function! s:expand(components) abort return [components, expanded, indices] endfunction +function! s:func(name) abort + return exists('*' . a:name) ? '%{' . a:name . '()}' : '%{exists("*' . a:name . '")?' . a:name . '():""}' +endfunction + function! s:line(tabline, inactive) abort let _ = a:tabline ? '' : '%{lightline#link()}' if s:lightline.palette == {} @@ -388,32 +392,32 @@ function! s:line(tabline, inactive) abort let [p, s] = a:tabline ? [s:lightline.tabline_separator, s:lightline.tabline_subseparator] : [s:lightline.separator, s:lightline.subseparator] let [c, f, t, w] = [s:lightline.component, s:lightline.component_function, s:lightline.component_type, s:lightline.component_raw] let mode = a:tabline ? 'tabline' : a:inactive ? 'inactive' : 'active' - let l_ = has_key(s:lightline, mode) ? s:lightline[mode].left : s:lightline.active.left - let [lt, lc, ll] = s:expand(l_) - let r_ = has_key(s:lightline, mode) ? s:lightline[mode].right : s:lightline.active.right - let [rt, rc, rl] = s:expand(r_) - for i in range(len(lt)) - let _ .= '%#LightlineLeft_' . mode . '_' . ll[i] . '#' - for j in range(len(lt[i])) - let x = lc[i][j] ? lt[i][j] : has_key(f, lt[i][j]) ? (exists('*' . f[lt[i][j]]) ? '%{' . f[lt[i][j]] . '()}' : '%{exists("*' . f[lt[i][j]] . '")?' . f[lt[i][j]] . '():""}') : get(c, lt[i][j], '') - let _ .= has_key(t, lt[i][j]) && t[lt[i][j]] ==# 'raw' || get(w, lt[i][j]) || lc[i][j] ==# 2 || x ==# '' ? x : '%( ' . x . ' %)' - if j < len(lt[i]) - 1 && s.left !=# '' - let _ .= s:subseparator(lt[i][(j):], s.left, lc[i][(j):]) + let ls = has_key(s:lightline, mode) ? s:lightline[mode].left : s:lightline.active.left + let [lc, le, li] = s:expand(ls) + let rs = has_key(s:lightline, mode) ? s:lightline[mode].right : s:lightline.active.right + let [rc, re, ri] = s:expand(rs) + for i in range(len(lc)) + let _ .= '%#LightlineLeft_' . mode . '_' . li[i] . '#' + for j in range(len(lc[i])) + let x = le[i][j] ? lc[i][j] : has_key(f, lc[i][j]) ? s:func(f[lc[i][j]]) : get(c, lc[i][j], '') + let _ .= has_key(t, lc[i][j]) && t[lc[i][j]] ==# 'raw' || get(w, lc[i][j]) || le[i][j] ==# 2 || x ==# '' ? x : '%( ' . x . ' %)' + if j < len(lc[i]) - 1 && s.left !=# '' + let _ .= s:subseparator(lc[i][(j):], s.left, le[i][(j):]) endif endfor - let _ .= '%#LightlineLeft_' . mode . '_' . ll[i] . '_' . ll[i + 1] . '#' - let _ .= i < l + len(lt) - len(l_) && ll[i] < l || ll[i] != ll[i + 1] ? p.left : len(lt[i]) ? s.left : '' + let _ .= '%#LightlineLeft_' . mode . '_' . li[i] . '_' . li[i + 1] . '#' + let _ .= i < l + len(lc) - len(ls) && li[i] < l || li[i] != li[i + 1] ? p.left : len(lc[i]) ? s.left : '' endfor let _ .= '%#LightlineMiddle_' . mode . '#%=' - for i in range(len(rt) - 1, 0, -1) - let _ .= '%#LightlineRight_' . mode . '_' . rl[i] . '_' . rl[i + 1] . '#' - let _ .= i < r + len(rt) - len(r_) && rl[i] < r || rl[i] != rl[i + 1] ? p.right : len(rt[i]) ? s.right : '' - let _ .= '%#LightlineRight_' . mode . '_' . rl[i] . '#' - for j in range(len(rt[i])) - let x = rc[i][j] ? rt[i][j] : has_key(f, rt[i][j]) ? (exists('*' . f[rt[i][j]]) ? '%{' . f[rt[i][j]] . '()}' : '%{exists("*' . f[rt[i][j]] . '")?' . f[rt[i][j]] . '():""}') : get(c, rt[i][j], '') - let _ .= has_key(t, rt[i][j]) && t[rt[i][j]] ==# 'raw' || get(w, rt[i][j]) || rc[i][j] ==# 2 || x ==# '' ? x : '%( ' . x . ' %)' - if j < len(rt[i]) - 1 && s.right !=# '' - let _ .= s:subseparator(rt[i][(j):], s.right, rc[i][(j):]) + for i in range(len(rc) - 1, 0, -1) + let _ .= '%#LightlineRight_' . mode . '_' . ri[i] . '_' . ri[i + 1] . '#' + let _ .= i < r + len(rc) - len(rs) && ri[i] < r || ri[i] != ri[i + 1] ? p.right : len(rc[i]) ? s.right : '' + let _ .= '%#LightlineRight_' . mode . '_' . ri[i] . '#' + for j in range(len(rc[i])) + let x = re[i][j] ? rc[i][j] : has_key(f, rc[i][j]) ? s:func(f[rc[i][j]]) : get(c, rc[i][j], '') + let _ .= has_key(t, rc[i][j]) && t[rc[i][j]] ==# 'raw' || get(w, rc[i][j]) || re[i][j] ==# 2 || x ==# '' ? x : '%( ' . x . ' %)' + if j < len(rc[i]) - 1 && s.right !=# '' + let _ .= s:subseparator(rc[i][(j):], s.right, re[i][(j):]) endif endfor endfor