From 48ed94400fdd9b486bd6f8dcba53622a9390c5a0 Mon Sep 17 00:00:00 2001 From: Marco Hinz Date: Thu, 10 Oct 2013 13:05:50 +0200 Subject: [PATCH 1/4] Add context-sensitive section headers --- autoload/startify.vim | 90 +++++++++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 24 deletions(-) diff --git a/autoload/startify.vim b/autoload/startify.vim index b637fc5..4a7f959 100644 --- a/autoload/startify.vim +++ b/autoload/startify.vim @@ -17,6 +17,21 @@ let s:restore_position = get(g:, 'startify_restore_position') let s:session_dir = resolve(expand(get(g:, 'startify_session_dir', \ has('win32') ? '$HOME\vimfiles\session' : '~/.vim/session'))) +if exists('g:startify_list_order') + let s:lists = g:startify_list_order +else + let s:lists = [ + \ [' Last recently opened files:', ''], + \ 'files', + \ [' Last recently modified files in the current directory:', ''], + \ 'dir', + \ [' My sessions:', ''], + \ 'sessions', + \ [' My bookmarks:', ''], + \ 'bookmarks', + \ ] +endif + " Init: autocmds {{{1 if get(g:, 'startify_session_persistence') @@ -74,8 +89,14 @@ function! startify#insane_in_the_membrane() abort let cnt = 1 endif - for list in get(g:, 'startify_list_order', ['files', 'sessions', 'bookmarks']) - let cnt = s:show_{list}(cnt) + for item in s:lists + if type(item) == 1 + let cnt = s:show_{item}(cnt) + "unlet s: + else + let s:last_message = item + endif + unlet item endfor silent $delete @@ -233,28 +254,33 @@ function! s:show_dir(cnt) abort call add(files, [getftime(fname), fname]) endfor - function! l:compare(x, y) - return a:y[0] - a:x[0] - endfunction - - call sort(files, 'l:compare') - - for items in files - let index = s:get_index_as_string(cnt) - let fname = items[1] - - call append('$', ' ['. index .']'. repeat(' ', (3 - strlen(index))) . fname) - execute 'nnoremap ' index ':edit' fnameescape(fname) '' - - let cnt += 1 - let num -= 1 - - if !num - break - endif - endfor - if !empty(files) + if exists('s:last_message') + call append('$', s:last_message) + unlet s:last_message + endif + + function! l:compare(x, y) + return a:y[0] - a:x[0] + endfunction + + call sort(files, 'l:compare') + + for items in files + let index = s:get_index_as_string(cnt) + let fname = items[1] + + call append('$', ' ['. index .']'. repeat(' ', (3 - strlen(index))) . fname) + execute 'nnoremap ' index ':edit' fnameescape(fname) '' + + let cnt += 1 + let num -= 1 + + if !num + break + endif + endfor + call append('$', '') endif @@ -268,6 +294,11 @@ function! s:show_files(cnt) abort let entries = {} if !empty(v:oldfiles) + if exists('s:last_message') + call append('$', s:last_message) + unlet s:last_message + endif + for fname in v:oldfiles let fullpath = resolve(fnamemodify(fname, ':p')) @@ -305,11 +336,17 @@ function! s:show_sessions(cnt) abort let slen = len(sfiles) if empty(sfiles) + if exists('s:last_message') + unlet s:last_message + endif return a:cnt endif - let cnt = a:cnt + if exists('s:last_message') + call append('$', s:last_message) + endif + for i in range(slen) let idx = (i + cnt) let index = s:get_index_as_string(idx) @@ -328,6 +365,11 @@ function! s:show_bookmarks(cnt) abort let cnt = a:cnt if exists('g:startify_bookmarks') + if exists('s:last_message') + call append('$', s:last_message) + unlet s:last_message + endif + for fname in g:startify_bookmarks let index = s:get_index_as_string(cnt) From b7fe86e492a131a075ff5342e08e7855669bc988 Mon Sep 17 00:00:00 2001 From: Marco Hinz Date: Tue, 22 Oct 2013 13:01:32 +0200 Subject: [PATCH 2/4] Add highlighting for section headers --- autoload/startify.vim | 31 +++++++++++++++++++++++-------- syntax/startify.vim | 1 + 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/autoload/startify.vim b/autoload/startify.vim index 4a7f959..94c05bf 100644 --- a/autoload/startify.vim +++ b/autoload/startify.vim @@ -32,6 +32,8 @@ else \ ] endif +let s:section_header_lines = [] + " Init: autocmds {{{1 if get(g:, 'startify_session_persistence') @@ -92,7 +94,6 @@ function! startify#insane_in_the_membrane() abort for item in s:lists if type(item) == 1 let cnt = s:show_{item}(cnt) - "unlet s: else let s:last_message = item endif @@ -101,6 +102,10 @@ function! startify#insane_in_the_membrane() abort silent $delete + for item in s:section_header_lines + call matchadd('StartifySection', '\%'. item .'l', -1) + endfor + if s:show_special call append('$', ['', ' [q] ']) endif @@ -256,8 +261,7 @@ function! s:show_dir(cnt) abort if !empty(files) if exists('s:last_message') - call append('$', s:last_message) - unlet s:last_message + call s:print_section_header() endif function! l:compare(x, y) @@ -295,8 +299,7 @@ function! s:show_files(cnt) abort if !empty(v:oldfiles) if exists('s:last_message') - call append('$', s:last_message) - unlet s:last_message + call s:print_section_header() endif for fname in v:oldfiles @@ -344,7 +347,7 @@ function! s:show_sessions(cnt) abort let cnt = a:cnt if exists('s:last_message') - call append('$', s:last_message) + call s:print_section_header() endif for i in range(slen) @@ -366,8 +369,7 @@ function! s:show_bookmarks(cnt) abort if exists('g:startify_bookmarks') if exists('s:last_message') - call append('$', s:last_message) - unlet s:last_message + call s:print_section_header() endif for fname in g:startify_bookmarks @@ -578,3 +580,16 @@ function! s:session_write(spath) silent hide endif endfunction + +" Function: s:print_section_header {{{1 +function! s:print_section_header() abort + $ + let curline = line('.') + + for lnum in range(curline, curline + len(s:last_message)) + call add(s:section_header_lines, lnum) + endfor + + call append('$', s:last_message) + unlet s:last_message +endfunction diff --git a/syntax/startify.vim b/syntax/startify.vim index c00f231..96cb7fe 100644 --- a/syntax/startify.vim +++ b/syntax/startify.vim @@ -34,5 +34,6 @@ endif highlight default link StartifyHeader Normal highlight default link StartifyBracket Delimiter highlight default link StartifyNumber Number +highlight default link StartifySection Special let b:current_syntax = 'startify' From fd174b8f2fb09665d343c01918abe9fbe6790c5c Mon Sep 17 00:00:00 2001 From: Marco Hinz Date: Tue, 22 Oct 2013 13:22:36 +0200 Subject: [PATCH 3/4] Make cursor handling work with sections --- autoload/startify.vim | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/autoload/startify.vim b/autoload/startify.vim index 94c05bf..1123649 100644 --- a/autoload/startify.vim +++ b/autoload/startify.vim @@ -32,6 +32,7 @@ else \ ] endif +let s:secoff = type(s:lists[0]) == 3 ? len(s:lists[0]) : 0 let s:section_header_lines = [] " Init: autocmds {{{1 @@ -410,14 +411,20 @@ endfunction function! s:set_cursor() abort let s:oldline = exists('s:newline') ? s:newline : 5 let s:newline = line('.') - let headoff = s:headoff + 2 + let headoff = s:headoff + 2 + s:secoff " going down if s:newline > s:oldline + while index(s:section_header_lines, s:newline) != -1 + let s:newline += 1 + endwhile if empty(getline(s:newline)) | let s:newline += 1 | endif if s:newline > s:lastline | let s:newline = s:lastline | endif " going up elseif s:newline < s:oldline + while index(s:section_header_lines, s:newline) != -1 + let s:newline -= 1 + endwhile if empty(getline(s:newline)) | let s:newline -= 1 | endif if s:newline < headoff | let s:newline = headoff | endif endif From 0968e6669e7f5cec1c0ec762eed1f47f62dad8c1 Mon Sep 17 00:00:00 2001 From: Marco Hinz Date: Tue, 22 Oct 2013 13:36:29 +0200 Subject: [PATCH 4/4] Make section headers easier to customize --- autoload/startify.vim | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/autoload/startify.vim b/autoload/startify.vim index 1123649..0fbb588 100644 --- a/autoload/startify.vim +++ b/autoload/startify.vim @@ -21,18 +21,18 @@ if exists('g:startify_list_order') let s:lists = g:startify_list_order else let s:lists = [ - \ [' Last recently opened files:', ''], + \ [' Last recently opened files:'], \ 'files', - \ [' Last recently modified files in the current directory:', ''], + \ [' Last recently modified files in the current directory:'], \ 'dir', - \ [' My sessions:', ''], + \ [' My sessions:'], \ 'sessions', - \ [' My bookmarks:', ''], + \ [' My bookmarks:'], \ 'bookmarks', \ ] endif -let s:secoff = type(s:lists[0]) == 3 ? len(s:lists[0]) : 0 +let s:secoff = type(s:lists[0]) == 3 ? (len(s:lists[0]) + 1) : 0 let s:section_header_lines = [] " Init: autocmds {{{1 @@ -593,10 +593,10 @@ function! s:print_section_header() abort $ let curline = line('.') - for lnum in range(curline, curline + len(s:last_message)) + for lnum in range(curline, curline + len(s:last_message) + 1) call add(s:section_header_lines, lnum) endfor - call append('$', s:last_message) + call append('$', s:last_message + ['']) unlet s:last_message endfunction