From c0dd1c3f058777c68c14870f8a513fabdf0e797b Mon Sep 17 00:00:00 2001 From: Wang Shidong Date: Sun, 19 Jul 2020 23:34:13 +0800 Subject: [PATCH] Fix location list statusline (#3653) --- autoload/SpaceVim/api/vim.vim | 172 ++++++++++--------- autoload/SpaceVim/layers/core/statusline.vim | 37 ++-- 2 files changed, 117 insertions(+), 92 deletions(-) diff --git a/autoload/SpaceVim/api/vim.vim b/autoload/SpaceVim/api/vim.vim index 8871502de..25ee60022 100644 --- a/autoload/SpaceVim/api/vim.vim +++ b/autoload/SpaceVim/api/vim.vim @@ -11,62 +11,62 @@ let s:self = {} let s:CMP = SpaceVim#api#import('vim#compatible') function! s:self.jumps() abort - let result = [] - for jump in split(s:CMP.execute('jumps'), '\n')[1:] - let list = split(jump) - if len(list) < 4 - continue - endif + let result = [] + for jump in split(s:CMP.execute('jumps'), '\n')[1:] + let list = split(jump) + if len(list) < 4 + continue + endif - let [linenr, col, file_text] = [list[1], list[2]+1, join(list[3:])] - let lines = getbufline(file_text, linenr) - let path = file_text - let bufnr = bufnr(file_text) - if empty(lines) - if stridx(join(split(getline(linenr))), file_text) == 0 - let lines = [file_text] - let path = bufname('%') - let bufnr = bufnr('%') - elseif filereadable(path) - let bufnr = 0 - let lines = ['buffer unloaded'] - else - " Skip. - continue - endif - endif + let [linenr, col, file_text] = [list[1], list[2]+1, join(list[3:])] + let lines = getbufline(file_text, linenr) + let path = file_text + let bufnr = bufnr(file_text) + if empty(lines) + if stridx(join(split(getline(linenr))), file_text) == 0 + let lines = [file_text] + let path = bufname('%') + let bufnr = bufnr('%') + elseif filereadable(path) + let bufnr = 0 + let lines = ['buffer unloaded'] + else + " Skip. + continue + endif + endif - if getbufvar(bufnr, '&filetype') ==# 'unite' - " Skip unite buffer. - continue - endif + if getbufvar(bufnr, '&filetype') ==# 'unite' + " Skip unite buffer. + continue + endif - call add(result, [linenr, col, file_text, path, bufnr, lines]) - endfor - return result + call add(result, [linenr, col, file_text, path, bufnr, lines]) + endfor + return result endfunction function! s:self.parse_string(line) abort - let expr = '`[^`]*`' - let i = 0 - let line = [] - while i < strlen(a:line) || i != -1 - let [rst, m, n] = matchstrpos(a:line, expr, i) - if m == -1 - call add(line, a:line[ i : -1 ]) - break - else - call add(line, a:line[ i : m-1]) - try - let rst = eval(rst[1:-2]) - catch - let rst = '' - endtry - call add(line, rst) - endif - let i = n - endwhile - return join(line, '') + let expr = '`[^`]*`' + let i = 0 + let line = [] + while i < strlen(a:line) || i != -1 + let [rst, m, n] = matchstrpos(a:line, expr, i) + if m == -1 + call add(line, a:line[ i : -1 ]) + break + else + call add(line, a:line[ i : m-1]) + try + let rst = eval(rst[1:-2]) + catch + let rst = '' + endtry + call add(line, rst) + endif + let i = n + endwhile + return join(line, '') endfunction @@ -78,44 +78,44 @@ endfunction if exists('*nvim_win_set_cursor') - function! s:self.win_set_cursor(win, pos) abort - call nvim_win_set_cursor(a:win, a:pos) - endfunction + function! s:self.win_set_cursor(win, pos) abort + call nvim_win_set_cursor(a:win, a:pos) + endfunction elseif exists('*win_execute') - function! s:self.win_set_cursor(win, pos) abort - " @fixme use g` to move to cursor line - " this seem to be a bug of vim - " https://github.com/vim/vim/issues/5022 - call win_execute(a:win, ':call cursor(' . a:pos[0] . ', ' . a:pos[1] . ')') - " call win_execute(a:win, ':' . a:pos[0]) - call win_execute(a:win, ':normal! g"') - endfunction + function! s:self.win_set_cursor(win, pos) abort + " @fixme use g` to move to cursor line + " this seem to be a bug of vim + " https://github.com/vim/vim/issues/5022 + call win_execute(a:win, ':call cursor(' . a:pos[0] . ', ' . a:pos[1] . ')') + " call win_execute(a:win, ':' . a:pos[0]) + call win_execute(a:win, ':normal! g"') + endfunction elseif has('lua') - function! s:self.win_set_cursor(win, pos) abort - lua local winindex = vim.eval("win_id2win(a:win) - 1") - lua local w = vim.window(winindex) - lua w.line = vim.eval("a:pos[0]") - lua w.col = vim.eval("a:pos[1]") - endfunction + function! s:self.win_set_cursor(win, pos) abort + lua local winindex = vim.eval("win_id2win(a:win) - 1") + lua local w = vim.window(winindex) + lua w.line = vim.eval("a:pos[0]") + lua w.col = vim.eval("a:pos[1]") + endfunction else - function! s:self.win_set_cursor(win, pos) abort + function! s:self.win_set_cursor(win, pos) abort - endfunction + endfunction endif if exists('*nvim_buf_line_count') - function! s:self.buf_line_count(buf) abort - return nvim_buf_line_count(a:buf) - endfunction + function! s:self.buf_line_count(buf) abort + return nvim_buf_line_count(a:buf) + endfunction elseif has('lua') - function! s:self.buf_line_count(buf) abort - " lua numbers are floats, so use float2nr - return float2nr(luaeval('#vim.buffer(vim.eval("a:buf"))')) - endfunction + function! s:self.buf_line_count(buf) abort + " lua numbers are floats, so use float2nr + return float2nr(luaeval('#vim.buffer(vim.eval("a:buf"))')) + endfunction else - function! s:self.buf_line_count(buf) abort - return len(getbufline(a:buf, 1, '$')) - endfunction + function! s:self.buf_line_count(buf) abort + return len(getbufline(a:buf, 1, '$')) + endfunction endif function! s:self.setbufvar(buf, dict) abort @@ -124,6 +124,16 @@ function! s:self.setbufvar(buf, dict) abort endfor endfunction -function! SpaceVim#api#vim#get() abort - return deepcopy(s:self) +function! s:self.get_qf_winnr() abort + let wins = filter(getwininfo(), 'v:val.quickfix && !v:val.loclist') + " assert(len(wins) <= 1) + return empty(wins) ? 0 : wins[0].winnr +endfunction + +function! s:self.is_qf_win(winnr) abort + return a:winnr ==# self.get_qf_winnr() +endfunction + +function! SpaceVim#api#vim#get() abort + return deepcopy(s:self) endfunction diff --git a/autoload/SpaceVim/layers/core/statusline.vim b/autoload/SpaceVim/layers/core/statusline.vim index dc0cb47bc..df43aa538 100644 --- a/autoload/SpaceVim/layers/core/statusline.vim +++ b/autoload/SpaceVim/layers/core/statusline.vim @@ -27,6 +27,7 @@ let s:STATUSLINE = SpaceVim#api#import('vim#statusline') let s:VIMCOMP = SpaceVim#api#import('vim#compatible') let s:SYSTEM = SpaceVim#api#import('system') let s:ICON = SpaceVim#api#import('unicode#icon') +let s:VIM = SpaceVim#api#import('vim') " init let s:separators = { @@ -366,17 +367,31 @@ function! SpaceVim#layers#core#statusline#get(...) abort \ . '%#SpaceVim_statusline_b#' \ . ' vimfiler %#SpaceVim_statusline_b_SpaceVim_statusline_c#' \ . s:lsep - elseif &filetype ==# 'qf' - return '%#SpaceVim_statusline_ia#' - \ . s:winnr(1) - \ . '%#SpaceVim_statusline_ia_SpaceVim_statusline_b#' . s:lsep - \ . '%#SpaceVim_statusline_b#' - \ . ' QuickFix %#SpaceVim_statusline_b_SpaceVim_statusline_c#' - \ . s:lsep - \ . ( has('patch-8.0.1384') ? ((getqflist({'title' : 0}).title ==# ':setqflist()') ? '' : - \ '%#SpaceVim_statusline_c#' - \ . getqflist({'title' : 0}).title . '%#SpaceVim_statusline_c_SpaceVim_statusline_z#' . s:lsep - \ ) : '') + elseif &filetype ==# 'qf' + if s:VIM.is_qf_win(winnr()) + return '%#SpaceVim_statusline_ia#' + \ . s:winnr(1) + \ . '%#SpaceVim_statusline_ia_SpaceVim_statusline_b#' . s:lsep + \ . '%#SpaceVim_statusline_b#' + \ . ' QuickFix %#SpaceVim_statusline_b_SpaceVim_statusline_c#' + \ . s:lsep + \ . ( has('patch-8.0.1384') ? ((getqflist({'title' : 0}).title ==# ':setqflist()') ? '' : + \ '%#SpaceVim_statusline_c#' + \ . getqflist({'title' : 0}).title . '%#SpaceVim_statusline_c_SpaceVim_statusline_z#' . s:lsep + \ ) : '') + else + return '%#SpaceVim_statusline_ia#' + \ . s:winnr(1) + \ . '%#SpaceVim_statusline_ia_SpaceVim_statusline_b#' . s:lsep + \ . '%#SpaceVim_statusline_b#' + \ . ' Location List %#SpaceVim_statusline_b_SpaceVim_statusline_c#' + \ . s:lsep + \ . ( has('patch-8.0.1384') ? ((getloclist(winnr(),{'title' : 0}).title ==# ':setloclist()') ? '' : + \ '%#SpaceVim_statusline_c#' + \ . getloclist(winnr(),{'title' : 0}).title . '%#SpaceVim_statusline_c_SpaceVim_statusline_z#' . s:lsep + \ ) : '') + + endif elseif &filetype ==# 'defx' return '%#SpaceVim_statusline_ia#' . s:winnr(1) . '%#SpaceVim_statusline_ia_SpaceVim_statusline_b#' . s:lsep \ . '%#SpaceVim_statusline_b# defx %#SpaceVim_statusline_b_SpaceVim_statusline_c#' . s:lsep . ' '