Просмотр исходного кода

Heavy cursor handling refactoring

This elegant approach of cursor handling was sponsored by @Osse.

Thanks!
Marco Hinz 12 лет назад
Родитель
Сommit
cbdfa0cd9d
1 измененных файлов с 16 добавлено и 19 удалено
  1. 16 19
      autoload/startify.vim

+ 16 - 19
autoload/startify.vim

@@ -110,7 +110,8 @@ function! startify#insane_in_the_membrane() abort
     call append('$', ['', '   [q]  <quit>'])
   endif
 
-  let s:lastline = line('$')
+  let s:firstline = s:show_special ? s:headoff : (s:headoff + s:secoff)
+  let s:lastline  = line('$')
 
   if exists('g:startify_custom_footer')
     call append('$', g:startify_custom_footer)
@@ -411,26 +412,22 @@ function! s:set_cursor() abort
   let s:oldline = exists('s:newline') ? s:newline : 5
   let s:newline = line('.')
 
-  if !exists('s:firstline')
-    let s:firstline = s:show_special ? s:headoff : (s:headoff + s:secoff)
-  endif
-
-  " 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 < s:firstline   | let s:newline = s:firstline | endif
+  " going up (-1) or down (1)
+  let movement = 2 * (s:newline > s:oldline) - 1
+
+  " skip section headers lines until an entry is found
+  while index(s:section_header_lines, s:newline) != -1
+    let s:newline += movement
+  endwhile
+
+  " skip blank lines between lists
+  if empty(getline(s:newline))
+    let s:newline += movement
   endif
 
+  " don't go beyond first or last entry
+  let s:newline = max([s:firstline, min([s:lastline, s:newline])])
+
   call cursor(s:newline, 5)
 endfunction