Skip to content

Commit

Permalink
Version 2.1
Browse files Browse the repository at this point in the history
- Cache inexistent patterns (experimental)
- s:EditWrapper: Don't escape ' '.
- FIX: VikiMode(): Error message about b:did_ftplugin not being defined
- FIX: Check if g:netrw_browsex_viewer is defined (thanks to Erik Olsson for pointing this and some other problems out)
- ftplugin/viki.vim: FIX: Problem with heading in the last line. Disabled vikiFolds type 's'
- Always check the current line for inexistent links when re-entering a viki buffer
  • Loading branch information
tomtom authored and vim-scripts committed Nov 14, 2010
1 parent ca4c231 commit 36036d6
Show file tree
Hide file tree
Showing 6 changed files with 751 additions and 482 deletions.
9 changes: 6 additions & 3 deletions autoload/viki.vim
Expand Up @@ -3,8 +3,8 @@
" @Website: http://www.vim.org/account/profile.php?user_id=4037
" @License: GPL (see http://www.gnu.org/licenses/gpl.txt)
" @Created: 2007-03-25.
" @Last Change: 2007-05-12.
" @Revision: 0.162
" @Last Change: 2007-06-02.
" @Revision: 0.165

if &cp || exists("loaded_viki_auto")
finish
Expand Down Expand Up @@ -115,6 +115,7 @@ endf
fun! viki#VikiDirListing(lhs, lhb, indent)
let args = s:GetRegionArgs(a:lhs, a:lhb - 1)
let patt = get(args, 'glob', '')
" TLogVAR patt
if empty(patt)
echoerr 'Viki: No glob pattern defnied: '. string(args)
else
Expand All @@ -124,7 +125,9 @@ fun! viki#VikiDirListing(lhs, lhb, indent)
" let style = get(args, 'style', 'ls')
" let ls = VikiGetDirListing_{style}(split(glob(patt), '\n'))
let ls = split(glob(patt), '\n')
" TLogVAR ls
let types = get(args, 'types', '')
" TLogVAR ls
if !empty(types)
let show_files = stridx(types, 'f') != -1
let show_dirs = stridx(types, 'd') != -1
Expand Down Expand Up @@ -234,7 +237,7 @@ fun! s:GetRegionArgs(ls, le)
let args[key] = substitute(val, '\\\(.\)', '\1', 'g')
else
let key = m[8]
if key = '^no\u'
if key == '^no\u'
let antikey = substitute(key, '^no\zs.', '\l&', '')
else
let antikey = 'no'. substitute(key, '^.', '\u&', '')
Expand Down
312 changes: 170 additions & 142 deletions ftplugin/viki.vim
Expand Up @@ -2,8 +2,8 @@
" @Author: Thomas Link (samul AT web.de)
" @License: GPL (see http://www.gnu.org/licenses/gpl.txt)
" @Created: 12-Jän-2004.
" @Last Change: 2007-04-10.
" @Revision: 216
" @Last Change: 2007-06-24.
" @Revision: 266

" if !g:vikiEnabled
" finish
Expand Down Expand Up @@ -67,156 +67,184 @@ let b:undo_ftplugin = 'setlocal iskeyword< expandtab< foldtext< foldexpr< foldme

let b:vikiEnabled = 2

if !exists('*VikiFoldLevel')

