2010-05-12 02:00:00 +02:00
|
|
|
" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79
|
2010-01-20 01:00:00 +01:00
|
|
|
" Vimwiki autoload plugin file
|
|
|
|
" Author: Maxim Kim <habamax@gmail.com>
|
|
|
|
" Home: http://code.google.com/p/vimwiki/
|
|
|
|
|
|
|
|
if exists("g:loaded_vimwiki_auto") || &cp
|
|
|
|
finish
|
|
|
|
endif
|
|
|
|
let g:loaded_vimwiki_auto = 1
|
|
|
|
|
|
|
|
if has("win32")
|
|
|
|
let s:os_sep = '\'
|
|
|
|
else
|
|
|
|
let s:os_sep = '/'
|
|
|
|
endif
|
|
|
|
|
|
|
|
let s:badsymbols = '['.g:vimwiki_badsyms.g:vimwiki_stripsym.'<>|?*:"]'
|
|
|
|
|
|
|
|
" MISC helper functions {{{
|
|
|
|
|
2010-05-12 02:00:00 +02:00
|
|
|
function! vimwiki#chomp_slash(str) "{{{
|
2010-01-20 01:00:00 +01:00
|
|
|
return substitute(a:str, '[/\\]\+$', '', '')
|
|
|
|
endfunction "}}}
|
|
|
|
|
|
|
|
function! vimwiki#mkdir(path) "{{{
|
|
|
|
let path = expand(a:path)
|
|
|
|
if !isdirectory(path) && exists("*mkdir")
|
2010-05-12 02:00:00 +02:00
|
|
|
let path = vimwiki#chomp_slash(path)
|
2010-02-23 01:00:00 +01:00
|
|
|
if s:is_windows() && !empty(g:vimwiki_w32_dir_enc)
|
|
|
|
let path = iconv(path, &enc, g:vimwiki_w32_dir_enc)
|
|
|
|
endif
|
2010-01-20 01:00:00 +01:00
|
|
|
call mkdir(path, "p")
|
|
|
|
endif
|
|
|
|
endfunction
|
|
|
|
" }}}
|
|
|
|
|
|
|
|
function! vimwiki#safe_link(string) "{{{
|
|
|
|
return substitute(a:string, s:badsymbols, g:vimwiki_stripsym, 'g')
|
|
|
|
endfunction
|
|
|
|
"}}}
|
|
|
|
|
|
|
|
function! vimwiki#unsafe_link(string) "{{{
|
|
|
|
return substitute(a:string, g:vimwiki_stripsym, s:badsymbols, 'g')
|
|
|
|
endfunction
|
|
|
|
"}}}
|
|
|
|
|
|
|
|
function! vimwiki#subdir(path, filename)"{{{
|
|
|
|
let path = expand(a:path)
|
|
|
|
let filename = expand(a:filename)
|
|
|
|
let idx = 0
|
2010-05-12 02:00:00 +02:00
|
|
|
while path[idx] ==? filename[idx]
|
2010-01-20 01:00:00 +01:00
|
|
|
let idx = idx + 1
|
|
|
|
endwhile
|
|
|
|
|
|
|
|
let p = split(strpart(filename, idx), '[/\\]')
|
|
|
|
let res = join(p[:-2], s:os_sep)
|
|
|
|
if len(res) > 0
|
|
|
|
let res = res.s:os_sep
|
|
|
|
endif
|
|
|
|
return res
|
|
|
|
endfunction"}}}
|
|
|
|
|
|
|
|
function! vimwiki#current_subdir()"{{{
|
|
|
|
return vimwiki#subdir(VimwikiGet('path'), expand('%:p'))
|
|
|
|
endfunction"}}}
|
|
|
|
|
2010-02-23 01:00:00 +01:00
|
|
|
function! vimwiki#open_link(cmd, link, ...) "{{{
|
2010-08-24 02:00:00 +02:00
|
|
|
if vimwiki#is_non_wiki_link(a:link)
|
2010-02-23 01:00:00 +01:00
|
|
|
call s:edit_file(a:cmd, a:link)
|
|
|
|
else
|
|
|
|
if a:0
|
|
|
|
let vimwiki_prev_link = [a:1, []]
|
|
|
|
elseif &ft == 'vimwiki'
|
|
|
|
let vimwiki_prev_link = [expand('%:p'), getpos('.')]
|
|
|
|
endif
|
|
|
|
|
2010-05-12 02:00:00 +02:00
|
|
|
if vimwiki#is_link_to_dir(a:link)
|
|
|
|
if g:vimwiki_dir_link == ''
|
|
|
|
call s:edit_file(a:cmd, VimwikiGet('path').a:link)
|
|
|
|
else
|
|
|
|
call s:edit_file(a:cmd,
|
|
|
|
\ VimwikiGet('path').a:link.
|
|
|
|
\ g:vimwiki_dir_link.
|
|
|
|
\ VimwikiGet('ext'))
|
|
|
|
endif
|
|
|
|
else
|
|
|
|
call s:edit_file(a:cmd, VimwikiGet('path').a:link.VimwikiGet('ext'))
|
|
|
|
endif
|
2010-02-23 01:00:00 +01:00
|
|
|
|
|
|
|
if exists('vimwiki_prev_link')
|
|
|
|
let b:vimwiki_prev_link = vimwiki_prev_link
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
endfunction
|
|
|
|
" }}}
|
|
|
|
|
2010-05-12 02:00:00 +02:00
|
|
|
function! vimwiki#select(wnum)"{{{
|
|
|
|
if a:wnum < 1 || a:wnum > len(g:vimwiki_list)
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
if &ft == 'vimwiki'
|
|
|
|
let b:vimwiki_idx = g:vimwiki_current_idx
|
|
|
|
endif
|
|
|
|
let g:vimwiki_current_idx = a:wnum - 1
|
|
|
|
endfunction
|
|
|
|
" }}}
|
|
|
|
|
|
|
|
function! vimwiki#generate_links()"{{{
|
|
|
|
let links = s:get_links('*'.VimwikiGet('ext'))
|
|
|
|
|
|
|
|
" We don't want link to itself.
|
|
|
|
let cur_link = expand('%:t:r')
|
|
|
|
call filter(links, 'v:val != cur_link')
|
|
|
|
|
|
|
|
if len(links)
|
|
|
|
call append(line('$'), '= Generated Links =')
|
|
|
|
endif
|
|
|
|
|
|
|
|
call sort(links)
|
|
|
|
|
|
|
|
for link in links
|
|
|
|
if s:is_wiki_word(link)
|
|
|
|
call append(line('$'), '- '.link)
|
|
|
|
else
|
|
|
|
call append(line('$'), '- [['.link.']]')
|
|
|
|
endif
|
|
|
|
endfor
|
|
|
|
endfunction " }}}
|
|
|
|
|
2010-08-24 02:00:00 +02:00
|
|
|
function! vimwiki#goto(key) "{{{
|
|
|
|
call s:edit_file(':e',
|
|
|
|
\ VimwikiGet('path').
|
|
|
|
\ a:key.
|
|
|
|
\ VimwikiGet('ext'))
|
|
|
|
endfunction "}}}
|
|
|
|
|
2010-05-12 02:00:00 +02:00
|
|
|
function! s:is_windows() "{{{
|
|
|
|
return has("win32") || has("win64") || has("win95") || has("win16")
|
|
|
|
endfunction "}}}
|
|
|
|
|
|
|
|
function! s:get_links(pat) "{{{
|
|
|
|
" search all wiki files in 'path' and its subdirs.
|
|
|
|
let subdir = vimwiki#current_subdir()
|
|
|
|
|
2010-08-24 02:00:00 +02:00
|
|
|
" if current wiki is temporary -- was added by an arbitrary wiki file then do
|
|
|
|
" not search wiki files in subdirectories. Or it would hang the system if
|
|
|
|
" wiki file was created in $HOME or C:/ dirs.
|
|
|
|
if VimwikiGet('temp')
|
|
|
|
let search_dirs = ''
|
|
|
|
else
|
|
|
|
let search_dirs = '**/'
|
|
|
|
endif
|
|
|
|
let globlinks = glob(VimwikiGet('path').subdir.search_dirs.a:pat)
|
2010-05-12 02:00:00 +02:00
|
|
|
|
2010-08-24 02:00:00 +02:00
|
|
|
" remove extensions (and backup extensions too: .wiki~)
|
|
|
|
let globlinks = substitute(globlinks, '\'.VimwikiGet('ext').'\~\?', "", "g")
|
|
|
|
let links = split(globlinks, '\n')
|
2010-05-12 02:00:00 +02:00
|
|
|
|
|
|
|
" remove paths
|
|
|
|
let rem_path = escape(expand(VimwikiGet('path')).subdir, '\')
|
|
|
|
call map(links, 'substitute(v:val, rem_path, "", "g")')
|
|
|
|
|
|
|
|
" Remove trailing slashes.
|
|
|
|
call map(links, 'substitute(v:val, "[/\\\\]*$", "", "g")')
|
|
|
|
|
|
|
|
return links
|
|
|
|
endfunction "}}}
|
|
|
|
|
|
|
|
" Builtin cursor doesn't work right with unicode characters.
|
|
|
|
function! s:cursor(lnum, cnum) "{{{
|
|
|
|
exe a:lnum
|
|
|
|
exe 'normal! 0'.a:cnum.'|'
|
|
|
|
endfunction "}}}
|
|
|
|
|
2010-01-20 01:00:00 +01:00
|
|
|
function! s:filename(link) "{{{
|
|
|
|
let result = vimwiki#safe_link(a:link)
|
|
|
|
if a:link =~ '|'
|
|
|
|
let result = vimwiki#safe_link(split(a:link, '|')[0])
|
|
|
|
elseif a:link =~ ']['
|
|
|
|
let result = vimwiki#safe_link(split(a:link, '][')[0])
|
|
|
|
endif
|
|
|
|
return result
|
|
|
|
endfunction
|
|
|
|
" }}}
|
|
|
|
|
|
|
|
function! s:is_wiki_word(str) "{{{
|
2010-05-12 02:00:00 +02:00
|
|
|
if a:str =~ g:vimwiki_rxWikiWord && a:str !~ '[[:space:]\\/]'
|
2010-01-20 01:00:00 +01:00
|
|
|
return 1
|
|
|
|
endif
|
|
|
|
return 0
|
|
|
|
endfunction
|
|
|
|
" }}}
|
|
|
|
|
|
|
|
function! s:edit_file(command, filename) "{{{
|
|
|
|
let fname = escape(a:filename, '% ')
|
|
|
|
call vimwiki#mkdir(fnamemodify(a:filename, ":p:h"))
|
|
|
|
execute a:command.' '.fname
|
|
|
|
endfunction
|
|
|
|
" }}}
|
|
|
|
|
|
|
|
function! s:search_word(wikiRx, cmd) "{{{
|
|
|
|
let match_line = search(a:wikiRx, 's'.a:cmd)
|
|
|
|
if match_line == 0
|
|
|
|
echomsg "vimwiki: Wiki link not found."
|
|
|
|
endif
|
|
|
|
endfunction
|
|
|
|
" }}}
|
|
|
|
|
|
|
|
function! s:get_word_at_cursor(wikiRX) "{{{
|
|
|
|
let col = col('.') - 1
|
|
|
|
let line = getline('.')
|
|
|
|
let ebeg = -1
|
|
|
|
let cont = match(line, a:wikiRX, 0)
|
|
|
|
while (ebeg >= 0 || (0 <= cont) && (cont <= col))
|
|
|
|
let contn = matchend(line, a:wikiRX, cont)
|
|
|
|
if (cont <= col) && (col < contn)
|
|
|
|
let ebeg = match(line, a:wikiRX, cont)
|
|
|
|
let elen = contn - ebeg
|
|
|
|
break
|
|
|
|
else
|
|
|
|
let cont = match(line, a:wikiRX, contn)
|
|
|
|
endif
|
|
|
|
endwh
|
|
|
|
if ebeg >= 0
|
|
|
|
return strpart(line, ebeg, elen)
|
|
|
|
else
|
|
|
|
return ""
|
|
|
|
endif
|
|
|
|
endf "}}}
|
|
|
|
|
|
|
|
function! s:strip_word(word) "{{{
|
|
|
|
let result = a:word
|
|
|
|
if strpart(a:word, 0, 2) == "[["
|
|
|
|
" get rid of [[ and ]]
|
|
|
|
let w = strpart(a:word, 2, strlen(a:word)-4)
|
|
|
|
|
|
|
|
if w =~ '|'
|
|
|
|
" we want "link" from [[link|link desc]]
|
|
|
|
let w = split(w, "|")[0]
|
|
|
|
elseif w =~ ']['
|
|
|
|
" we want "link" from [[link][link desc]]
|
|
|
|
let w = split(w, "][")[0]
|
|
|
|
endif
|
|
|
|
|
|
|
|
let result = vimwiki#safe_link(w)
|
|
|
|
endif
|
|
|
|
return result
|
|
|
|
endfunction
|
|
|
|
" }}}
|
|
|
|
|
2010-08-24 02:00:00 +02:00
|
|
|
function! vimwiki#is_non_wiki_link(lnk) "{{{
|
|
|
|
let exts = '.\+\.\%('.
|
|
|
|
\ join(split(g:vimwiki_file_exts, '\s*,\s*'), '\|').
|
|
|
|
\ '\)$'
|
|
|
|
if a:lnk =~ exts
|
2010-05-12 02:00:00 +02:00
|
|
|
return 1
|
|
|
|
endif
|
|
|
|
return 0
|
2010-08-24 02:00:00 +02:00
|
|
|
endfunction "}}}
|
2010-05-12 02:00:00 +02:00
|
|
|
|
|
|
|
function! vimwiki#is_link_to_dir(link) "{{{
|
|
|
|
" Check if link is to a directory.
|
|
|
|
" It should be ended with \ or /.
|
|
|
|
if a:link =~ '.\+[/\\]$'
|
2010-01-20 01:00:00 +01:00
|
|
|
return 1
|
|
|
|
endif
|
|
|
|
return 0
|
2010-08-24 02:00:00 +02:00
|
|
|
endfunction " }}}
|
2010-01-20 01:00:00 +01:00
|
|
|
|
|
|
|
function! s:print_wiki_list() "{{{
|
|
|
|
let idx = 0
|
|
|
|
while idx < len(g:vimwiki_list)
|
|
|
|
if idx == g:vimwiki_current_idx
|
|
|
|
let sep = ' * '
|
|
|
|
echohl PmenuSel
|
|
|
|
else
|
|
|
|
let sep = ' '
|
|
|
|
echohl None
|
|
|
|
endif
|
|
|
|
echo (idx + 1).sep.VimwikiGet('path', idx)
|
|
|
|
let idx += 1
|
|
|
|
endwhile
|
|
|
|
echohl None
|
|
|
|
endfunction
|
|
|
|
" }}}
|
|
|
|
|
|
|
|
function! s:update_wiki_link(fname, old, new) " {{{
|
|
|
|
echo "Updating links in ".a:fname
|
|
|
|
let has_updates = 0
|
|
|
|
let dest = []
|
|
|
|
for line in readfile(a:fname)
|
|
|
|
if !has_updates && match(line, a:old) != -1
|
|
|
|
let has_updates = 1
|
|
|
|
endif
|
|
|
|
call add(dest, substitute(line, a:old, escape(a:new, "&"), "g"))
|
|
|
|
endfor
|
|
|
|
" add exception handling...
|
|
|
|
if has_updates
|
|
|
|
call rename(a:fname, a:fname.'#vimwiki_upd#')
|
|
|
|
call writefile(dest, a:fname)
|
|
|
|
call delete(a:fname.'#vimwiki_upd#')
|
|
|
|
endif
|
|
|
|
endfunction
|
|
|
|
" }}}
|
|
|
|
|
|
|
|
function! s:update_wiki_links_dir(dir, old_fname, new_fname) " {{{
|
|
|
|
let old_fname = substitute(a:old_fname, '[/\\]', '[/\\\\]', 'g')
|
|
|
|
let new_fname = a:new_fname
|
2010-08-24 02:00:00 +02:00
|
|
|
let old_fname_r = old_fname
|
|
|
|
let new_fname_r = new_fname
|
2010-01-20 01:00:00 +01:00
|
|
|
|
2010-08-24 02:00:00 +02:00
|
|
|
if !s:is_wiki_word(new_fname) && s:is_wiki_word(old_fname)
|
|
|
|
let new_fname_r = '[['.new_fname.']]'
|
2010-01-20 01:00:00 +01:00
|
|
|
endif
|
2010-08-24 02:00:00 +02:00
|
|
|
|
2010-01-20 01:00:00 +01:00
|
|
|
if !s:is_wiki_word(old_fname)
|
2010-08-24 02:00:00 +02:00
|
|
|
let old_fname_r = '\[\[\zs'.vimwiki#unsafe_link(old_fname).
|
|
|
|
\ '\ze\%(|.*\)\?\%(\]\[.*\)\?\]\]'
|
2010-01-20 01:00:00 +01:00
|
|
|
else
|
2010-08-24 02:00:00 +02:00
|
|
|
let old_fname_r = '\<'.old_fname.'\>'
|
2010-01-20 01:00:00 +01:00
|
|
|
endif
|
2010-08-24 02:00:00 +02:00
|
|
|
|
2010-01-20 01:00:00 +01:00
|
|
|
let files = split(glob(VimwikiGet('path').a:dir.'*'.VimwikiGet('ext')), '\n')
|
|
|
|
for fname in files
|
2010-08-24 02:00:00 +02:00
|
|
|
call s:update_wiki_link(fname, old_fname_r, new_fname_r)
|
2010-01-20 01:00:00 +01:00
|
|
|
endfor
|
|
|
|
endfunction
|
|
|
|
" }}}
|
|
|
|
|
|
|
|
function! s:tail_name(fname) "{{{
|
|
|
|
let result = substitute(a:fname, ":", "__colon__", "g")
|
|
|
|
let result = fnamemodify(result, ":t:r")
|
|
|
|
let result = substitute(result, "__colon__", ":", "g")
|
|
|
|
return result
|
|
|
|
endfunction "}}}
|
|
|
|
|
|
|
|
function! s:update_wiki_links(old_fname, new_fname) " {{{
|
|
|
|
let old_fname = s:tail_name(a:old_fname)
|
|
|
|
let new_fname = s:tail_name(a:new_fname)
|
|
|
|
|
|
|
|
let subdirs = split(a:old_fname, '[/\\]')[: -2]
|
|
|
|
|
|
|
|
" TODO: Use Dictionary here...
|
|
|
|
let dirs_keys = ['']
|
|
|
|
let dirs_vals = ['']
|
|
|
|
if len(subdirs) > 0
|
|
|
|
let dirs_keys = ['']
|
|
|
|
let dirs_vals = [join(subdirs, '/').'/']
|
|
|
|
let idx = 0
|
|
|
|
while idx < len(subdirs) - 1
|
|
|
|
call add(dirs_keys, join(subdirs[: idx], '/').'/')
|
|
|
|
call add(dirs_vals, join(subdirs[idx+1 :], '/').'/')
|
|
|
|
let idx = idx + 1
|
|
|
|
endwhile
|
|
|
|
call add(dirs_keys,join(subdirs, '/').'/')
|
|
|
|
call add(dirs_vals, '')
|
|
|
|
endif
|
|
|
|
|
|
|
|
let idx = 0
|
|
|
|
while idx < len(dirs_keys)
|
|
|
|
let dir = dirs_keys[idx]
|
|
|
|
let new_dir = dirs_vals[idx]
|
|
|
|
call s:update_wiki_links_dir(dir,
|
|
|
|
\ new_dir.old_fname, new_dir.new_fname)
|
|
|
|
let idx = idx + 1
|
|
|
|
endwhile
|
2010-08-24 02:00:00 +02:00
|
|
|
endfunction " }}}
|
2010-01-20 01:00:00 +01:00
|
|
|
|
|
|
|
function! s:get_wiki_buffers() "{{{
|
|
|
|
let blist = []
|
|
|
|
let bcount = 1
|
|
|
|
while bcount<=bufnr("$")
|
|
|
|
if bufexists(bcount)
|
|
|
|
let bname = fnamemodify(bufname(bcount), ":p")
|
|
|
|
if bname =~ VimwikiGet('ext')."$"
|
2010-02-23 01:00:00 +01:00
|
|
|
let bitem = [bname, getbufvar(bname, "vimwiki_prev_link")]
|
2010-01-20 01:00:00 +01:00
|
|
|
call add(blist, bitem)
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
let bcount = bcount + 1
|
|
|
|
endwhile
|
|
|
|
return blist
|
2010-08-24 02:00:00 +02:00
|
|
|
endfunction " }}}
|
2010-01-20 01:00:00 +01:00
|
|
|
|
|
|
|
function! s:open_wiki_buffer(item) "{{{
|
|
|
|
call s:edit_file('e', a:item[0])
|
|
|
|
if !empty(a:item[1])
|
2010-02-23 01:00:00 +01:00
|
|
|
call setbufvar(a:item[0], "vimwiki_prev_link", a:item[1])
|
2010-01-20 01:00:00 +01:00
|
|
|
endif
|
2010-08-24 02:00:00 +02:00
|
|
|
endfunction " }}}
|
2010-01-20 01:00:00 +01:00
|
|
|
|
|
|
|
" }}}
|
|
|
|
|
|
|
|
" SYNTAX highlight {{{
|
2010-08-24 02:00:00 +02:00
|
|
|
function! vimwiki#highlight_links() "{{{
|
|
|
|
try
|
|
|
|
syntax clear VimwikiNoExistsLink
|
|
|
|
syntax clear VimwikiNoExistsLinkT
|
|
|
|
syntax clear VimwikiLink
|
|
|
|
syntax clear VimwikiLinkT
|
|
|
|
catch
|
|
|
|
endtry
|
|
|
|
|
|
|
|
"" use max highlighting - could be quite slow if there are too many wikifiles
|
|
|
|
if VimwikiGet('maxhi')
|
|
|
|
" Every WikiWord is nonexistent
|
|
|
|
if g:vimwiki_camel_case
|
|
|
|
execute 'syntax match VimwikiNoExistsLink /'.g:vimwiki_rxWikiWord.'/ display'
|
|
|
|
execute 'syntax match VimwikiNoExistsLinkT /'.g:vimwiki_rxWikiWord.'/ display contained'
|
|
|
|
endif
|
|
|
|
execute 'syntax match VimwikiNoExistsLink /'.g:vimwiki_rxWikiLink1.'/ display contains=VimwikiNoLinkChar'
|
|
|
|
execute 'syntax match VimwikiNoExistsLink /'.g:vimwiki_rxWikiLink2.'/ display contains=VimwikiNoLinkChar'
|
|
|
|
|
|
|
|
execute 'syntax match VimwikiNoExistsLinkT /'.g:vimwiki_rxWikiLink1.'/ display contained'
|
|
|
|
execute 'syntax match VimwikiNoExistsLinkT /'.g:vimwiki_rxWikiLink2.'/ display contained'
|
|
|
|
|
|
|
|
" till we find them in vimwiki's path
|
|
|
|
call s:highlight_existed_links()
|
|
|
|
else
|
|
|
|
" A WikiWord (unqualifiedWikiName)
|
|
|
|
execute 'syntax match VimwikiLink /\<'.g:vimwiki_rxWikiWord.'\>/'
|
|
|
|
" A [[bracketed wiki word]]
|
|
|
|
execute 'syntax match VimwikiLink /'.g:vimwiki_rxWikiLink1.'/ display contains=VimwikiLinkChar'
|
|
|
|
execute 'syntax match VimwikiLink /'.g:vimwiki_rxWikiLink2.'/ display contains=VimwikiLinkChar'
|
|
|
|
|
|
|
|
execute 'syntax match VimwikiLinkT /\<'.g:vimwiki_rxWikiWord.'\>/ display contained'
|
|
|
|
execute 'syntax match VimwikiLinkT /'.g:vimwiki_rxWikiLink1.'/ display contained'
|
|
|
|
execute 'syntax match VimwikiLinkT /'.g:vimwiki_rxWikiLink2.'/ display contained'
|
|
|
|
endif
|
|
|
|
|
|
|
|
execute 'syntax match VimwikiLink `'.g:vimwiki_rxWeblink.'` display contains=@NoSpell'
|
|
|
|
endfunction "}}}
|
|
|
|
|
|
|
|
function! s:highlight_existed_links() "{{{
|
2010-05-12 02:00:00 +02:00
|
|
|
let links = s:get_links('*'.VimwikiGet('ext'))
|
2010-01-20 01:00:00 +01:00
|
|
|
|
|
|
|
" Links with subdirs should be highlighted for linux and windows separators
|
|
|
|
" Change \ or / to [/\\]
|
|
|
|
let os_p = '[/\\]'
|
|
|
|
let os_p2 = escape(os_p, '\')
|
2010-05-12 02:00:00 +02:00
|
|
|
call map(links, 'substitute(v:val, os_p, os_p2, "g")')
|
2010-01-20 01:00:00 +01:00
|
|
|
|
2010-05-12 02:00:00 +02:00
|
|
|
for link in links
|
2010-01-20 01:00:00 +01:00
|
|
|
if g:vimwiki_camel_case &&
|
2010-08-24 02:00:00 +02:00
|
|
|
\ link =~ g:vimwiki_rxWikiWord && !vimwiki#is_non_wiki_link(link)
|
|
|
|
execute 'syntax match VimwikiLink /!\@<!\<'.link.'\>/ display'
|
2010-01-20 01:00:00 +01:00
|
|
|
endif
|
2010-08-24 02:00:00 +02:00
|
|
|
execute 'syntax match VimwikiLink /\[\['.
|
|
|
|
\ escape(vimwiki#unsafe_link(link), '~&$.*').
|
|
|
|
\ '\%(|\+.\{-}\)\{-}\]\]/ display contains=VimwikiLinkChar'
|
|
|
|
execute 'syntax match VimwikiLink /\[\['.
|
|
|
|
\ escape(vimwiki#unsafe_link(link), '~&$.*').
|
|
|
|
\ '\]\[.\{-1,}\]\]/ display contains=VimwikiLinkChar'
|
|
|
|
|
|
|
|
execute 'syntax match VimwikiLinkT /\[\['.
|
|
|
|
\ escape(vimwiki#unsafe_link(link), '~&$.*').
|
|
|
|
\ '\%(|\+.\{-}\)\{-}\]\]/ display contained'
|
|
|
|
execute 'syntax match VimwikiLinkT /\[\['.
|
|
|
|
\ escape(vimwiki#unsafe_link(link), '~&$.*').
|
|
|
|
\ '\]\[.\{-1,}\]\]/ display contained'
|
2010-01-20 01:00:00 +01:00
|
|
|
endfor
|
2010-08-24 02:00:00 +02:00
|
|
|
execute 'syntax match VimwikiLink /\[\[.\+\.\%(jpg\|png\|gif\)\%(|\+.*\)*\]\]/ display contains=VimwikiLinkChar'
|
|
|
|
execute 'syntax match VimwikiLink /\[\[.\+\.\%(jpg\|png\|gif\)\]\[.\+\]\]/ display contains=VimwikiLinkChar'
|
|
|
|
|
|
|
|
execute 'syntax match VimwikiLinkT /\[\[.\+\.\%(jpg\|png\|gif\)\%(|\+.*\)*\]\]/ display contained'
|
|
|
|
execute 'syntax match VimwikiLinkT /\[\[.\+\.\%(jpg\|png\|gif\)\]\[.\+\]\]/ display contained'
|
|
|
|
|
|
|
|
" Issue 103: Always highlight links to non-wiki files as existed.
|
|
|
|
execute 'syntax match VimwikiLink /\[\[.\+\.\%('.
|
|
|
|
\join(split(g:vimwiki_file_exts, '\s*,\s*'), '\|').
|
|
|
|
\'\)\%(|\+.*\)*\]\]/ display contains=VimwikiLinkChar'
|
|
|
|
execute 'syntax match VimwikiLink /\[\[.\+\.\%('.
|
|
|
|
\join(split(g:vimwiki_file_exts, '\s*,\s*'), '\|').
|
|
|
|
\'\)\]\[.\+\]\]/ display contains=VimwikiLinkChar'
|
|
|
|
|
|
|
|
execute 'syntax match VimwikiLinkT /\[\[.\+\.\%('.
|
|
|
|
\join(split(g:vimwiki_file_exts, '\s*,\s*'), '\|').
|
|
|
|
\'\)\%(|\+.*\)*\]\]/ display contained'
|
|
|
|
execute 'syntax match VimwikiLinkT /\[\[.\+\.\%('.
|
|
|
|
\join(split(g:vimwiki_file_exts, '\s*,\s*'), '\|').
|
|
|
|
\'\)\]\[.\+\]\]/ display contained'
|
2010-05-12 02:00:00 +02:00
|
|
|
|
|
|
|
" highlight dirs
|
|
|
|
let dirs = s:get_links('*/')
|
|
|
|
call map(dirs, 'substitute(v:val, os_p, os_p2, "g")')
|
|
|
|
for dir in dirs
|
2010-08-24 02:00:00 +02:00
|
|
|
execute 'syntax match VimwikiLink /\[\['.
|
|
|
|
\ escape(vimwiki#unsafe_link(dir), '~&$.*').
|
|
|
|
\ '[/\\]*\%(|\+.*\)*\]\]/ display contains=VimwikiLinkChar'
|
|
|
|
execute 'syntax match VimwikiLink /\[\['.
|
|
|
|
\ escape(vimwiki#unsafe_link(dir), '~&$.*').
|
|
|
|
\ '[/\\]*\%(\]\[\+.*\)*\]\]/ display contains=VimwikiLinkChar'
|
|
|
|
|
|
|
|
execute 'syntax match VimwikiLinkT /\[\['.
|
|
|
|
\ escape(vimwiki#unsafe_link(dir), '~&$.*').
|
|
|
|
\ '[/\\]*\%(|\+.*\)*\]\]/ display contained'
|
|
|
|
execute 'syntax match VimwikiLinkT /\[\['.
|
|
|
|
\ escape(vimwiki#unsafe_link(dir), '~&$.*').
|
|
|
|
\ '[/\\]*\%(\]\[\+.*\)*\]\]/ display contained'
|
2010-05-12 02:00:00 +02:00
|
|
|
endfor
|
2010-08-24 02:00:00 +02:00
|
|
|
endfunction "}}}
|
2010-01-20 01:00:00 +01:00
|
|
|
|
2010-08-24 02:00:00 +02:00
|
|
|
function! vimwiki#setup_colors() "{{{
|
|
|
|
|
|
|
|
function! s:set_visible_ignore_color() "{{{
|
|
|
|
if !exists("g:colors_name") || g:colors_name == 'default'
|
|
|
|
if &background == 'light'
|
|
|
|
hi VimwikiIgnore guifg=#d0d0d0
|
|
|
|
else
|
|
|
|
hi VimwikiIgnore guifg=#505050
|
|
|
|
endif
|
|
|
|
else
|
|
|
|
hi link VimwikiIgnore Normal
|
|
|
|
endif
|
|
|
|
endfunction "}}}
|
|
|
|
|
|
|
|
let hlfg_ignore = vimwiki#get_hl_param('Ignore', 'guifg')
|
|
|
|
let hlbg_normal = vimwiki#get_hl_param('Normal', 'guibg')
|
|
|
|
if hlfg_ignore == 'bg' || hlfg_ignore == hlbg_normal
|
|
|
|
call s:set_visible_ignore_color()
|
|
|
|
else
|
|
|
|
hi link VimwikiIgnore Ignore
|
|
|
|
endif
|
|
|
|
|
|
|
|
if g:vimwiki_hl_headers == 0
|
|
|
|
hi def link VimwikiHeader Title
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
|
|
|
|
if &background == 'light'
|
|
|
|
hi def VimwikiHeader1 guibg=bg guifg=#aa5858 gui=bold ctermfg=DarkRed
|
|
|
|
hi def VimwikiHeader2 guibg=bg guifg=#507030 gui=bold ctermfg=DarkGreen
|
|
|
|
hi def VimwikiHeader3 guibg=bg guifg=#1030a0 gui=bold ctermfg=DarkBlue
|
|
|
|
hi def VimwikiHeader4 guibg=bg guifg=#103040 gui=bold ctermfg=Black
|
|
|
|
hi def VimwikiHeader5 guibg=bg guifg=#505050 gui=bold ctermfg=Black
|
|
|
|
hi def VimwikiHeader6 guibg=bg guifg=#636363 gui=bold ctermfg=Black
|
|
|
|
else
|
|
|
|
hi def VimwikiHeader1 guibg=bg guifg=#e08090 gui=bold ctermfg=Red
|
|
|
|
hi def VimwikiHeader2 guibg=bg guifg=#80e090 gui=bold ctermfg=Green
|
|
|
|
hi def VimwikiHeader3 guibg=bg guifg=#6090e0 gui=bold ctermfg=Blue
|
|
|
|
hi def VimwikiHeader4 guibg=bg guifg=#c0c0f0 gui=bold ctermfg=White
|
|
|
|
hi def VimwikiHeader5 guibg=bg guifg=#e0e0f0 gui=bold ctermfg=White
|
|
|
|
hi def VimwikiHeader6 guibg=bg guifg=#f0f0f0 gui=bold ctermfg=White
|
|
|
|
endif
|
|
|
|
endfunction "}}}
|
|
|
|
|
|
|
|
function vimwiki#get_hl_param(hgroup, hparam) "{{{
|
|
|
|
redir => hlstatus
|
|
|
|
exe "silent hi ".a:hgroup
|
|
|
|
redir END
|
|
|
|
return matchstr(hlstatus, a:hparam.'\s*=\s*\zs\S\+')
|
|
|
|
endfunction "}}}
|
|
|
|
|
|
|
|
function! vimwiki#hl_exists(hl) "{{{
|
2010-01-20 01:00:00 +01:00
|
|
|
if !hlexists(a:hl)
|
|
|
|
return 0
|
|
|
|
endif
|
|
|
|
redir => hlstatus
|
|
|
|
exe "silent hi" a:hl
|
|
|
|
redir END
|
|
|
|
return (hlstatus !~ "cleared")
|
|
|
|
endfunction
|
|
|
|
"}}}
|
|
|
|
|
|
|
|
function! vimwiki#nested_syntax(filetype, start, end, textSnipHl) abort "{{{
|
|
|
|
" From http://vim.wikia.com/wiki/VimTip857
|
|
|
|
let ft=toupper(a:filetype)
|
|
|
|
let group='textGroup'.ft
|
|
|
|
if exists('b:current_syntax')
|
|
|
|
let s:current_syntax=b:current_syntax
|
|
|
|
" Remove current syntax definition, as some syntax files (e.g. cpp.vim)
|
|
|
|
" do nothing if b:current_syntax is defined.
|
|
|
|
unlet b:current_syntax
|
|
|
|
endif
|
|
|
|
|
|
|
|
" Some syntax files set up iskeyword which might scratch vimwiki a bit.
|
|
|
|
" Let us save and restore it later.
|
|
|
|
" let b:skip_set_iskeyword = 1
|
|
|
|
let is_keyword = &iskeyword
|
|
|
|
|
|
|
|
execute 'syntax include @'.group.' syntax/'.a:filetype.'.vim'
|
|
|
|
try
|
|
|
|
execute 'syntax include @'.group.' after/syntax/'.a:filetype.'.vim'
|
|
|
|
catch
|
|
|
|
endtry
|
|
|
|
|
|
|
|
let &iskeyword = is_keyword
|
|
|
|
|
|
|
|
if exists('s:current_syntax')
|
|
|
|
let b:current_syntax=s:current_syntax
|
|
|
|
else
|
|
|
|
unlet b:current_syntax
|
|
|
|
endif
|
2010-08-24 02:00:00 +02:00
|
|
|
execute 'syntax region textSnip'.ft.
|
|
|
|
\ ' matchgroup='.a:textSnipHl.
|
|
|
|
\ ' start="'.a:start.'" end="'.a:end.'"'.
|
|
|
|
\ ' contains=@'.group.' keepend'
|
|
|
|
|
|
|
|
" A workaround to Issue 115: Nested Perl syntax highlighting differs from
|
|
|
|
" regular one.
|
|
|
|
" Perl syntax file has perlFunctionName which is usually has no effect due to
|
|
|
|
" 'contained' flag. Now we have 'syntax include' that makes all the groups
|
|
|
|
" included as 'contained' into specific group.
|
|
|
|
" Here perlFunctionName (with quite an angry regexp "\h\w*[^:]") clashes with
|
|
|
|
" the rest syntax rules as now it has effect being really 'contained'.
|
|
|
|
" Clear it!
|
|
|
|
if ft =~ 'perl'
|
|
|
|
syntax clear perlFunctionName
|
|
|
|
endif
|
2010-01-20 01:00:00 +01:00
|
|
|
endfunction "}}}
|
|
|
|
|
|
|
|
"}}}
|
|
|
|
|
|
|
|
" WIKI functions {{{
|
2010-08-24 02:00:00 +02:00
|
|
|
function! vimwiki#find_next_link() "{{{
|
2010-05-12 02:00:00 +02:00
|
|
|
call s:search_word(g:vimwiki_rxWikiLink.'\|'.g:vimwiki_rxWeblink, '')
|
2010-01-20 01:00:00 +01:00
|
|
|
endfunction
|
|
|
|
" }}}
|
|
|
|
|
2010-08-24 02:00:00 +02:00
|
|
|
function! vimwiki#find_prev_link() "{{{
|
2010-05-12 02:00:00 +02:00
|
|
|
call s:search_word(g:vimwiki_rxWikiLink.'\|'.g:vimwiki_rxWeblink, 'b')
|
2010-01-20 01:00:00 +01:00
|
|
|
endfunction
|
|
|
|
" }}}
|
|
|
|
|
2010-08-24 02:00:00 +02:00
|
|
|
function! vimwiki#follow_link(split) "{{{
|
2010-01-20 01:00:00 +01:00
|
|
|
if a:split == "split"
|
|
|
|
let cmd = ":split "
|
|
|
|
elseif a:split == "vsplit"
|
|
|
|
let cmd = ":vsplit "
|
|
|
|
else
|
|
|
|
let cmd = ":e "
|
|
|
|
endif
|
|
|
|
|
2010-05-12 02:00:00 +02:00
|
|
|
let link = s:strip_word(s:get_word_at_cursor(g:vimwiki_rxWikiLink))
|
2010-02-23 01:00:00 +01:00
|
|
|
if link == ""
|
2010-01-20 01:00:00 +01:00
|
|
|
let weblink = s:strip_word(s:get_word_at_cursor(g:vimwiki_rxWeblink))
|
|
|
|
if weblink != ""
|
2010-08-24 02:00:00 +02:00
|
|
|
call VimwikiWeblinkHandler(escape(weblink, '#'))
|
2010-01-20 01:00:00 +01:00
|
|
|
else
|
|
|
|
execute "normal! \n"
|
|
|
|
endif
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
|
2010-02-23 01:00:00 +01:00
|
|
|
let subdir = vimwiki#current_subdir()
|
|
|
|
call vimwiki#open_link(cmd, subdir.link)
|
|
|
|
|
2010-08-24 02:00:00 +02:00
|
|
|
endfunction " }}}
|
2010-01-20 01:00:00 +01:00
|
|
|
|
2010-08-24 02:00:00 +02:00
|
|
|
function! vimwiki#go_back_link() "{{{
|
2010-02-23 01:00:00 +01:00
|
|
|
if exists("b:vimwiki_prev_link")
|
2010-01-20 01:00:00 +01:00
|
|
|
" go back to saved WikiWord
|
2010-02-23 01:00:00 +01:00
|
|
|
let prev_word = b:vimwiki_prev_link
|
2010-01-20 01:00:00 +01:00
|
|
|
execute ":e ".substitute(prev_word[0], '\s', '\\\0', 'g')
|
|
|
|
call setpos('.', prev_word[1])
|
|
|
|
endif
|
2010-08-24 02:00:00 +02:00
|
|
|
endfunction " }}}
|
2010-01-20 01:00:00 +01:00
|
|
|
|
2010-08-24 02:00:00 +02:00
|
|
|
function! vimwiki#goto_index(index) "{{{
|
2010-02-23 01:00:00 +01:00
|
|
|
call vimwiki#select(a:index)
|
2010-01-20 01:00:00 +01:00
|
|
|
call vimwiki#mkdir(VimwikiGet('path'))
|
|
|
|
|
|
|
|
try
|
|
|
|
execute ':e '.fnameescape(
|
|
|
|
\ VimwikiGet('path').VimwikiGet('index').VimwikiGet('ext'))
|
|
|
|
catch /E37/ " catch 'No write since last change' error
|
2010-08-24 02:00:00 +02:00
|
|
|
execute ':split '.
|
2010-01-20 01:00:00 +01:00
|
|
|
\ VimwikiGet('path').
|
|
|
|
\ VimwikiGet('index').
|
|
|
|
\ VimwikiGet('ext')
|
|
|
|
catch /E325/ " catch 'ATTENTION' error (:h E325)
|
|
|
|
endtry
|
2010-08-24 02:00:00 +02:00
|
|
|
endfunction "}}}
|
2010-01-20 01:00:00 +01:00
|
|
|
|
2010-08-24 02:00:00 +02:00
|
|
|
function! vimwiki#delete_link() "{{{
|
2010-01-20 01:00:00 +01:00
|
|
|
"" file system funcs
|
|
|
|
"" Delete WikiWord you are in from filesystem
|
|
|
|
let val = input('Delete ['.expand('%').'] (y/n)? ', "")
|
|
|
|
if val != 'y'
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
let fname = expand('%:p')
|
|
|
|
try
|
|
|
|
call delete(fname)
|
|
|
|
catch /.*/
|
|
|
|
echomsg 'vimwiki: Cannot delete "'.expand('%:t:r').'"!'
|
|
|
|
return
|
|
|
|
endtry
|
|
|
|
execute "bdelete! ".escape(fname, " ")
|
|
|
|
|
|
|
|
" reread buffer => deleted WikiWord should appear as non-existent
|
|
|
|
if expand('%:p') != ""
|
|
|
|
execute "e"
|
|
|
|
endif
|
2010-08-24 02:00:00 +02:00
|
|
|
endfunction "}}}
|
2010-01-20 01:00:00 +01:00
|
|
|
|
2010-08-24 02:00:00 +02:00
|
|
|
function! vimwiki#rename_link() "{{{
|
2010-01-20 01:00:00 +01:00
|
|
|
"" Rename WikiWord, update all links to renamed WikiWord
|
|
|
|
let subdir = vimwiki#current_subdir()
|
|
|
|
let old_fname = subdir.expand('%:t')
|
|
|
|
|
|
|
|
" there is no file (new one maybe)
|
|
|
|
if glob(expand('%:p')) == ''
|
|
|
|
echomsg 'vimwiki: Cannot rename "'.expand('%:p').
|
|
|
|
\'". It does not exist! (New file? Save it before renaming.)'
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
|
|
|
|
let val = input('Rename "'.expand('%:t:r').'" (y/n)? ', "")
|
|
|
|
if val!='y'
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
|
|
|
|
let new_link = input('Enter new name: ', "")
|
|
|
|
|
|
|
|
if new_link =~ '[/\\]'
|
|
|
|
" It is actually doable but I do not have free time to do it.
|
|
|
|
echomsg 'vimwiki: Cannot rename to a filename with path!'
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
|
|
|
|
" check new_fname - it should be 'good', not empty
|
|
|
|
if substitute(new_link, '\s', '', 'g') == ''
|
|
|
|
echomsg 'vimwiki: Cannot rename to an empty filename!'
|
|
|
|
return
|
|
|
|
endif
|
2010-08-24 02:00:00 +02:00
|
|
|
if vimwiki#is_non_wiki_link(new_link)
|
2010-01-20 01:00:00 +01:00
|
|
|
echomsg 'vimwiki: Cannot rename to a filename with extension (ie .txt .html)!'
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
|
2010-08-24 02:00:00 +02:00
|
|
|
let new_link = subdir.new_link
|
2010-01-20 01:00:00 +01:00
|
|
|
let new_link = s:strip_word(new_link)
|
|
|
|
let new_fname = VimwikiGet('path').s:filename(new_link).VimwikiGet('ext')
|
|
|
|
|
|
|
|
" do not rename if word with such name exists
|
|
|
|
let fname = glob(new_fname)
|
|
|
|
if fname != ''
|
|
|
|
echomsg 'vimwiki: Cannot rename to "'.new_fname.
|
|
|
|
\ '". File with that name exist!'
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
" rename WikiWord file
|
|
|
|
try
|
|
|
|
echomsg "Renaming ".VimwikiGet('path').old_fname." to ".new_fname
|
|
|
|
let res = rename(expand('%:p'), expand(new_fname))
|
|
|
|
if res != 0
|
|
|
|
throw "Cannot rename!"
|
|
|
|
end
|
|
|
|
catch /.*/
|
|
|
|
echomsg 'vimwiki: Cannot rename "'.expand('%:t:r').'" to "'.new_fname.'"'
|
|
|
|
return
|
|
|
|
endtry
|
|
|
|
|
|
|
|
let &buftype="nofile"
|
|
|
|
|
|
|
|
let cur_buffer = [expand('%:p'),
|
2010-02-23 01:00:00 +01:00
|
|
|
\getbufvar(expand('%:p'), "vimwiki_prev_link")]
|
2010-01-20 01:00:00 +01:00
|
|
|
|
|
|
|
let blist = s:get_wiki_buffers()
|
|
|
|
|
|
|
|
" save wiki buffers
|
|
|
|
for bitem in blist
|
|
|
|
execute ':b '.escape(bitem[0], ' ')
|
|
|
|
execute ':update'
|
|
|
|
endfor
|
|
|
|
|
|
|
|
execute ':b '.escape(cur_buffer[0], ' ')
|
|
|
|
|
|
|
|
" remove wiki buffers
|
|
|
|
for bitem in blist
|
|
|
|
execute 'bwipeout '.escape(bitem[0], ' ')
|
|
|
|
endfor
|
|
|
|
|
|
|
|
let setting_more = &more
|
|
|
|
setlocal nomore
|
|
|
|
|
|
|
|
" update links
|
|
|
|
call s:update_wiki_links(old_fname, new_link)
|
|
|
|
|
|
|
|
" restore wiki buffers
|
|
|
|
for bitem in blist
|
|
|
|
if bitem[0] != cur_buffer[0]
|
|
|
|
call s:open_wiki_buffer(bitem)
|
|
|
|
endif
|
|
|
|
endfor
|
|
|
|
|
|
|
|
call s:open_wiki_buffer([new_fname,
|
|
|
|
\ cur_buffer[1]])
|
|
|
|
" execute 'bwipeout '.escape(cur_buffer[0], ' ')
|
|
|
|
|
|
|
|
echomsg old_fname." is renamed to ".new_fname
|
|
|
|
|
|
|
|
let &more = setting_more
|
2010-08-24 02:00:00 +02:00
|
|
|
endfunction " }}}
|
2010-01-20 01:00:00 +01:00
|
|
|
|
2010-08-24 02:00:00 +02:00
|
|
|
function! vimwiki#ui_select()"{{{
|
2010-01-20 01:00:00 +01:00
|
|
|
call s:print_wiki_list()
|
|
|
|
let idx = input("Select Wiki (specify number): ")
|
|
|
|
if idx == ""
|
|
|
|
return
|
|
|
|
endif
|
2010-08-24 02:00:00 +02:00
|
|
|
call vimwiki#goto_index(idx)
|
2010-01-20 01:00:00 +01:00
|
|
|
endfunction
|
|
|
|
"}}}
|
|
|
|
|
|
|
|
" }}}
|
|
|
|
|
|
|
|
" TEXT OBJECTS functions {{{
|
|
|
|
|
|
|
|
function! vimwiki#TO_header(inner, visual) "{{{
|
2010-05-12 02:00:00 +02:00
|
|
|
if !search('^\(=\+\).\+\1\s*$', 'bcW')
|
2010-01-20 01:00:00 +01:00
|
|
|
return
|
|
|
|
endif
|
|
|
|
|
|
|
|
let sel_start = line("'<")
|
|
|
|
let sel_end = line("'>")
|
|
|
|
let block_start = line(".")
|
|
|
|
let advance = 0
|
|
|
|
|
|
|
|
let level = vimwiki#count_first_sym(getline('.'))
|
|
|
|
|
|
|
|
let is_header_selected = sel_start == block_start
|
|
|
|
\ && sel_start != sel_end
|
|
|
|
|
|
|
|
if a:visual && is_header_selected
|
|
|
|
if level > 1
|
|
|
|
let level -= 1
|
2010-05-12 02:00:00 +02:00
|
|
|
call search('^\(=\{'.level.'\}\).\+\1\s*$', 'bcW')
|
2010-01-20 01:00:00 +01:00
|
|
|
else
|
|
|
|
let advance = 1
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
|
|
|
|
normal! V
|
|
|
|
|
|
|
|
if a:visual && is_header_selected
|
|
|
|
call cursor(sel_end + advance, 0)
|
|
|
|
endif
|
|
|
|
|
2010-05-12 02:00:00 +02:00
|
|
|
if search('^\(=\{1,'.level.'}\).\+\1\s*$', 'W')
|
2010-01-20 01:00:00 +01:00
|
|
|
call cursor(line('.') - 1, 0)
|
|
|
|
else
|
|
|
|
call cursor(line('$'), 0)
|
|
|
|
endif
|
|
|
|
|
|
|
|
if a:inner && getline(line('.')) =~ '^\s*$'
|
|
|
|
let lnum = prevnonblank(line('.') - 1)
|
|
|
|
call cursor(lnum, 0)
|
|
|
|
endif
|
|
|
|
endfunction
|
|
|
|
"}}}
|
|
|
|
|
2010-05-12 02:00:00 +02:00
|
|
|
function! vimwiki#TO_table_cell(inner, visual) "{{{
|
|
|
|
if col('.') == col('$')-1
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
|
|
|
|
if a:visual
|
|
|
|
normal! `>
|
|
|
|
let sel_end = getpos('.')
|
|
|
|
normal! `<
|
|
|
|
let sel_start = getpos('.')
|
|
|
|
|
|
|
|
let firsttime = sel_start == sel_end
|
|
|
|
|
|
|
|
if firsttime
|
|
|
|
if !search('|\|\(-+-\)', 'cb', line('.'))
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
if getline('.')[virtcol('.')] == '+'
|
|
|
|
normal! l
|
|
|
|
endif
|
|
|
|
if a:inner
|
|
|
|
normal! 2l
|
|
|
|
endif
|
|
|
|
let sel_start = getpos('.')
|
|
|
|
endif
|
|
|
|
|
|
|
|
normal! `>
|
|
|
|
call search('|\|\(-+-\)', '', line('.'))
|
|
|
|
if getline('.')[virtcol('.')] == '+'
|
|
|
|
normal! l
|
|
|
|
endif
|
|
|
|
if a:inner
|
|
|
|
if firsttime || abs(sel_end[2] - getpos('.')[2]) != 2
|
|
|
|
normal! 2h
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
let sel_end = getpos('.')
|
|
|
|
|
|
|
|
call setpos('.', sel_start)
|
|
|
|
exe "normal! \<C-v>"
|
|
|
|
call setpos('.', sel_end)
|
|
|
|
|
|
|
|
" XXX: WORKAROUND.
|
|
|
|
" if blockwise selection is ended at | character then pressing j to extend
|
|
|
|
" selection furhter fails. But if we shake the cursor left and right then
|
|
|
|
" it works.
|
|
|
|
normal! hl
|
|
|
|
else
|
|
|
|
if !search('|\|\(-+-\)', 'cb', line('.'))
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
if a:inner
|
|
|
|
normal! 2l
|
|
|
|
endif
|
|
|
|
normal! v
|
|
|
|
call search('|\|\(-+-\)', '', line('.'))
|
|
|
|
if !a:inner && getline('.')[virtcol('.')-1] == '|'
|
|
|
|
normal! h
|
|
|
|
elseif a:inner
|
|
|
|
normal! 2h
|
|
|
|
endif
|
|
|
|
endif
|
|
|
|
endfunction "}}}
|
|
|
|
|
|
|
|
function! vimwiki#TO_table_col(inner, visual) "{{{
|
|
|
|
let t_rows = vimwiki_tbl#get_rows(line('.'))
|
|
|
|
if empty(t_rows)
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
|
|
|
|
" TODO: refactor it!
|
|
|
|
if a:visual
|
|
|
|
normal! `>
|
|
|
|
let sel_end = getpos('.')
|
|
|
|
normal! `<
|
|
|
|
let sel_start = getpos('.')
|
|
|
|
|
|
|
|
let firsttime = sel_start == sel_end
|
|
|
|
|
|
|
|
if firsttime
|
|
|
|
" place cursor to the top row of the table
|
|
|
|
call s:cursor(t_rows[0][0], virtcol('.'))
|
|
|
|
" do not accept the match at cursor position if cursor is next to column
|
|
|
|
" separator of the table separator (^ is a cursor):
|
|
|
|
" |-----^-+-------|
|
|
|
|
" | bla | bla |
|
|
|
|
" |-------+-------|
|
|
|
|
" or it will select wrong column.
|
|
|
|
if strpart(getline('.'), virtcol('.')-1) =~ '^-+'
|
|
|
|
let s_flag = 'b'
|
|
|
|
else
|
|
|
|
let s_flag = 'cb'
|
|
|
|
endif
|
|
|
|
" search the column separator backwards
|
|
|
|
if !search('|\|\(-+-\)', s_flag, line('.'))
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
" -+- column separator is matched --> move cursor to the + sign
|
|
|
|
if getline('.')[virtcol('.')] == '+'
|
|
|
|
normal! l
|
|
|
|
endif
|
|
|
|
" inner selection --> reduce selection
|
|
|
|
if a:inner
|
|
|
|
normal! 2l
|
|
|
|
endif
|
|
|
|
let sel_start = getpos('.')
|
|
|
|
endif
|
|
|
|
|
|
|
|
normal! `>
|
|
|
|
if !firsttime && getline('.')[virtcol('.')] == '|'
|
|
|
|
normal! l
|
|
|
|
elseif a:inner && getline('.')[virtcol('.')+1] =~ '[|+]'
|
|
|
|
normal! 2l
|
|
|
|
endif
|
|
|
|
" search for the next column separator
|
|
|
|
call search('|\|\(-+-\)', '', line('.'))
|
|
|
|
" Outer selection selects a column without border on the right. So we move
|
|
|
|
" our cursor left if the previous search finds | border, not -+-.
|
|
|
|
if getline('.')[virtcol('.')] != '+'
|
|
|
|
normal! h
|
|
|
|
endif
|
|
|
|
if a:inner
|
|
|
|
" reduce selection a bit more if inner.
|
|
|
|
normal! h
|
|
|
|
endif
|
|
|
|
" expand selection to the bottom line of the table
|
|
|
|
call s:cursor(t_rows[-1][0], virtcol('.'))
|
|
|
|
let sel_end = getpos('.')
|
|
|
|
|
|
|
|
call setpos('.', sel_start)
|
|
|
|
exe "normal! \<C-v>"
|
|
|
|
call setpos('.', sel_end)
|
|
|
|
|
|
|
|
else
|
|
|
|
" place cursor to the top row of the table
|
|
|
|
call s:cursor(t_rows[0][0], virtcol('.'))
|
|
|
|
" do not accept the match at cursor position if cursor is next to column
|
|
|
|
" separator of the table separator (^ is a cursor):
|
|
|
|
" |-----^-+-------|
|
|
|
|
" | bla | bla |
|
|
|
|
" |-------+-------|
|
|
|
|
" or it will select wrong column.
|
|
|
|
if strpart(getline('.'), virtcol('.')-1) =~ '^-+'
|
|
|
|
let s_flag = 'b'
|
|
|
|
else
|
|
|
|
let s_flag = 'cb'
|
|
|
|
endif
|
|
|
|
" search the column separator backwards
|
|
|
|
if !search('|\|\(-+-\)', s_flag, line('.'))
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
" -+- column separator is matched --> move cursor to the + sign
|
|
|
|
if getline('.')[virtcol('.')] == '+'
|
|
|
|
normal! l
|
|
|
|
endif
|
|
|
|
" inner selection --> reduce selection
|
|
|
|
if a:inner
|
|
|
|
normal! 2l
|
|
|
|
endif
|
|
|
|
|
|
|
|
exe "normal! \<C-V>"
|
|
|
|
|
|
|
|
" search for the next column separator
|
|
|
|
call search('|\|\(-+-\)', '', line('.'))
|
|
|
|
" Outer selection selects a column without border on the right. So we move
|
|
|
|
" our cursor left if the previous search finds | border, not -+-.
|
|
|
|
if getline('.')[virtcol('.')] != '+'
|
|
|
|
normal! h
|
|
|
|
endif
|
|
|
|
" reduce selection a bit more if inner.
|
|
|
|
if a:inner
|
|
|
|
normal! h
|
|
|
|
endif
|
|
|
|
" expand selection to the bottom line of the table
|
|
|
|
call s:cursor(t_rows[-1][0], virtcol('.'))
|
|
|
|
endif
|
|
|
|
endfunction "}}}
|
|
|
|
|
2010-01-20 01:00:00 +01:00
|
|
|
function! vimwiki#count_first_sym(line) "{{{
|
|
|
|
let first_sym = matchstr(a:line, '\S')
|
|
|
|
return len(matchstr(a:line, first_sym.'\+'))
|
|
|
|
endfunction "}}}
|
|
|
|
|
|
|
|
function! vimwiki#AddHeaderLevel() "{{{
|
|
|
|
let lnum = line('.')
|
|
|
|
let line = getline(lnum)
|
|
|
|
|
|
|
|
if line =~ '^\s*$'
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
|
|
|
|
if line =~ '^\s*\(=\+\).\+\1\s*$'
|
|
|
|
let level = vimwiki#count_first_sym(line)
|
|
|
|
if level < 6
|
|
|
|
let line = substitute(line, '\(=\+\).\+\1', '=&=', '')
|
|
|
|
call setline(lnum, line)
|
|
|
|
endif
|
|
|
|
else
|
|
|
|
let line = substitute(line, '^\s*', '&= ', '')
|
|
|
|
let line = substitute(line, '\s*$', ' =&', '')
|
|
|
|
call setline(lnum, line)
|
|
|
|
endif
|
|
|
|
endfunction
|
|
|
|
"}}}
|
|
|
|
|
|
|
|
function! vimwiki#RemoveHeaderLevel() "{{{
|
|
|
|
let lnum = line('.')
|
|
|
|
let line = getline(lnum)
|
|
|
|
|
|
|
|
if line =~ '^\s*$'
|
|
|
|
return
|
|
|
|
endif
|
|
|
|
|
|
|
|
if line =~ '^\s*\(=\+\).\+\1\s*$'
|
|
|
|
let level = vimwiki#count_first_sym(line)
|
|
|
|
let old = repeat('=', level)
|
|
|
|
let new = repeat('=', level - 1)
|
|
|
|
|
|
|
|
let chomp = line =~ '=\s'
|
|
|
|
|
|
|
|
let line = substitute(line, old, new, 'g')
|
|
|
|
|
|
|
|
if level == 1 && chomp
|
|
|
|
let line = substitute(line, '^\s', '', 'g')
|
|
|
|
let line = substitute(line, '\s$', '', 'g')
|
|
|
|
endif
|
|
|
|
call setline(lnum, line)
|
|
|
|
endif
|
|
|
|
endfunction
|
|
|
|
" }}}
|
|
|
|
|
|
|
|
" }}}
|