function VikiFoldText()
let line = getline(v:foldstart)
if synIDattr(synID(v:foldstart, 1, 1), 'name') =~ '^vikiFiles'
let line = fnamemodify(viki#VikiFilesGetFilename(line), ':h')
else
let line = matchstr(line, '^\s*\zs.*$')
endif
return v:folddashes . line
endf

fun! VikiFoldLevel(lnum)
let lc = getpos('.')
let w0 = line('w0')
let lr = &lazyredraw
set lazyredraw
try
let vikiFolds = exists('b:vikiFolds') ? b:vikiFolds : g:vikiFolds
if vikiFolds == 'ALL'
let vikiFolds = 'hHlsfb'
elseif vikiFolds == 'DEFAULT'
let vikiFolds = 'hf'
elseif vikiFolds == ''
return
if exists('*VikiFoldLevel')
finish
endif

function! VikiFoldText()
let line = getline(v:foldstart)
if synIDattr(synID(v:foldstart, 1, 1), 'name') =~ '^vikiFiles'
let line = fnamemodify(viki#VikiFilesGetFilename(line), ':h')
else
let line = matchstr(line, '^\s*\zs.*$')
endif
return v:folddashes . line
endf

function! VikiFoldLevel(lnum)
let lc = getpos('.')
" TLogVAR lc
let w0 = line('w0')
let lr = &lazyredraw
set lazyredraw
try
let vikiFolds = tlib#GetValue('vikiFolds', 'bg')
if vikiFolds == 'ALL'
let vikiFolds = 'hHlsfb'
elseif vikiFolds == 'DEFAULT'
let vikiFolds = 'hf'
elseif vikiFolds == ''
" TLogDBG 'no folds'
return
endif
if vikiFolds =~# 'f'
let idt = indent(a:lnum)
if synIDattr(synID(a:lnum, idt, 1), 'name') =~ '^vikiFiles'
call s:SetHeadingMaxLevel(1)
" TLogDBG 'vikiFiles: '. idt
return b:vikiHeadingMaxLevel + idt / &shiftwidth
endif
if vikiFolds =~# 'f'
let idt = indent(a:lnum)
if synIDattr(synID(a:lnum, idt, 1), 'name') =~ '^vikiFiles'
call s:SetHeadingMaxLevel(1)
return b:vikiHeadingMaxLevel + idt / &shiftwidth
endif
if stridx(vikiFolds, 'h') >= 0
if vikiFolds =~? 'h'
let fl = s:ScanHeading(a:lnum, a:lnum, vikiFolds)
if fl != ''
" TLogDBG 'heading: '. fl
return fl
endif
endif
if stridx(vikiFolds, 'h') >= 0
if vikiFolds =~? 'h'
let fl = <SID>ScanHeading(a:lnum, a:lnum, vikiFolds)
if vikiFolds =~# 'l'
let list = s:MatchList(a:lnum)
if list > 0
call s:SetHeadingMaxLevel(1)
" TLogVAR list
" return '>'. (b:vikiHeadingMaxLevel + (list / &sw))
return (b:vikiHeadingMaxLevel + (list / &sw))
elseif getline(a:lnum) !~ '^[[:blank:]]' && s:MatchList(a:lnum - 1) > 0
let fl = s:ScanHeading(a:lnum - 1, 1, vikiFolds)
if fl != ''
return fl
endif
endif
if vikiFolds =~# 'l'
let list = <SID>MatchList(a:lnum)
if list > 0
call s:SetHeadingMaxLevel(1)
" return '>'. (b:vikiHeadingMaxLevel + (list / &sw))
return (b:vikiHeadingMaxLevel + (list / &sw))
elseif getline(a:lnum) !~ '^[[:blank:]]' && <SID>MatchList(a:lnum - 1) > 0
let fl = <SID>ScanHeading(a:lnum - 1, 1, vikiFolds)
if fl != ''
if fl[0] == '>'
let fl = strpart(fl, 1)
endif
return '<'. (fl + 1)
endif
endif
endif
if vikiFolds =~# 's'
if exists('b:vikiFoldDef')
exec b:vikiFoldDef
if vikiFoldLine == a:lnum
return vikiFoldLevel
if fl[0] == '>'
let fl = strpart(fl, 1)
endif
" TLogDBG 'list indent: '. fl
return '<'. (fl + 1)
endif
let i = 1
while i > a:lnum
let vfl = VikiFoldLevel(a:lnum - i)
if vfl[0] == '>'
let b:vikiFoldDef = 'let vikiFoldLine='. a:lnum
\ .'|let vikiFoldLevel="'. vfl .'"'
return vfl
elseif vfl == '='
let i = i + 1
endif
endwh
endif
call s:SetHeadingMaxLevel(1)
" if b:vikiHeadingMaxLevel == 0
" return 0
" elseif vikiFolds =~# 'b'
if vikiFolds =~# 'b'
let bl = exists('b:vikiFoldBodyLevel') ? b:vikiFoldBodyLevel : g:vikiFoldBodyLevel
if bl > 0
return bl
else
return b:vikiHeadingMaxLevel + 1
endif
else
return "="
endif
endif
return 0
finally
exec 'norm! '. w0 .'zt'
call setpos('.', lc)
let &lazyredraw = lr
endtry
endfun

fun! <SID>ScanHeading(lnum, top, vikiFolds)
let lnum = a:lnum
while lnum >= a:top
let head = <SID>MatchHead(lnum)
if head > 0
if head > b:vikiHeadingMaxLevel
let b:vikiHeadingMaxLevel = head
endif
if b:vikiInverseFold || a:vikiFolds =~# 'H'
if b:vikiMaxFoldLevel > head
return ">". (b:vikiMaxFoldLevel - head)
else
return ">0"
end
" I have no idea what this is about
" if vikiFolds =~# 's'
" if exists('b:vikiFoldDef')
" exec b:vikiFoldDef
" if vikiFoldLine == a:lnum
" return vikiFoldLevel
" endif
" endif
" let i = 1
" while i > a:lnum
" let vfl = VikiFoldLevel(a:lnum - i)
" if vfl[0] == '>'
" let b:vikiFoldDef = 'let vikiFoldLine='. a:lnum
" \ .'|let vikiFoldLevel="'. vfl .'"'
" return vfl
" elseif vfl == '='
" let i = i + 1
" endif
" endwh
" endif
call s:SetHeadingMaxLevel(1)
" if b:vikiHeadingMaxLevel == 0
" return 0
" elseif vikiFolds =~# 'b'
if vikiFolds =~# 'b'
let bl = exists('b:vikiFoldBodyLevel') ? b:vikiFoldBodyLevel : g:vikiFoldBodyLevel
if bl > 0
" TLogDBG 'body: '. bl
return bl
else
return ">". head
" TLogDBG 'body fallback: '. b:vikiHeadingMaxLevel
return b:vikiHeadingMaxLevel + 1
endif
else
" TLogDBG 'else'
return "="
endif
let lnum = lnum - 1
endwh
return ''
endf

fun! s:SetHeadingMaxLevel(once)
if a:once && b:vikiHeadingMaxLevel != 0
return
endif
let p = getpos('.')
try
let rx = '\V\^'. b:vikiHeadingStart .'\+\ze\s\+'
norm! gg0
while search(rx, 'Wc')
let m = <SID>MatchHead(line('.'))
if m > b:vikiHeadingMaxLevel
let let b:vikiHeadingMaxLevel = m
endif
norm! j
endwh
finally
call setpos('.', p)
endtry
endf

fun! <SID>MatchHead(lnum)
" let head = matchend(getline(a:lnum), '\V\^'. escape(b:vikiHeadingStart, '\') .'\ze\s\+')
return matchend(getline(a:lnum), '\V\^'. b:vikiHeadingStart .'\+\ze\s\+')
endf

fun! <SID>MatchList(lnum)
let rx = '^[[:blank:]]\+\ze\(#[A-F]\d\?\|#\d[A-F]\?\|[-+*#?@]\|[0-9#]\+\.\|[a-zA-Z?]\.\|.\{-1,}[[:blank:]]::\)[[:blank:]]'
return matchend(getline(a:lnum), rx)
endf

endif
" TLogDBG 'zero'
return 0
finally
exec 'norm! '. w0 .'zt'
" TLogVAR lc
call setpos('.', lc)
let &lazyredraw = lr
endtry
endfun

function! s:ScanHeading(lnum, top, vikiFolds)
" TLogVAR a:lnum, a:top
let [lhead, head] = s:SearchHead(a:lnum, a:top)
" TLogVAR head
if head > 0
if head > b:vikiHeadingMaxLevel
let b:vikiHeadingMaxLevel = head
endif
if b:vikiInverseFold || a:vikiFolds =~# 'H'
if b:vikiMaxFoldLevel > head
return ">". (b:vikiMaxFoldLevel - head)
else
return ">0"
end
else
return ">". head
endif
endif
return ''
endf

function! s:SetHeadingMaxLevel(once)
if a:once && b:vikiHeadingMaxLevel != 0
return
endif
let pos = getpos('.')
" TLogVAR pos
try
silent! keepjumps exec 'g/\V\^'. b:vikiHeadingStart .'\+\s/call s:SetHeadingMaxLevelAtCurrentLine(line(".")'
finally
" TLogVAR pos
call setpos('.', pos)
endtry
endf

function! s:SetHeadingMaxLevelAtCurrentLine(lnum) "{{{3
let m = s:MatchHead(lnum)
if m > b:vikiHeadingMaxLevel
let b:vikiHeadingMaxLevel = m
endif
endf

function! s:SearchHead(lnum, top)
let pos = getpos('.')
" TLogVAR pos
try
exec a:lnum
norm! $
let ln = search('\V\^'. b:vikiHeadingStart .'\+\s', 'bWcs', a:top)
if ln
return [ln, s:MatchHead(ln)]
endif
return [0, 0]
finally
" TLogVAR pos
call setpos('.', pos)
endtry
endf

function! s:MatchHead(lnum)
" let head = matchend(getline(a:lnum), '\V\^'. escape(b:vikiHeadingStart, '\') .'\ze\s\+')
return matchend(getline(a:lnum), '\V\^'. b:vikiHeadingStart .'\+\ze\s')
endf

function! s:MatchList(lnum)
let rx = '^[[:blank:]]\+\ze\(#[A-F]\d\?\|#\d[A-F]\?\|[-+*#?@]\|[0-9#]\+\.\|[a-zA-Z?]\.\|.\{-1,}[[:blank:]]::\)[[:blank:]]'
return matchend(getline(a:lnum), rx)
endf

0 comments on commit 36036d6

Please sign in to comment.