Remove foldmarkers; general reformatting

This commit is contained in:
EinfachToll
2018-04-20 07:03:53 +02:00
parent 90dc1e5871
commit c1dbf90c29
17 changed files with 1478 additions and 1290 deletions

View File

@ -1,4 +1,4 @@
" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=99
" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99
" Vimwiki autoload plugin file
" Desc: Basic functionality
" Home: https://github.com/vimwiki/vimwiki/
@ -8,15 +8,15 @@ if exists("g:loaded_vimwiki_auto") || &cp
endif
let g:loaded_vimwiki_auto = 1
" s:safesubstitute
function! s:safesubstitute(text, search, replace, mode) "{{{
function! s:safesubstitute(text, search, replace, mode)
" Substitute regexp but do not interpret replace
let escaped = escape(a:replace, '\&')
return substitute(a:text, a:search, escaped, a:mode)
endfunction " }}}
endfunction
" s:vimwiki_get_known_syntaxes
function! s:vimwiki_get_known_syntaxes() " {{{
function! s:vimwiki_get_known_syntaxes()
" Getting all syntaxes that different wikis could have
let syntaxes = {}
let syntaxes['default'] = 1
@ -29,21 +29,22 @@ function! s:vimwiki_get_known_syntaxes() " {{{
let syntaxes[syn] = 1
endfor
return keys(syntaxes)
endfunction " }}}
endfunction
" vimwiki#base#file_pattern
function! vimwiki#base#file_pattern(files) "{{{ Get search regex from glob()
function! vimwiki#base#file_pattern(files)
" Get search regex from glob()
" string. Aim to support *all* special characters, forcing the user to choose
" names that are compatible with any external restrictions that they
" encounter (e.g. filesystem, wiki conventions, other syntaxes, ...).
" See: https://github.com/vimwiki-backup/vimwiki/issues/316
" Change / to [/\\] to allow "Windows paths"
" Change / to [/\\] to allow "Windows paths"
return '\V\%('.join(a:files, '\|').'\)\m'
endfunction "}}}
endfunction
" vimwiki#base#subdir
"FIXME TODO slow and faulty
function! vimwiki#base#subdir(path, filename) "{{{
function! vimwiki#base#subdir(path, filename)
let path = a:path
" ensure that we are not fooled by a symbolic link
"FIXME if we are not "fooled", we end up in a completely different wiki?
@ -64,29 +65,28 @@ function! vimwiki#base#subdir(path, filename) "{{{
let res = res.'/'
endif
return res
endfunction "}}}
endfunction
" vimwiki#base#current_subdir
function! vimwiki#base#current_subdir()"{{{
function! vimwiki#base#current_subdir()
return vimwiki#base#subdir(vimwiki#vars#get_wikilocal('path'), expand('%:p'))
endfunction"}}}
endfunction
" vimwiki#base#invsubdir
function! vimwiki#base#invsubdir(subdir) " {{{
function! vimwiki#base#invsubdir(subdir)
return substitute(a:subdir, '[^/\.]\+/', '../', 'g')
endfunction " }}}
endfunction
" Returns: the number of the wiki a file belongs to or -1 if it doesn't belong
" to any registered wiki.
" The path can be the full path or just the directory of the file
function! vimwiki#base#find_wiki(path) "{{{
function! vimwiki#base#find_wiki(path)
let path = vimwiki#path#path_norm(vimwiki#path#chomp_slash(a:path))
for idx in range(vimwiki#vars#number_of_wikis())
let idx_path = expand(vimwiki#vars#get_wikilocal('path', idx))
let idx_path = vimwiki#path#path_norm(vimwiki#path#chomp_slash(idx_path))
if vimwiki#path#is_equal(
\ vimwiki#path#path_common_pfx(idx_path, path), idx_path)
if vimwiki#path#is_equal(vimwiki#path#path_common_pfx(idx_path, path), idx_path)
return idx
endif
let idx += 1
@ -94,14 +94,14 @@ function! vimwiki#base#find_wiki(path) "{{{
" an orphan page has been detected
return -1
endfunction "}}}
endfunction
" THE central function of Vimwiki. Extract infos about the target from a link.
" If the second parameter is present, which should be an absolute file path, it
" is assumed that the link appears in that file. Without it, the current file
" is used.
function! vimwiki#base#resolve_link(link_text, ...) "{{{
function! vimwiki#base#resolve_link(link_text, ...)
if a:0
let source_wiki = vimwiki#base#find_wiki(a:1)
let source_file = a:1
@ -138,8 +138,7 @@ function! vimwiki#base#resolve_link(link_text, ...) "{{{
endif
let link_text = matchstr(link_text, vimwiki#vars#get_global('rxSchemeUrlMatchUrl'))
let is_wiki_link = link_infos.scheme =~# '\mwiki\d\+' ||
\ link_infos.scheme ==# 'diary'
let is_wiki_link = link_infos.scheme =~# '\mwiki\d\+' || link_infos.scheme ==# 'diary'
" extract anchor
if is_wiki_link
@ -198,8 +197,7 @@ function! vimwiki#base#resolve_link(link_text, ...) "{{{
\ vimwiki#vars#get_wikilocal('diary_rel_path', link_infos.index) .
\ link_text .
\ vimwiki#vars#get_wikilocal('ext', link_infos.index)
elseif (link_infos.scheme ==# 'file' || link_infos.scheme ==# 'local')
\ && is_relative
elseif (link_infos.scheme ==# 'file' || link_infos.scheme ==# 'local') && is_relative
let link_infos.filename = simplify(root_dir . link_text)
else " absolute file link
" collapse repeated leading "/"'s within a link
@ -211,11 +209,10 @@ function! vimwiki#base#resolve_link(link_text, ...) "{{{
let link_infos.filename = vimwiki#path#normalize(link_infos.filename)
return link_infos
endfunction "}}}
endfunction
" vimwiki#base#system_open_link
function! vimwiki#base#system_open_link(url) "{{{
function! vimwiki#base#system_open_link(url)
" handlers
function! s:win32_handler(url)
"http://vim.wikia.com/wiki/Opening_current_Vim_file_in_your_Windows_browser
@ -255,10 +252,10 @@ function! vimwiki#base#system_open_link(url) "{{{
endif
endtry
echomsg 'Vimwiki Error: Default Vimwiki link handler was unable to open the HTML file!'
endfunction "}}}
endfunction
" vimwiki#base#open_link
function! vimwiki#base#open_link(cmd, link, ...) "{{{
function! vimwiki#base#open_link(cmd, link, ...)
let link_infos = {}
if a:0
let link_infos = vimwiki#base#resolve_link(a:link, a:1)
@ -271,8 +268,7 @@ function! vimwiki#base#open_link(cmd, link, ...) "{{{
return
endif
let is_wiki_link = link_infos.scheme =~# '\mwiki\d\+'
\ || link_infos.scheme =~# 'diary'
let is_wiki_link = link_infos.scheme =~# '\mwiki\d\+' || link_infos.scheme =~# 'diary'
let update_prev_link = is_wiki_link &&
\ !vimwiki#path#is_equal(link_infos.filename, vimwiki#path#current_wiki_file())
@ -294,14 +290,15 @@ function! vimwiki#base#open_link(cmd, link, ...) "{{{
else
call vimwiki#base#system_open_link(link_infos.filename)
endif
endfunction " }}}
endfunction
" vimwiki#base#get_globlinks_escaped
function! vimwiki#base#get_globlinks_escaped() abort "{{{only get links from the current dir
function! vimwiki#base#get_globlinks_escaped() abort
" only get links from the current dir
" change to the directory of the current file
let orig_pwd = getcwd()
lcd! %:h
" all path are relative to the current file's location
" all path are relative to the current file's location
let globlinks = glob('*'.vimwiki#vars#get_wikilocal('ext'), 1)."\n"
" remove extensions
let globlinks = substitute(globlinks, '\'.vimwiki#vars#get_wikilocal('ext').'\ze\n', '', 'g')
@ -315,17 +312,16 @@ function! vimwiki#base#get_globlinks_escaped() abort "{{{only get links from the
let globlinks = join(lst, "\n")
" return all escaped links as a single newline-separated string
return globlinks
endfunction " }}}
endfunction
" vimwiki#base#generate_links
function! vimwiki#base#generate_links() "{{{
function! vimwiki#base#generate_links()
let lines = []
let links = vimwiki#base#get_wikilinks(vimwiki#vars#get_bufferlocal('wiki_nr'), 0)
call sort(links)
let bullet = repeat(' ', vimwiki#lst#get_list_margin()).
\ vimwiki#lst#default_symbol().' '
let bullet = repeat(' ', vimwiki#lst#get_list_margin()) . vimwiki#lst#default_symbol().' '
for link in links
let abs_filepath = vimwiki#path#abs_path_of_link(link)
if !s:is_diary_file(abs_filepath)
@ -337,22 +333,21 @@ function! vimwiki#base#generate_links() "{{{
let links_rx = '\m^\s*'.vimwiki#u#escape(vimwiki#lst#default_symbol()).' '
call vimwiki#base#update_listing_in_buffer(lines, 'Generated Links', links_rx,
\ line('$')+1, 1)
endfunction " }}}
call vimwiki#base#update_listing_in_buffer(lines, 'Generated Links', links_rx, line('$')+1, 1)
endfunction
" vimwiki#base#goto
function! vimwiki#base#goto(...) "{{{
function! vimwiki#base#goto(...)
let key = a:1
let anchor = a:0 > 1 ? a:2 : ''
call vimwiki#base#edit_file(':e',
\ vimwiki#vars#get_wikilocal('path') . key . vimwiki#vars#get_wikilocal('ext'),
\ anchor)
endfunction "}}}
endfunction
" vimwiki#base#backlinks
function! vimwiki#base#backlinks() "{{{
function! vimwiki#base#backlinks()
let current_filename = expand("%:p")
let locations = []
for idx in range(vimwiki#vars#number_of_wikis())
@ -376,7 +371,8 @@ function! vimwiki#base#backlinks() "{{{
call setloclist(0, locations, 'r')
lopen
endif
endfunction "}}}
endfunction
" Returns: a list containing all files of the given wiki as absolute file path.
" If the given wiki number is negative, the diary of the current wiki is used
@ -386,7 +382,8 @@ function! vimwiki#base#find_files(wiki_nr, directories_only)
if wiki_nr >= 0
let root_directory = vimwiki#vars#get_wikilocal('path', wiki_nr)
else
let root_directory = vimwiki#vars#get_wikilocal('path') . vimwiki#vars#get_wikilocal('diary_rel_path')
let root_directory = vimwiki#vars#get_wikilocal('path') .
\ vimwiki#vars#get_wikilocal('diary_rel_path')
let wiki_nr = vimwiki#vars#get_bufferlocal('wiki_nr')
endif
if a:directories_only
@ -405,6 +402,7 @@ function! vimwiki#base#find_files(wiki_nr, directories_only)
return split(globpath(root_directory, pattern), '\n')
endfunction
" Returns: a list containing the links to get from the current file to all wiki
" files in the given wiki.
" If the given wiki number is negative, the diary of the current wiki is used.
@ -439,6 +437,7 @@ function! vimwiki#base#get_wikilinks(wiki_nr, also_absolute_links)
return result
endfunction
" Returns: a list containing the links to all directories from the current file
function! vimwiki#base#get_wiki_directories(wiki_nr)
let dirs = vimwiki#base#find_files(a:wiki_nr, 1)
@ -460,7 +459,8 @@ function! vimwiki#base#get_wiki_directories(wiki_nr)
return result
endfunction
function! vimwiki#base#get_anchors(filename, syntax) "{{{
function! vimwiki#base#get_anchors(filename, syntax)
if !filereadable(a:filename)
return []
endif
@ -531,10 +531,10 @@ function! vimwiki#base#get_anchors(filename, syntax) "{{{
endfor
return anchors
endfunction "}}}
endfunction
" s:jump_to_anchor
function! s:jump_to_anchor(anchor) "{{{
function! s:jump_to_anchor(anchor)
let oldpos = getpos('.')
call cursor(1, 1)
@ -554,21 +554,20 @@ function! s:jump_to_anchor(anchor) "{{{
\ vimwiki#vars#get_syntaxlocal('tag_match'),
\ '__Tag__', segment, '')
if !search(anchor_tag, 'Wc')
\ && !search(anchor_header, 'Wc')
\ && !search(anchor_bold, 'Wc')
if !search(anchor_tag, 'Wc') && !search(anchor_header, 'Wc') && !search(anchor_bold, 'Wc')
call setpos('.', oldpos)
break
endif
let oldpos = getpos('.')
endfor
endfunction "}}}
endfunction
" Params: full path to a wiki file and its wiki number
" Returns: a list of all links inside the wiki file
" Every list item has the form
" [target file, anchor, line number of the link in source file, column number]
function! s:get_links(wikifile, idx) "{{{
function! s:get_links(wikifile, idx)
if !filereadable(a:wikifile)
return []
endif
@ -590,17 +589,17 @@ function! s:get_links(wikifile, idx) "{{{
endif
let link_count += 1
let target = vimwiki#base#resolve_link(link_text, a:wikifile)
if target.filename != '' &&
\ target.scheme =~# '\mwiki\d\+\|diary\|file\|local'
if target.filename != '' && target.scheme =~# '\mwiki\d\+\|diary\|file\|local'
call add(links, [target.filename, target.anchor, lnum, col])
endif
endwhile
endfor
return links
endfunction "}}}
endfunction
function! vimwiki#base#check_links() "{{{
function! vimwiki#base#check_links()
let anchors_of_files = {}
let links_of_files = {}
let errors = []
@ -659,8 +658,8 @@ function! vimwiki#base#check_links() "{{{
" mark every index file as reachable
for idx in range(vimwiki#vars#number_of_wikis())
let index_file = vimwiki#vars#get_wikilocal('path', idx) . vimwiki#vars#get_wikilocal('index', idx) .
\ vimwiki#vars#get_wikilocal('ext', idx)
let index_file = vimwiki#vars#get_wikilocal('path', idx) .
\ vimwiki#vars#get_wikilocal('index', idx) . vimwiki#vars#get_wikilocal('ext', idx)
if filereadable(index_file)
let reachable_wikifiles[index_file] = 1
endif
@ -697,10 +696,10 @@ function! vimwiki#base#check_links() "{{{
call setqflist(errors, 'r')
copen
endif
endfunction "}}}
endfunction
" vimwiki#base#edit_file
function! vimwiki#base#edit_file(command, filename, anchor, ...) "{{{
function! vimwiki#base#edit_file(command, filename, anchor, ...)
let fname = escape(a:filename, '% *|#`')
let dir = fnamemodify(a:filename, ":p:h")
@ -751,19 +750,19 @@ function! vimwiki#base#edit_file(command, filename, anchor, ...) "{{{
if a:0 && a:2 && len(a:1) > 0
call vimwiki#vars#set_bufferlocal('prev_link', a:1)
endif
endfunction " }}}
endfunction
" vimwiki#base#search_word
function! vimwiki#base#search_word(wikiRx, cmd) "{{{
function! vimwiki#base#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 " }}}
endfunction
" vimwiki#base#matchstr_at_cursor
" Returns part of the line that matches wikiRX at cursor
function! vimwiki#base#matchstr_at_cursor(wikiRX) "{{{
function! vimwiki#base#matchstr_at_cursor(wikiRX)
let col = col('.') - 1
let line = getline('.')
let ebeg = -1
@ -783,10 +782,10 @@ function! vimwiki#base#matchstr_at_cursor(wikiRX) "{{{
else
return ""
endif
endf "}}}
endfunction
" vimwiki#base#replacestr_at_cursor
function! vimwiki#base#replacestr_at_cursor(wikiRX, sub) "{{{
function! vimwiki#base#replacestr_at_cursor(wikiRX, sub)
let col = col('.') - 1
let line = getline('.')
let ebeg = -1
@ -806,10 +805,10 @@ function! vimwiki#base#replacestr_at_cursor(wikiRX, sub) "{{{
let newline = strpart(line, 0, ebeg).a:sub.strpart(line, ebeg+elen)
call setline(line('.'), newline)
endif
endf "}}}
endfunction
" s:print_wiki_list
function! s:print_wiki_list() "{{{
function! s:print_wiki_list()
let idx = 0
while idx < vimwiki#vars#number_of_wikis()
if idx == vimwiki#vars#get_bufferlocal('wiki_nr')
@ -823,10 +822,10 @@ function! s:print_wiki_list() "{{{
let idx += 1
endwhile
echohl None
endfunction " }}}
endfunction
" s:update_wiki_link
function! s:update_wiki_link(fname, old, new) " {{{
function! s:update_wiki_link(fname, old, new)
echo "Updating links in ".a:fname
let has_updates = 0
let dest = []
@ -843,32 +842,33 @@ function! s:update_wiki_link(fname, old, new) " {{{
call writefile(dest, a:fname)
call delete(a:fname.'#vimwiki_upd#')
endif
endfunction " }}}
endfunction
" s:update_wiki_links_dir
function! s:update_wiki_links_dir(dir, old_fname, new_fname) " {{{
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
let old_fname_r = vimwiki#base#apply_template(
\ vimwiki#vars#get_syntaxlocal('WikiLinkMatchUrlTemplate'), old_fname, '', '')
let files = split(glob(vimwiki#vars#get_wikilocal('path').a:dir.'*'.vimwiki#vars#get_wikilocal('ext')), '\n')
let files = split(glob(vimwiki#vars#get_wikilocal('path').a:dir.'*'.
\ vimwiki#vars#get_wikilocal('ext')), '\n')
for fname in files
call s:update_wiki_link(fname, old_fname_r, new_fname)
endfor
endfunction " }}}
endfunction
" s:tail_name
function! s:tail_name(fname) "{{{
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 "}}}
endfunction
" s:update_wiki_links
function! s:update_wiki_links(old_fname, new_fname) " {{{
function! s:update_wiki_links(old_fname, new_fname)
let old_fname = a:old_fname
let new_fname = a:new_fname
@ -894,14 +894,13 @@ function! s:update_wiki_links(old_fname, new_fname) " {{{
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)
call s:update_wiki_links_dir(dir, new_dir.old_fname, new_dir.new_fname)
let idx = idx + 1
endwhile
endfunction " }}}
endfunction
" s:get_wiki_buffers
function! s:get_wiki_buffers() "{{{
function! s:get_wiki_buffers()
let blist = []
let bcount = 1
while bcount<=bufnr("$")
@ -917,18 +916,18 @@ function! s:get_wiki_buffers() "{{{
let bcount = bcount + 1
endwhile
return blist
endfunction " }}}
endfunction
" s:open_wiki_buffer
function! s:open_wiki_buffer(item) "{{{
function! s:open_wiki_buffer(item)
call vimwiki#base#edit_file(':e', a:item[0], '')
if !empty(a:item[1])
call vimwiki#vars#set_bufferlocal('prev_link', a:item[1], a:item[0])
endif
endfunction " }}}
endfunction
" vimwiki#base#nested_syntax
function! vimwiki#base#nested_syntax(filetype, start, end, textSnipHl) abort "{{{
function! vimwiki#base#nested_syntax(filetype, start, end, textSnipHl) abort
" From http://vim.wikia.com/wiki/VimTip857
let ft=toupper(a:filetype)
let group='textGroup'.ft
@ -975,14 +974,15 @@ function! vimwiki#base#nested_syntax(filetype, start, end, textSnipHl) abort "{{
" 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.
" 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
syntax clear perlFunctionName
endif
endfunction "}}}
endfunction
" creates or updates auto-generated listings in a wiki file, like TOC, diary
" links, tags list etc.
@ -993,7 +993,7 @@ endfunction "}}}
" - if a:create is true, it will be created if it doesn't exist, otherwise it
" will only be updated if it already exists
function! vimwiki#base#update_listing_in_buffer(strings, start_header,
\ content_regex, default_lnum, create) "{{{
\ content_regex, default_lnum, create)
" apparently, Vim behaves strange when files change while in diff mode
if &diff || &readonly
return
@ -1002,9 +1002,8 @@ function! vimwiki#base#update_listing_in_buffer(strings, start_header,
" check if the listing is already there
let already_there = 0
let header_rx = '\m^\s*'.
\ substitute(vimwiki#vars#get_syntaxlocal('rxH1_Template'), '__Header__', a:start_header, '')
\ .'\s*$'
let header_rx = '\m^\s*'.substitute(vimwiki#vars#get_syntaxlocal('rxH1_Template'),
\ '__Header__', a:start_header, '') .'\s*$'
let start_lnum = 1
while start_lnum <= line('$')
@ -1080,27 +1079,26 @@ function! vimwiki#base#update_listing_in_buffer(strings, start_header,
let winview_save.lnum += lines_diff
endif
call winrestview(winview_save)
endfunction "}}}
endfunction
" WIKI link following functions {{{
" vimwiki#base#find_next_link
function! vimwiki#base#find_next_link() "{{{
function! vimwiki#base#find_next_link()
call vimwiki#base#search_word(vimwiki#vars#get_syntaxlocal('rxAnyLink'), '')
endfunction " }}}
endfunction
" vimwiki#base#find_prev_link
function! vimwiki#base#find_prev_link() "{{{
function! vimwiki#base#find_prev_link()
"Jump 2 times if the cursor is in the middle of a link
if synIDattr(synID(line('.'), col('.'), 0), "name") =~# "VimwikiLink.*" &&
\ synIDattr(synID(line('.'), col('.')-1, 0), "name") =~# "VimwikiLink.*"
call vimwiki#base#search_word(vimwiki#vars#get_syntaxlocal('rxAnyLink'), 'b')
endif
call vimwiki#base#search_word(vimwiki#vars#get_syntaxlocal('rxAnyLink'), 'b')
endfunction " }}}
endfunction
" vimwiki#base#follow_link
" This is an API function, that is, remappable by the user. Don't change the signature.
function! vimwiki#base#follow_link(split, reuse, move_cursor, ...) "{{{
function! vimwiki#base#follow_link(split, reuse, move_cursor, ...)
" Parse link at cursor and pass to VimwikiLinkHandler, or failing that, the
" default open_link handler
@ -1171,14 +1169,14 @@ function! vimwiki#base#follow_link(split, reuse, move_cursor, ...) "{{{
else
if a:0 > 0
execute "normal! ".a:1
else
else
call vimwiki#base#normalize_link(0)
endif
endif
endfunction " }}}
endfunction
" vimwiki#base#go_back_link
function! vimwiki#base#go_back_link() "{{{
function! vimwiki#base#go_back_link()
let prev_link = vimwiki#vars#get_bufferlocal('prev_link')
if !empty(prev_link)
" go back to saved wiki link
@ -1188,10 +1186,10 @@ function! vimwiki#base#go_back_link() "{{{
" maybe we came here by jumping to a tag -> pop from the tag stack
silent! pop!
endif
endfunction " }}}
endfunction
" vimwiki#base#goto_index
function! vimwiki#base#goto_index(wnum, ...) "{{{
function! vimwiki#base#goto_index(wnum, ...)
if a:wnum > vimwiki#vars#number_of_wikis()
echomsg 'Vimwiki Error: Wiki '.a:wnum.' is not registered in your Vimwiki settings!'
return
@ -1222,12 +1220,11 @@ function! vimwiki#base#goto_index(wnum, ...) "{{{
\ vimwiki#vars#get_wikilocal('ext', idx)
call vimwiki#base#edit_file(cmd, index_file, '')
endfunction "}}}
endfunction
" vimwiki#base#delete_link
function! vimwiki#base#delete_link() "{{{
"" file system funcs
"" Delete wiki link you are in from filesystem
function! vimwiki#base#delete_link()
" Delete wiki file you are in from filesystem
let val = input('Delete "'.expand('%').'" [y]es/[N]o? ')
if val !~? '^y'
return
@ -1247,11 +1244,11 @@ function! vimwiki#base#delete_link() "{{{
if expand('%:p') != ""
execute "e"
endif
endfunction "}}}
endfunction
" vimwiki#base#rename_link
" Rename current file, update all links to it
function! vimwiki#base#rename_link() "{{{
function! vimwiki#base#rename_link()
let subdir = vimwiki#vars#get_bufferlocal('subdir')
let old_fname = subdir.expand('%:t')
@ -1285,15 +1282,14 @@ function! vimwiki#base#rename_link() "{{{
if url != ''
let new_link = url
endif
let new_link = subdir.new_link
let new_fname = vimwiki#vars#get_wikilocal('path') . new_link . vimwiki#vars#get_wikilocal('ext')
" do not rename if file with such name exists
let fname = glob(new_fname)
if fname != ''
echomsg 'Vimwiki Error: Cannot rename to "'.new_fname.
\ '". File with that name exist!'
echomsg 'Vimwiki Error: Cannot rename to "'.new_fname.'". File with that name exist!'
return
endif
" rename wiki link file
@ -1310,8 +1306,7 @@ function! vimwiki#base#rename_link() "{{{
let &buftype="nofile"
let cur_buffer = [expand('%:p'),
\ vimwiki#vars#get_bufferlocal('prev_link')]
let cur_buffer = [expand('%:p'), vimwiki#vars#get_bufferlocal('prev_link')]
let blist = s:get_wiki_buffers()
@ -1341,27 +1336,24 @@ function! vimwiki#base#rename_link() "{{{
endif
endfor
call s:open_wiki_buffer([new_fname,
\ cur_buffer[1]])
call s:open_wiki_buffer([new_fname, cur_buffer[1]])
" execute 'bwipeout '.escape(cur_buffer[0], ' ')
echomsg 'Vimwiki: '.old_fname.' is renamed to '.new_fname
let &more = setting_more
endfunction " }}}
endfunction
" vimwiki#base#ui_select
function! vimwiki#base#ui_select() "{{{
function! vimwiki#base#ui_select()
call s:print_wiki_list()
let idx = input("Select Wiki (specify number): ")
if idx == ""
return
endif
call vimwiki#base#goto_index(idx)
endfunction "}}}
" }}}
endfunction
" TEXT OBJECTS functions {{{
function! vimwiki#base#TO_header(inner, including_subheaders, count)
let headers = s:collect_headers()
@ -1416,8 +1408,7 @@ function! vimwiki#base#TO_header(inner, including_subheaders, count)
endfunction
" vimwiki#base#TO_table_cell
function! vimwiki#base#TO_table_cell(inner, visual) "{{{
function! vimwiki#base#TO_table_cell(inner, visual)
if col('.') == col('$')-1
return
endif
@ -1461,7 +1452,7 @@ function! vimwiki#base#TO_table_cell(inner, visual) "{{{
" 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
" selection further fails. But if we shake the cursor left and right then
" it works.
normal! hl
else
@ -1479,10 +1470,10 @@ function! vimwiki#base#TO_table_cell(inner, visual) "{{{
normal! 2h
endif
endif
endfunction "}}}
endfunction
" vimwiki#base#TO_table_col
function! vimwiki#base#TO_table_col(inner, visual) "{{{
function! vimwiki#base#TO_table_col(inner, visual)
let t_rows = vimwiki#tbl#get_rows(line('.'))
if empty(t_rows)
return
@ -1594,12 +1585,10 @@ function! vimwiki#base#TO_table_col(inner, visual) "{{{
" expand selection to the bottom line of the table
call vimwiki#u#cursor(t_rows[-1][0], virtcol('.'))
endif
endfunction "}}}
" }}}
endfunction
" HEADER functions {{{
" vimwiki#base#AddHeaderLevel
function! vimwiki#base#AddHeaderLevel() "{{{
function! vimwiki#base#AddHeaderLevel()
let lnum = line('.')
let line = getline(lnum)
let rxHdr = vimwiki#vars#get_syntaxlocal('rxH')
@ -1618,16 +1607,16 @@ function! vimwiki#base#AddHeaderLevel() "{{{
call setline(lnum, line)
endif
else
let line = substitute(line, '^\s*', '&'.rxHdr.' ', '')
let line = substitute(line, '^\s*', '&'.rxHdr.' ', '')
if vimwiki#vars#get_syntaxlocal('symH')
let line = substitute(line, '\s*$', ' '.rxHdr.'&', '')
endif
call setline(lnum, line)
endif
endfunction "}}}
endfunction
" vimwiki#base#RemoveHeaderLevel
function! vimwiki#base#RemoveHeaderLevel() "{{{
function! vimwiki#base#RemoveHeaderLevel()
let lnum = line('.')
let line = getline(lnum)
let rxHdr = vimwiki#vars#get_syntaxlocal('rxH')
@ -1657,7 +1646,8 @@ function! vimwiki#base#RemoveHeaderLevel() "{{{
call setline(lnum, line)
endif
endfunction " }}}
endfunction
" Returns all the headers in the current buffer as a list of the form
@ -1687,7 +1677,8 @@ function! s:collect_headers()
continue
endif
let header_level = vimwiki#u#count_first_sym(line_content)
let header_text = vimwiki#u#trim(matchstr(line_content, vimwiki#vars#get_syntaxlocal('rxHeader')))
let header_text =
\ vimwiki#u#trim(matchstr(line_content, vimwiki#vars#get_syntaxlocal('rxHeader')))
call add(headers, [lnum, header_level, header_text])
endfor
@ -1774,7 +1765,8 @@ endfunction
function! vimwiki#base#goto_sibling(direction)
let headers = s:collect_headers()
let current_header_index = s:current_header(headers, line('.'))
let next_potential_sibling = s:get_another_header(headers, current_header_index, a:direction, '<=')
let next_potential_sibling =
\ s:get_another_header(headers, current_header_index, a:direction, '<=')
if next_potential_sibling >= 0 && headers[next_potential_sibling][1] ==
\ headers[current_header_index][1]
call cursor(headers[next_potential_sibling][0], 1)
@ -1832,19 +1824,17 @@ function! vimwiki#base#table_of_contents(create)
let links_rx = '\m^\s*'.vimwiki#u#escape(vimwiki#lst#default_symbol()).' '
call vimwiki#base#update_listing_in_buffer(lines, vimwiki#vars#get_global('toc_header'), links_rx,
\ 1, a:create)
call vimwiki#base#update_listing_in_buffer(lines,
\ vimwiki#vars#get_global('toc_header'), links_rx, 1, a:create)
endfunction
"}}}
" LINK functions {{{
" vimwiki#base#apply_template
" Construct a regular expression matching from template (with special
" characters properly escaped), by substituting rxUrl for __LinkUrl__, rxDesc
" for __LinkDescription__, and rxStyle for __LinkStyle__. The three
" arguments rxUrl, rxDesc, and rxStyle are copied verbatim, without any
" special character escapes or substitutions.
function! vimwiki#base#apply_template(template, rxUrl, rxDesc, rxStyle) "{{{
function! vimwiki#base#apply_template(template, rxUrl, rxDesc, rxStyle)
let lnk = a:template
if a:rxUrl != ""
let lnk = s:safesubstitute(lnk, '__LinkUrl__', a:rxUrl, 'g')
@ -1856,10 +1846,10 @@ function! vimwiki#base#apply_template(template, rxUrl, rxDesc, rxStyle) "{{{
let lnk = s:safesubstitute(lnk, '__LinkStyle__', a:rxStyle, 'g')
endif
return lnk
endfunction " }}}
endfunction
" s:clean_url
function! s:clean_url(url) " {{{
function! s:clean_url(url)
let url = split(a:url, '/\|=\|-\|&\|?\|\.')
let url = filter(url, 'v:val !=# ""')
let url = filter(url, 'v:val !=# "www"')
@ -1872,19 +1862,18 @@ function! s:clean_url(url) " {{{
let url = filter(url, 'v:val !=# "file\:"')
let url = filter(url, 'v:val !=# "xml\:"')
return join(url, " ")
endfunction " }}}
endfunction
" s:is_diary_file
function! s:is_diary_file(filename) " {{{
function! s:is_diary_file(filename)
let file_path = vimwiki#path#path_norm(a:filename)
let rel_path = vimwiki#vars#get_wikilocal('diary_rel_path')
let diary_path = vimwiki#path#path_norm(vimwiki#vars#get_wikilocal('path') . rel_path)
return rel_path != ''
\ && file_path =~# '^'.vimwiki#u#escape(diary_path)
endfunction " }}}
return rel_path != '' && file_path =~# '^'.vimwiki#u#escape(diary_path)
endfunction
" vimwiki#base#normalize_link_helper
function! vimwiki#base#normalize_link_helper(str, rxUrl, rxDesc, template) " {{{
function! vimwiki#base#normalize_link_helper(str, rxUrl, rxDesc, template)
let url = matchstr(a:str, a:rxUrl)
let descr = matchstr(a:str, a:rxDesc)
if descr == ""
@ -1893,18 +1882,18 @@ function! vimwiki#base#normalize_link_helper(str, rxUrl, rxDesc, template) " {{{
let lnk = s:safesubstitute(a:template, '__LinkDescription__', descr, '')
let lnk = s:safesubstitute(lnk, '__LinkUrl__', url, '')
return lnk
endfunction " }}}
endfunction
" vimwiki#base#normalize_imagelink_helper
function! vimwiki#base#normalize_imagelink_helper(str, rxUrl, rxDesc, rxStyle, template) "{{{
function! vimwiki#base#normalize_imagelink_helper(str, rxUrl, rxDesc, rxStyle, template)
let lnk = vimwiki#base#normalize_link_helper(a:str, a:rxUrl, a:rxDesc, a:template)
let style = matchstr(a:str, a:rxStyle)
let lnk = s:safesubstitute(lnk, '__LinkStyle__', style, '')
return lnk
endfunction " }}}
endfunction
" s:normalize_link_in_diary
function! s:normalize_link_in_diary(lnk) " {{{
function! s:normalize_link_in_diary(lnk)
let link = a:lnk . vimwiki#vars#get_wikilocal('ext')
let link_wiki = vimwiki#vars#get_wikilocal('path') . '/' . link
let link_diary = vimwiki#vars#get_wikilocal('path') . '/'
@ -1927,21 +1916,22 @@ function! s:normalize_link_in_diary(lnk) " {{{
endif
return vimwiki#base#normalize_link_helper(str, rxUrl, rxDesc, template)
endfunction " }}}
endfunction
" s:normalize_link_syntax_n
function! s:normalize_link_syntax_n() " {{{
function! s:normalize_link_syntax_n()
" try WikiLink
let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWikiLink'))
if !empty(lnk)
let sub = vimwiki#base#normalize_link_helper(lnk,
\ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl'), vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchDescr'),
\ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl'),
\ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchDescr'),
\ vimwiki#vars#get_global('WikiLinkTemplate2'))
call vimwiki#base#replacestr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWikiLink'), sub)
return
endif
" try WikiIncl
let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_global('rxWikiIncl'))
if !empty(lnk)
@ -1974,10 +1964,10 @@ function! s:normalize_link_syntax_n() " {{{
return
endif
endfunction " }}}
endfunction
" s:normalize_link_syntax_v
function! s:normalize_link_syntax_v() " {{{
function! s:normalize_link_syntax_v()
let sel_save = &selection
let &selection = "old"
let default_register_save = @"
@ -2002,10 +1992,10 @@ function! s:normalize_link_syntax_v() " {{{
call setreg('"', default_register_save, registertype_save)
let &selection = sel_save
endtry
endfunction " }}}
endfunction
" vimwiki#base#normalize_link
function! vimwiki#base#normalize_link(is_visual_mode) "{{{
function! vimwiki#base#normalize_link(is_visual_mode)
if exists('*vimwiki#'.vimwiki#vars#get_wikilocal('syntax').'_base#normalize_link')
" Syntax-specific links
call vimwiki#{vimwiki#vars#get_wikilocal('syntax')}_base#normalize_link(a:is_visual_mode)
@ -2017,10 +2007,10 @@ function! vimwiki#base#normalize_link(is_visual_mode) "{{{
call s:normalize_link_syntax_v()
endif
endif
endfunction "}}}
endfunction
" vimwiki#base#detect_nested_syntax
function! vimwiki#base#detect_nested_syntax() "{{{
function! vimwiki#base#detect_nested_syntax()
let last_word = '\v.*<(\w+)\s*$'
let lines = map(filter(getline(1, "$"), 'v:val =~ "\\%({{{\\|```\\)" && v:val =~ last_word'),
\ 'substitute(v:val, last_word, "\\=submatch(1)", "")')
@ -2029,26 +2019,20 @@ function! vimwiki#base#detect_nested_syntax() "{{{
let dict[elem] = elem
endfor
return dict
endfunction "}}}
endfunction
" }}}
" Command completion functions {{{
" vimwiki#base#complete_links_escaped
function! vimwiki#base#complete_links_escaped(ArgLead, CmdLine, CursorPos) abort " {{{
function! vimwiki#base#complete_links_escaped(ArgLead, CmdLine, CursorPos) abort
" We can safely ignore args if we use -custom=complete option, Vim engine
" will do the job of filtering.
return vimwiki#base#get_globlinks_escaped()
endfunction " }}}
endfunction
"}}}
" -------------------------------------------------------------------------
" Load syntax-specific Wiki functionality
for s:syn in s:vimwiki_get_known_syntaxes()
execute 'runtime! autoload/vimwiki/'.s:syn.'_base.vim'
endfor
endfor
" -------------------------------------------------------------------------

View File

@ -1,44 +1,49 @@
" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=99
" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99
" Vimwiki autoload plugin file
" Desc: Handle diary notes
" Description: Handle diary notes
" Home: https://github.com/vimwiki/vimwiki/
" Load only once {{{
if exists("g:loaded_vimwiki_diary_auto") || &cp
finish
endif
let g:loaded_vimwiki_diary_auto = 1
"}}}
let s:vimwiki_max_scan_for_caption = 5
" Helpers {{{
function! s:prefix_zero(num) "{{{
function! s:prefix_zero(num)
if a:num < 10
return '0'.a:num
endif
return a:num
endfunction "}}}
endfunction
function! s:diary_path(...) "{{{
function! s:diary_path(...)
let idx = a:0 == 0 ? vimwiki#vars#get_bufferlocal('wiki_nr') : a:1
return vimwiki#vars#get_wikilocal('path', idx).vimwiki#vars#get_wikilocal('diary_rel_path', idx)
endfunction "}}}
endfunction
function! s:diary_index(...) "{{{
function! s:diary_index(...)
let idx = a:0 == 0 ? vimwiki#vars#get_bufferlocal('wiki_nr') : a:1
return s:diary_path(idx).vimwiki#vars#get_wikilocal('diary_index', idx).vimwiki#vars#get_wikilocal('ext', idx)
endfunction "}}}
return s:diary_path(idx).vimwiki#vars#get_wikilocal('diary_index', idx).
\ vimwiki#vars#get_wikilocal('ext', idx)
endfunction
function! vimwiki#diary#diary_date_link(...) "{{{
function! vimwiki#diary#diary_date_link(...)
if a:0
return strftime('%Y-%m-%d', a:1)
else
return strftime('%Y-%m-%d')
endif
endfunction "}}}
endfunction
function! s:get_position_links(link) "{{{
function! s:get_position_links(link)
let idx = -1
let links = []
if a:link =~# '^\d\{4}-\d\d-\d\d'
@ -51,16 +56,15 @@ function! s:get_position_links(link) "{{{
let idx = index(links, a:link)
endif
return [idx, links]
endfunction "}}}
endfunction
fun! s:get_month_name(month) "{{{
function! s:get_month_name(month)
return vimwiki#vars#get_global('diary_months')[str2nr(a:month)]
endfun "}}}
endfunction
" Helpers }}}
" Diary index stuff {{{
fun! s:read_captions(files) "{{{
function! s:read_captions(files)
let result = {}
let rx_header = vimwiki#vars#get_syntaxlocal('rxHeader')
for fl in a:files
@ -81,11 +85,13 @@ fun! s:read_captions(files) "{{{
endfor
return result
endfun "}}}
endfunction
fun! s:get_diary_files() "{{{
function! s:get_diary_files()
let rx = '^\d\{4}-\d\d-\d\d'
let s_files = glob(vimwiki#vars#get_wikilocal('path').vimwiki#vars#get_wikilocal('diary_rel_path').'*'.vimwiki#vars#get_wikilocal('ext'))
let s_files = glob(vimwiki#vars#get_wikilocal('path').
\ vimwiki#vars#get_wikilocal('diary_rel_path').'*'.vimwiki#vars#get_wikilocal('ext'))
let files = split(s_files, '\n')
call filter(files, 'fnamemodify(v:val, ":t") =~# "'.escape(rx, '\').'"')
@ -93,9 +99,10 @@ fun! s:get_diary_files() "{{{
call filter(files, 'v:val !~# ''.*\~$''')
return files
endfun "}}}
endfunction
fun! s:group_links(links) "{{{
function! s:group_links(links)
let result = {}
let p_year = 0
let p_month = 0
@ -114,38 +121,43 @@ fun! s:group_links(links) "{{{
let p_month = month
endfor
return result
endfun "}}}
endfunction
function! s:sort(lst) "{{{
function! s:sort(lst)
if vimwiki#vars#get_wikilocal('diary_sort') ==? 'desc'
return reverse(sort(a:lst))
else
return sort(a:lst)
endif
endfunction "}}}
endfunction
function! s:format_diary() "{{{
function! s:format_diary()
let result = []
let links_with_captions = s:read_captions(s:get_diary_files())
let g_files = s:group_links(links_with_captions)
for year in s:sort(keys(g_files))
call add(result, '')
call add(result, substitute(vimwiki#vars#get_syntaxlocal('rxH2_Template'), '__Header__', year , ''))
call add(result,
\ substitute(vimwiki#vars#get_syntaxlocal('rxH2_Template'), '__Header__', year , ''))
for month in s:sort(keys(g_files[year]))
call add(result, '')
call add(result, substitute(vimwiki#vars#get_syntaxlocal('rxH3_Template'), '__Header__', s:get_month_name(month), ''))
call add(result, substitute(vimwiki#vars#get_syntaxlocal('rxH3_Template'),
\ '__Header__', s:get_month_name(month), ''))
for [fl, cap] in s:sort(items(g_files[year][month]))
if empty(cap)
let entry = substitute(vimwiki#vars#get_global('WikiLinkTemplate1'), '__LinkUrl__', fl, '')
let entry = substitute(vimwiki#vars#get_global('WikiLinkTemplate1'),
\ '__LinkUrl__', fl, '')
let entry = substitute(entry, '__LinkDescription__', cap, '')
call add(result, repeat(' ', vimwiki#lst#get_list_margin()).'* '.entry)
else
let entry = substitute(vimwiki#vars#get_global('WikiLinkTemplate2'), '__LinkUrl__', fl, '')
let entry = substitute(vimwiki#vars#get_global('WikiLinkTemplate2'),
\ '__LinkUrl__', fl, '')
let entry = substitute(entry, '__LinkDescription__', cap, '')
call add(result, repeat(' ', vimwiki#lst#get_list_margin()).'* '.entry)
endif
@ -155,11 +167,10 @@ function! s:format_diary() "{{{
endfor
return result
endfunction "}}}
endfunction
" Diary index stuff }}}
function! vimwiki#diary#make_note(wnum, ...) "{{{
function! vimwiki#diary#make_note(wnum, ...)
if a:wnum > vimwiki#vars#number_of_wikis()
echomsg 'Vimwiki Error: Wiki '.a:wnum.' is not registered in g:vimwiki_list!'
return
@ -172,7 +183,8 @@ function! vimwiki#diary#make_note(wnum, ...) "{{{
let idx = 0
endif
call vimwiki#path#mkdir(vimwiki#vars#get_wikilocal('path', idx).vimwiki#vars#get_wikilocal('diary_rel_path', idx))
call vimwiki#path#mkdir(vimwiki#vars#get_wikilocal('path', idx).
\ vimwiki#vars#get_wikilocal('diary_rel_path', idx))
let cmd = 'edit'
if a:0
@ -191,9 +203,10 @@ function! vimwiki#diary#make_note(wnum, ...) "{{{
endif
call vimwiki#base#open_link(cmd, link, s:diary_index(idx))
endfunction "}}}
endfunction
function! vimwiki#diary#goto_diary_index(wnum) "{{{
function! vimwiki#diary#goto_diary_index(wnum)
if a:wnum > vimwiki#vars#number_of_wikis()
echomsg 'Vimwiki Error: Wiki '.a:wnum.' is not registered in g:vimwiki_list!'
return
@ -207,9 +220,10 @@ function! vimwiki#diary#goto_diary_index(wnum) "{{{
endif
call vimwiki#base#edit_file('e', s:diary_index(idx), '')
endfunction "}}}
endfunction
function! vimwiki#diary#goto_next_day() "{{{
function! vimwiki#diary#goto_next_day()
let link = ''
let [idx, links] = s:get_position_links(expand('%:t:r'))
@ -227,9 +241,10 @@ function! vimwiki#diary#goto_next_day() "{{{
if len(link)
call vimwiki#base#open_link(':e ', link)
endif
endfunction "}}}
endfunction
function! vimwiki#diary#goto_prev_day() "{{{
function! vimwiki#diary#goto_prev_day()
let link = ''
let [idx, links] = s:get_position_links(expand('%:t:r'))
@ -247,9 +262,10 @@ function! vimwiki#diary#goto_prev_day() "{{{
if len(link)
call vimwiki#base#open_link(':e ', link)
endif
endfunction "}}}
endfunction
function! vimwiki#diary#generate_diary_section() "{{{
function! vimwiki#diary#generate_diary_section()
let current_file = vimwiki#path#path_norm(expand("%:p"))
let diary_file = vimwiki#path#path_norm(s:diary_index())
if vimwiki#path#is_equal(current_file, diary_file)
@ -259,11 +275,11 @@ function! vimwiki#diary#generate_diary_section() "{{{
else
echomsg 'Vimwiki Error: You can generate diary links only in a diary index page!'
endif
endfunction "}}}
endfunction
" Calendar.vim {{{
" Callback function.
function! vimwiki#diary#calendar_action(day, month, year, week, dir) "{{{
" Callback function for Calendar.vim
function! vimwiki#diary#calendar_action(day, month, year, week, dir)
let day = s:prefix_zero(a:day)
let month = s:prefix_zero(a:month)
@ -283,16 +299,14 @@ function! vimwiki#diary#calendar_action(day, month, year, week, dir) "{{{
" XXX: Well, +1 is for inconsistent index basing...
call vimwiki#diary#make_note(vimwiki#vars#get_bufferlocal('wiki_nr')+1, 0, link)
endfunction "}}}
endfunction
" Sign function.
function vimwiki#diary#calendar_sign(day, month, year) "{{{
function vimwiki#diary#calendar_sign(day, month, year)
let day = s:prefix_zero(a:day)
let month = s:prefix_zero(a:month)
let sfile = vimwiki#vars#get_wikilocal('path').vimwiki#vars#get_wikilocal('diary_rel_path').
\ a:year.'-'.month.'-'.day.vimwiki#vars#get_wikilocal('ext')
return filereadable(expand(sfile))
endfunction "}}}
" Calendar.vim }}}
endfunction

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,20 +1,17 @@
" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=99
" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99
" Vimwiki autoload plugin file
" Desc: Link functions for markdown syntax
" Description: Link functions for markdown syntax
" Home: https://github.com/vimwiki/vimwiki/
" MISC helper functions {{{
" s:safesubstitute
function! s:safesubstitute(text, search, replace, mode) "{{{
function! s:safesubstitute(text, search, replace, mode)
" Substitute regexp but do not interpret replace
let escaped = escape(a:replace, '\&')
return substitute(a:text, a:search, escaped, a:mode)
endfunction " }}}
endfunction
" vimwiki#markdown_base#scan_reflinks
function! vimwiki#markdown_base#scan_reflinks() " {{{
function! vimwiki#markdown_base#scan_reflinks()
let mkd_refs = {}
" construct list of references using vimgrep
try
@ -23,7 +20,7 @@ function! vimwiki#markdown_base#scan_reflinks() " {{{
catch /^Vim\%((\a\+)\)\=:E480/ " No Match
"Ignore it, and move on to the next file
endtry
"
for d in getqflist()
let matchline = join(getline(d.lnum, min([d.lnum+1, line('$')])), ' ')
let descr = matchstr(matchline, vimwiki#vars#get_syntaxlocal('rxMkdRefMatchDescr'))
@ -34,12 +31,11 @@ function! vimwiki#markdown_base#scan_reflinks() " {{{
endfor
call vimwiki#vars#set_bufferlocal('markdown_refs', mkd_refs)
return mkd_refs
endfunction "}}}
endfunction
" vimwiki#markdown_base#open_reflink
" try markdown reference links
function! vimwiki#markdown_base#open_reflink(link) " {{{
function! vimwiki#markdown_base#open_reflink(link)
" echom "vimwiki#markdown_base#open_reflink"
let link = a:link
let mkd_refs = vimwiki#vars#get_bufferlocal('markdown_refs')
@ -50,15 +46,10 @@ function! vimwiki#markdown_base#open_reflink(link) " {{{
else
return 0
endif
endfunction " }}}
" }}}
endfunction
" WIKI link following functions {{{
" LINK functions {{{
" s:normalize_link_syntax_n
function! s:normalize_link_syntax_n() " {{{
function! s:normalize_link_syntax_n()
let lnum = line('.')
" try WikiIncl
@ -72,27 +63,30 @@ function! s:normalize_link_syntax_n() " {{{
let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWikiLink0'))
if !empty(lnk)
let sub = vimwiki#base#normalize_link_helper(lnk,
\ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl'), vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchDescr'),
\ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl'),
\ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchDescr'),
\ vimwiki#vars#get_syntaxlocal('WikiLink1Template2'))
call vimwiki#base#replacestr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWikiLink0'), sub)
return
endif
" try WikiLink1: replace with WikiLink0
let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWikiLink1'))
if !empty(lnk)
let sub = vimwiki#base#normalize_link_helper(lnk,
\ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl'), vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchDescr'),
\ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchUrl'),
\ vimwiki#vars#get_syntaxlocal('rxWikiLinkMatchDescr'),
\ vimwiki#vars#get_global('WikiLinkTemplate2'))
call vimwiki#base#replacestr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWikiLink1'), sub)
return
endif
" try Weblink
let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWeblink'))
if !empty(lnk)
let sub = vimwiki#base#normalize_link_helper(lnk,
\ vimwiki#vars#get_syntaxlocal('rxWeblinkMatchUrl'), vimwiki#vars#get_syntaxlocal('rxWeblinkMatchDescr'),
\ vimwiki#vars#get_syntaxlocal('rxWeblinkMatchUrl'),
\ vimwiki#vars#get_syntaxlocal('rxWeblinkMatchDescr'),
\ vimwiki#vars#get_syntaxlocal('Weblink1Template'))
call vimwiki#base#replacestr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWeblink'), sub)
return
@ -110,10 +104,10 @@ function! s:normalize_link_syntax_n() " {{{
return
endif
endfunction " }}}
endfunction
" s:normalize_link_syntax_v
function! s:normalize_link_syntax_v() " {{{
function! s:normalize_link_syntax_v()
let lnum = line('.')
let sel_save = &selection
let &selection = "old"
@ -138,10 +132,10 @@ function! s:normalize_link_syntax_v() " {{{
let &selection = sel_save
endtry
endfunction " }}}
endfunction
" vimwiki#base#normalize_link
function! vimwiki#markdown_base#normalize_link(is_visual_mode) "{{{
function! vimwiki#markdown_base#normalize_link(is_visual_mode)
if 0
" Syntax-specific links
else
@ -152,11 +146,5 @@ function! vimwiki#markdown_base#normalize_link(is_visual_mode) "{{{
call s:normalize_link_syntax_v()
endif
endif
endfunction "}}}
" }}}
" -------------------------------------------------------------------------
" Load syntax-specific Wiki functionality
" -------------------------------------------------------------------------
endfunction

View File

@ -1,15 +1,15 @@
" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=99
" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99
" Vimwiki autoload plugin file
" Desc: Path manipulation functions
" Description: Path manipulation functions
" Home: https://github.com/vimwiki/vimwiki/
function! vimwiki#path#chomp_slash(str) "{{{
function! vimwiki#path#chomp_slash(str)
return substitute(a:str, '[/\\]\+$', '', '')
endfunction "}}}
endfunction
" Define path-compare function, either case-sensitive or not, depending on OS.
"{{{ " function! vimwiki#path#is_equal(p1, p2)
if vimwiki#u#is_windows()
function! vimwiki#path#is_equal(p1, p2)
return a:p1 ==? a:p2
@ -18,10 +18,11 @@ else
function! vimwiki#path#is_equal(p1, p2)
return a:p1 ==# a:p2
endfunction
endif "}}}
endif
" collapse sections like /a/b/../c to /a/c
function! vimwiki#path#normalize(path) "{{{
function! vimwiki#path#normalize(path)
let path = a:path
while 1
let result = substitute(path, '/[^/]\+/\.\.', '', '')
@ -31,9 +32,10 @@ function! vimwiki#path#normalize(path) "{{{
let path = result
endwhile
return result
endfunction "}}}
endfunction
function! vimwiki#path#path_norm(path) "{{{
function! vimwiki#path#path_norm(path)
" /-slashes
if a:path !~# '^scp:'
let path = substitute(a:path, '\', '/', 'g')
@ -44,21 +46,24 @@ function! vimwiki#path#path_norm(path) "{{{
else
return a:path
endif
endfunction "}}}
endfunction
function! vimwiki#path#is_link_to_dir(link) "{{{
function! vimwiki#path#is_link_to_dir(link)
" Check if link is to a directory.
" It should be ended with \ or /.
return a:link =~# '\m[/\\]$'
endfunction "}}}
endfunction
function! vimwiki#path#abs_path_of_link(link) "{{{
function! vimwiki#path#abs_path_of_link(link)
return vimwiki#path#normalize(expand("%:p:h").'/'.a:link)
endfunction "}}}
endfunction
" return longest common path prefix of 2 given paths.
" '~/home/usrname/wiki', '~/home/usrname/wiki/shmiki' => '~/home/usrname/wiki'
function! vimwiki#path#path_common_pfx(path1, path2) "{{{
function! vimwiki#path#path_common_pfx(path1, path2)
let p1 = split(a:path1, '[/\\]', 1)
let p2 = split(a:path2, '[/\\]', 1)
@ -72,16 +77,17 @@ function! vimwiki#path#path_common_pfx(path1, path2) "{{{
else
return join(p1[: idx-1], '/')
endif
endfunction "}}}
endfunction
function! vimwiki#path#wikify_path(path) "{{{
function! vimwiki#path#wikify_path(path)
let result = resolve(fnamemodify(a:path, ':p'))
if vimwiki#u#is_windows()
let result = substitute(result, '\\', '/', 'g')
endif
let result = vimwiki#path#chomp_slash(result)
return result
endfunction "}}}
endfunction
function! vimwiki#path#current_wiki_file()
@ -90,7 +96,7 @@ endfunction
" Returns: the relative path from a:dir to a:file
function! vimwiki#path#relpath(dir, file) "{{{
function! vimwiki#path#relpath(dir, file)
let result = []
let dir = split(a:dir, '/')
let file = split(a:file, '/')
@ -112,12 +118,13 @@ function! vimwiki#path#relpath(dir, file) "{{{
let result_path .= '/'
endif
return result_path
endfunction "}}}
endfunction
" If the optional argument provided and nonzero,
" it will ask before creating a directory
" it will ask before creating a directory
" Returns: 1 iff directory exists or successfully created
function! vimwiki#path#mkdir(path, ...) "{{{
function! vimwiki#path#mkdir(path, ...)
let path = expand(a:path)
if path =~# '^scp:'
@ -137,23 +144,23 @@ function! vimwiki#path#mkdir(path, ...) "{{{
let path = iconv(path, &enc, vimwiki#vars#get_global('w32_dir_enc'))
endif
if a:0 && a:1 && input("Vimwiki: Make new directory: "
\ .path."\n [y]es/[N]o? ") !~? '^y'
if a:0 && a:1 && input("Vimwiki: Make new directory: ".path."\n [y]es/[N]o? ") !~? '^y'
return 0
endif
call mkdir(path, "p")
return 1
endif
endfunction " }}}
endfunction
function! vimwiki#path#is_absolute(path) "{{{
function! vimwiki#path#is_absolute(path)
if vimwiki#u#is_windows()
return a:path =~? '\m^\a:'
else
return a:path =~# '\m^/\|\~/'
endif
endfunction "}}}
endfunction
" Combine a directory and a file into one path, doesn't generate duplicate
@ -173,3 +180,4 @@ else
return directory . '/' . file
endfunction
endif

View File

@ -1,9 +1,11 @@
" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=99
" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99
" Vimwiki autoload plugin file
let s:TAGS_METADATA_FILE_NAME = '.tags'
" Tags metadata in-memory format:
" metadata := { 'pagename': [entries, ...] }
" entry := { 'tagname':..., 'lineno':..., 'link':... }
@ -19,12 +21,13 @@ let s:TAGS_METADATA_FILE_NAME = '.tags'
" an optional field, "vimwiki:". In this field, we encode tab-separated values
" of missing parameters -- "pagename" and "link".
" vimwiki#tags#update_tags
" Update tags metadata.
" a:full_rebuild == 1: re-scan entire wiki
" a:full_rebuild == 0: only re-scan current page
" a:all_files == '': only if the file is newer than .tags
function! vimwiki#tags#update_tags(full_rebuild, all_files) "{{{
function! vimwiki#tags#update_tags(full_rebuild, all_files)
let all_files = a:all_files != ''
if !a:full_rebuild
" Updating for one page (current)
@ -42,8 +45,7 @@ function! vimwiki#tags#update_tags(full_rebuild, all_files) "{{{
else " full rebuild
let files = vimwiki#base#find_files(vimwiki#vars#get_bufferlocal('wiki_nr'), 0)
let wiki_base_dir = vimwiki#vars#get_wikilocal('path')
let tags_file_last_modification =
\ getftime(vimwiki#tags#metadata_file_path())
let tags_file_last_modification = getftime(vimwiki#tags#metadata_file_path())
let metadata = s:load_tags_metadata()
for file in files
if all_files || getftime(file) >= tags_file_last_modification
@ -56,12 +58,11 @@ function! vimwiki#tags#update_tags(full_rebuild, all_files) "{{{
endfor
call s:write_tags_metadata(metadata)
endif
endfunction " }}}
endfunction
" s:scan_tags
" Scans the list of text lines (argument) and produces tags metadata as a
" list of tag entries.
function! s:scan_tags(lines, page_name) "{{{
" Scans the list of text lines (argument) and produces tags metadata as a list of tag entries.
function! s:scan_tags(lines, page_name)
let entries = []
@ -136,17 +137,18 @@ function! s:scan_tags(lines, page_name) "{{{
endfor " loop over lines
return entries
endfunction " }}}
endfunction
" vimwiki#tags#metadata_file_path
" Returns tags metadata file path
function! vimwiki#tags#metadata_file_path() abort "{{{
return fnamemodify(vimwiki#path#join_path(vimwiki#vars#get_wikilocal('path'), s:TAGS_METADATA_FILE_NAME), ':p')
endfunction " }}}
function! vimwiki#tags#metadata_file_path() abort
return fnamemodify(vimwiki#path#join_path(vimwiki#vars#get_wikilocal('path'),
\ s:TAGS_METADATA_FILE_NAME), ':p')
endfunction
" s:load_tags_metadata
" Loads tags metadata from file, returns a dictionary
function! s:load_tags_metadata() abort "{{{
function! s:load_tags_metadata() abort
let metadata_path = vimwiki#tags#metadata_file_path()
if !filereadable(metadata_path)
return {}
@ -193,29 +195,29 @@ function! s:load_tags_metadata() abort "{{{
endif
endfor
return metadata
endfunction " }}}
endfunction
" s:remove_page_from_tags
" Removes all entries for given page from metadata in-place. Returns updated
" metadata (just in case).
function! s:remove_page_from_tags(metadata, page_name) "{{{
function! s:remove_page_from_tags(metadata, page_name)
if has_key(a:metadata, a:page_name)
call remove(a:metadata, a:page_name)
return a:metadata
else
return a:metadata
endif
endfunction " }}}
endfunction
" s:merge_tags
" Merges metadata of one file into a:metadata
function! s:merge_tags(metadata, pagename, file_metadata) "{{{
function! s:merge_tags(metadata, pagename, file_metadata)
let metadata = a:metadata
let metadata[a:pagename] = a:file_metadata
return metadata
endfunction " }}}
endfunction
" s:tags_entry_cmp
" Compares two actual lines from tags file. Return value is in strcmp style.
" See help on sort() -- that's what this function is going to be used for.
" See also s:write_tags_metadata below -- that's where we compose these tags
@ -225,7 +227,7 @@ endfunction " }}}
" numbers as strings, not integers, and so, for example, tag at line 14
" preceeds the same tag on the same page at line 9. (Because string "14" is
" alphabetically 'less than' string "9".)
function! s:tags_entry_cmp(i1, i2) "{{{
function! s:tags_entry_cmp(i1, i2)
let items = []
for orig_item in [a:i1, a:i2]
let fields = split(orig_item, "\t")
@ -245,11 +247,11 @@ function! s:tags_entry_cmp(i1, i2) "{{{
else
return 0
endif
endfunction " }}}
endfunction
" s:write_tags_metadata
" Saves metadata object into a file. Throws exceptions in case of problems.
function! s:write_tags_metadata(metadata) "{{{
function! s:write_tags_metadata(metadata)
let metadata_path = vimwiki#tags#metadata_file_path()
let tags = []
for pagename in keys(a:metadata)
@ -271,11 +273,11 @@ function! s:write_tags_metadata(metadata) "{{{
call sort(tags, "s:tags_entry_cmp")
call insert(tags, "!_TAG_FILE_SORTED\t1\t")
call writefile(tags, metadata_path)
endfunction " }}}
endfunction
" vimwiki#tags#get_tags
" Returns list of unique tags found in the .tags file
function! vimwiki#tags#get_tags() "{{{
function! vimwiki#tags#get_tags()
let metadata = s:load_tags_metadata()
let tags = {}
for entries in values(metadata)
@ -284,13 +286,13 @@ function! vimwiki#tags#get_tags() "{{{
endfor
endfor
return keys(tags)
endfunction " }}}
endfunction
" vimwiki#tags#generate_tags
" Similar to vimwiki#base#generate_links. In the current buffer, appends
" tags and references to all their instances. If no arguments (tags) are
" specified, outputs all tags.
function! vimwiki#tags#generate_tags(...) abort "{{{
function! vimwiki#tags#generate_tags(...) abort
let need_all_tags = (a:0 == 0)
let specific_tags = a:000
@ -309,8 +311,7 @@ function! vimwiki#tags#generate_tags(...) abort "{{{
endfor
let lines = []
let bullet = repeat(' ', vimwiki#lst#get_list_margin()).
\ vimwiki#lst#default_symbol().' '
let bullet = repeat(' ', vimwiki#lst#get_list_margin()).vimwiki#lst#default_symbol().' '
for tagname in sort(keys(tags_entries))
if need_all_tags || index(specific_tags, tagname) != -1
call extend(lines, [
@ -318,8 +319,8 @@ function! vimwiki#tags#generate_tags(...) abort "{{{
\ substitute(vimwiki#vars#get_syntaxlocal('rxH2_Template'), '__Header__', tagname, ''),
\ '' ])
for taglink in sort(tags_entries[tagname])
call add(lines, bullet .
\ substitute(vimwiki#vars#get_global('WikiLinkTemplate1'), '__LinkUrl__', taglink, ''))
call add(lines, bullet . substitute(vimwiki#vars#get_global('WikiLinkTemplate1'),
\ '__LinkUrl__', taglink, ''))
endfor
endif
endfor
@ -328,15 +329,14 @@ function! vimwiki#tags#generate_tags(...) abort "{{{
\ .vimwiki#u#escape(vimwiki#lst#default_symbol()).' '
\ .vimwiki#vars#get_syntaxlocal('rxWikiLink').'$\)'
call vimwiki#base#update_listing_in_buffer(lines, 'Generated Tags', links_rx,
\ line('$')+1, 1)
endfunction " }}}
call vimwiki#base#update_listing_in_buffer(lines, 'Generated Tags', links_rx, line('$')+1, 1)
endfunction
" vimwiki#tags#complete_tags
function! vimwiki#tags#complete_tags(ArgLead, CmdLine, CursorPos) abort " {{{
function! vimwiki#tags#complete_tags(ArgLead, CmdLine, CursorPos) abort
" We can safely ignore args if we use -custom=complete option, Vim engine
" will do the job of filtering.
let taglist = vimwiki#tags#get_tags()
return join(taglist, "\n")
endfunction " }}}
endfunction

View File

@ -1,28 +1,29 @@
" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=99
" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99
" Vimwiki autoload plugin file
" Desc: Tables
" Description: Tables
" | Easily | manageable | text | tables | ! |
" |--------|------------|-------|--------|---------|
" | Have | fun! | Drink | tea | Period. |
"
" Home: https://github.com/vimwiki/vimwiki/
" Load only once {{{
if exists("g:loaded_vimwiki_tbl_auto") || &cp
finish
endif
let g:loaded_vimwiki_tbl_auto = 1
"}}}
let s:textwidth = &tw
" Misc functions {{{
function! s:rxSep() "{{{
function! s:rxSep()
return vimwiki#vars#get_syntaxlocal('rxTableSep')
endfunction "}}}
endfunction
function! s:wide_len(str) "{{{
function! s:wide_len(str)
" vim73 has new function that gives correct string width.
if exists("*strdisplaywidth")
return strdisplaywidth(a:str)
@ -42,42 +43,49 @@ function! s:wide_len(str) "{{{
let &modified = savemodified
endif
return ret
endfunction "}}}
endfunction
function! s:cell_splitter() "{{{
function! s:cell_splitter()
return '\s*'.s:rxSep().'\s*'
endfunction "}}}
endfunction
function! s:sep_splitter() "{{{
function! s:sep_splitter()
return '-'.s:rxSep().'-'
endfunction "}}}
endfunction
function! s:is_table(line) "{{{
return s:is_separator(a:line) || (a:line !~# s:rxSep().s:rxSep() && a:line =~# '^\s*'.s:rxSep().'.\+'.s:rxSep().'\s*$')
endfunction "}}}
function! s:is_separator(line) "{{{
function! s:is_table(line)
return s:is_separator(a:line) ||
\ (a:line !~# s:rxSep().s:rxSep() && a:line =~# '^\s*'.s:rxSep().'.\+'.s:rxSep().'\s*$')
endfunction
function! s:is_separator(line)
return a:line =~# '^\s*'.s:rxSep().'\(--\+'.s:rxSep().'\)\+\s*$'
endfunction "}}}
endfunction
function! s:is_separator_tail(line) "{{{
function! s:is_separator_tail(line)
return a:line =~# '^\{-1}\%(\s*\|-*\)\%('.s:rxSep().'-\+\)\+'.s:rxSep().'\s*$'
endfunction "}}}
endfunction
function! s:is_last_column(lnum, cnum) "{{{
function! s:is_last_column(lnum, cnum)
let line = strpart(getline(a:lnum), a:cnum - 1)
"echomsg "DEBUG is_last_column> ".(line =~# s:rxSep().'\s*$' && line !~# s:rxSep().'.*'.s:rxSep().'\s*$')
return line =~# s:rxSep().'\s*$' && line !~# s:rxSep().'.*'.s:rxSep().'\s*$'
endfunction "}}}
endfunction
function! s:is_first_column(lnum, cnum) "{{{
function! s:is_first_column(lnum, cnum)
let line = strpart(getline(a:lnum), 0, a:cnum - 1)
"echomsg "DEBUG is_first_column> ".(line =~# '^\s*'.s:rxSep() && line !~# '^\s*'.s:rxSep().'.*'.s:rxSep())
return line =~# '^\s*$' || (line =~# '^\s*'.s:rxSep() && line !~# '^\s*'.s:rxSep().'.*'.s:rxSep())
endfunction "}}}
return line =~# '^\s*$' ||
\ (line =~# '^\s*'.s:rxSep() && line !~# '^\s*'.s:rxSep().'.*'.s:rxSep())
endfunction
function! s:count_separators_up(lnum) "{{{
function! s:count_separators_up(lnum)
let lnum = a:lnum - 1
while lnum > 1
if !s:is_separator(getline(lnum))
@ -87,9 +95,10 @@ function! s:count_separators_up(lnum) "{{{
endwhile
return (a:lnum-lnum)
endfunction "}}}
endfunction
function! s:count_separators_down(lnum) "{{{
function! s:count_separators_down(lnum)
let lnum = a:lnum + 1
while lnum < line('$')
if !s:is_separator(getline(lnum))
@ -99,9 +108,10 @@ function! s:count_separators_down(lnum) "{{{
endwhile
return (lnum-a:lnum)
endfunction "}}}
endfunction
function! s:create_empty_row(cols) "{{{
function! s:create_empty_row(cols)
let row = s:rxSep()
let cell = " ".s:rxSep()
@ -110,9 +120,10 @@ function! s:create_empty_row(cols) "{{{
endfor
return row
endfunction "}}}
endfunction
function! s:create_row_sep(cols) "{{{
function! s:create_row_sep(cols)
let row = s:rxSep()
let cell = "---".s:rxSep()
@ -121,9 +132,10 @@ function! s:create_row_sep(cols) "{{{
endfor
return row
endfunction "}}}
endfunction
function! vimwiki#tbl#get_cells(line) "{{{
function! vimwiki#tbl#get_cells(line)
let result = []
let cell = ''
let quote = ''
@ -174,13 +186,15 @@ function! vimwiki#tbl#get_cells(line) "{{{
call add(result, vimwiki#u#trim(cell.quote, '|'))
endif
return result
endfunction "}}}
endfunction
function! s:col_count(lnum) "{{{
function! s:col_count(lnum)
return len(vimwiki#tbl#get_cells(getline(a:lnum)))
endfunction "}}}
endfunction
function! s:get_indent(lnum) "{{{
function! s:get_indent(lnum)
if !s:is_table(getline(a:lnum))
return
endif
@ -198,9 +212,10 @@ function! s:get_indent(lnum) "{{{
endwhile
return indent
endfunction " }}}
endfunction
function! s:get_rows(lnum) "{{{
function! s:get_rows(lnum)
if !s:is_table(getline(a:lnum))
return
endif
@ -232,9 +247,10 @@ function! s:get_rows(lnum) "{{{
endwhile
return upper_rows + lower_rows
endfunction "}}}
endfunction
function! s:get_cell_max_lens(lnum, ...) "{{{
function! s:get_cell_max_lens(lnum, ...)
let max_lens = {}
for [lnum, row] in s:get_rows(a:lnum)
if s:is_separator(row)
@ -251,9 +267,10 @@ function! s:get_cell_max_lens(lnum, ...) "{{{
endfor
endfor
return max_lens
endfunction "}}}
endfunction
function! s:get_aligned_rows(lnum, col1, col2) "{{{
function! s:get_aligned_rows(lnum, col1, col2)
let rows = s:get_rows(a:lnum)
let startlnum = rows[0][0]
let cells = []
@ -271,10 +288,11 @@ function! s:get_aligned_rows(lnum, col1, col2) "{{{
call add(result, [lnum, new_row])
endfor
return result
endfunction "}}}
endfunction
" Number of the current column. Starts from 0.
function! s:cur_column() "{{{
function! s:cur_column()
let line = getline('.')
if !s:is_table(line)
return -1
@ -291,12 +309,10 @@ function! s:cur_column() "{{{
endif
endwhile
return col
endfunction "}}}
endfunction
" }}}
" Format functions {{{
function! s:fmt_cell(cell, max_len) "{{{
function! s:fmt_cell(cell, max_len)
let cell = ' '.a:cell.' '
let diff = a:max_len - s:wide_len(a:cell)
@ -306,9 +322,10 @@ function! s:fmt_cell(cell, max_len) "{{{
let cell .= repeat(' ', diff)
return cell
endfunction "}}}
endfunction
function! s:fmt_row(cells, max_lens, col1, col2) "{{{
function! s:fmt_row(cells, max_lens, col1, col2)
let new_line = s:rxSep()
for idx in range(len(a:cells))
if idx == a:col1
@ -326,17 +343,19 @@ function! s:fmt_row(cells, max_lens, col1, col2) "{{{
let idx += 1
endwhile
return new_line
endfunction "}}}
endfunction
function! s:fmt_cell_sep(max_len) "{{{
function! s:fmt_cell_sep(max_len)
if a:max_len == 0
return repeat('-', 3)
else
return repeat('-', a:max_len+2)
endif
endfunction "}}}
endfunction
function! s:fmt_sep(max_lens, col1, col2) "{{{
function! s:fmt_sep(max_lens, col1, col2)
let new_line = s:rxSep()
for idx in range(len(a:max_lens))
if idx == a:col1
@ -347,11 +366,10 @@ function! s:fmt_sep(max_lens, col1, col2) "{{{
let new_line .= s:fmt_cell_sep(a:max_lens[idx]).s:rxSep()
endfor
return new_line
endfunction "}}}
"}}}
endfunction
" Keyboard functions "{{{
function! s:kbd_create_new_row(cols, goto_first) "{{{
function! s:kbd_create_new_row(cols, goto_first)
let cmd = "\<ESC>o".s:create_empty_row(a:cols)
let cmd .= "\<ESC>:call vimwiki#tbl#format(line('.'))\<CR>"
let cmd .= "\<ESC>0"
@ -364,26 +382,29 @@ function! s:kbd_create_new_row(cols, goto_first) "{{{
let cmd .= "a"
return cmd
endfunction "}}}
endfunction
function! s:kbd_goto_next_row() "{{{
function! s:kbd_goto_next_row()
let cmd = "\<ESC>j"
let cmd .= ":call search('.\\(".s:rxSep()."\\)', 'c', line('.'))\<CR>"
let cmd .= ":call search('\\(".s:rxSep()."\\)\\zs', 'bc', line('.'))\<CR>"
let cmd .= "a"
return cmd
endfunction "}}}
endfunction
function! s:kbd_goto_prev_row() "{{{
function! s:kbd_goto_prev_row()
let cmd = "\<ESC>k"
let cmd .= ":call search('.\\(".s:rxSep()."\\)', 'c', line('.'))\<CR>"
let cmd .= ":call search('\\(".s:rxSep()."\\)\\zs', 'bc', line('.'))\<CR>"
let cmd .= "a"
return cmd
endfunction "}}}
endfunction
" Used in s:kbd_goto_next_col
function! vimwiki#tbl#goto_next_col() "{{{
function! vimwiki#tbl#goto_next_col()
let curcol = virtcol('.')
let lnum = line('.')
let newcol = s:get_indent(lnum)
@ -396,9 +417,10 @@ function! vimwiki#tbl#goto_next_col() "{{{
endfor
let newcol += 2 " +2 == 1 separator + 1 space |<space
call vimwiki#u#cursor(lnum, newcol)
endfunction "}}}
endfunction
function! s:kbd_goto_next_col(jumpdown) "{{{
function! s:kbd_goto_next_col(jumpdown)
let cmd = "\<ESC>"
if a:jumpdown
let seps = s:count_separators_down(line('.'))
@ -406,10 +428,11 @@ function! s:kbd_goto_next_col(jumpdown) "{{{
endif
let cmd .= ":call vimwiki#tbl#goto_next_col()\<CR>a"
return cmd
endfunction "}}}
endfunction
" Used in s:kbd_goto_prev_col
function! vimwiki#tbl#goto_prev_col() "{{{
function! vimwiki#tbl#goto_prev_col()
let curcol = virtcol('.')
let lnum = line('.')
let newcol = s:get_indent(lnum)
@ -428,9 +451,10 @@ function! vimwiki#tbl#goto_prev_col() "{{{
endfor
let newcol += 2 " +2 == 1 separator + 1 space |<space
call vimwiki#u#cursor(lnum, newcol)
endfunction "}}}
endfunction
function! s:kbd_goto_prev_col(jumpup) "{{{
function! s:kbd_goto_prev_col(jumpup)
let cmd = "\<ESC>"
if a:jumpup
let seps = s:count_separators_up(line('.'))
@ -442,12 +466,10 @@ function! s:kbd_goto_prev_col(jumpup) "{{{
" let cmd .= "a"
"echomsg "DEBUG kbd_goto_prev_col> ".cmd
return cmd
endfunction "}}}
endfunction
"}}}
" Global functions {{{
function! vimwiki#tbl#kbd_cr() "{{{
function! vimwiki#tbl#kbd_cr()
let lnum = line('.')
if !s:is_table(getline(lnum))
return ""
@ -459,9 +481,10 @@ function! vimwiki#tbl#kbd_cr() "{{{
else
return s:kbd_goto_next_row()
endif
endfunction "}}}
endfunction
function! vimwiki#tbl#kbd_tab() "{{{
function! vimwiki#tbl#kbd_tab()
let lnum = line('.')
if !s:is_table(getline(lnum))
return "\<Tab>"
@ -475,9 +498,10 @@ function! vimwiki#tbl#kbd_tab() "{{{
return s:kbd_create_new_row(cols, 1)
endif
return s:kbd_goto_next_col(is_sep || last)
endfunction "}}}
endfunction
function! vimwiki#tbl#kbd_shift_tab() "{{{
function! vimwiki#tbl#kbd_shift_tab()
let lnum = line('.')
if !s:is_table(getline(lnum))
return "\<S-Tab>"
@ -490,9 +514,10 @@ function! vimwiki#tbl#kbd_shift_tab() "{{{
return ""
endif
return s:kbd_goto_prev_col(is_sep || first)
endfunction "}}}
endfunction
function! vimwiki#tbl#format(lnum, ...) "{{{
function! vimwiki#tbl#format(lnum, ...)
if !(&filetype ==? 'vimwiki')
return
endif
@ -520,11 +545,12 @@ function! vimwiki#tbl#format(lnum, ...) "{{{
let row = indentstring.row
call setline(lnum, row)
endfor
let &tw = s:textwidth
endfunction "}}}
function! vimwiki#tbl#create(...) "{{{
let &tw = s:textwidth
endfunction
function! vimwiki#tbl#create(...)
if a:0 > 1
let cols = a:1
let rows = a:2
@ -555,19 +581,21 @@ function! vimwiki#tbl#create(...) "{{{
for r in range(rows - 1)
call add(lines, row)
endfor
call append(line('.'), lines)
endfunction "}}}
function! vimwiki#tbl#align_or_cmd(cmd) "{{{
call append(line('.'), lines)
endfunction
function! vimwiki#tbl#align_or_cmd(cmd)
if s:is_table(getline('.'))
call vimwiki#tbl#format(line('.'))
else
exe 'normal! '.a:cmd
endif
endfunction "}}}
endfunction
function! vimwiki#tbl#reset_tw(lnum) "{{{
function! vimwiki#tbl#reset_tw(lnum)
if !(&filetype ==? 'vimwiki')
return
endif
@ -575,14 +603,14 @@ function! vimwiki#tbl#reset_tw(lnum) "{{{
if !s:is_table(line)
return
endif
let s:textwidth = &tw
let &tw = 0
endfunction "}}}
endfunction
" TODO: move_column_left and move_column_right are good candidates to be
" refactored.
function! vimwiki#tbl#move_column_left() "{{{
" TODO: move_column_left and move_column_right are good candidates to be refactored.
function! vimwiki#tbl#move_column_left()
"echomsg "DEBUG move_column_left: "
@ -598,7 +626,7 @@ function! vimwiki#tbl#move_column_left() "{{{
endif
if cur_col > 0
call vimwiki#tbl#format(line('.'), cur_col-1, cur_col)
call vimwiki#tbl#format(line('.'), cur_col-1, cur_col)
call cursor(line('.'), 1)
let sep = '\('.s:rxSep().'\).\zs'
@ -608,16 +636,16 @@ function! vimwiki#tbl#move_column_left() "{{{
let mpos = match(line, sep, mpos+1)
if mpos != -1
let col += 1
else
else
break
endif
endwhile
endif
endfunction
endfunction "}}}
function! vimwiki#tbl#move_column_right() "{{{
function! vimwiki#tbl#move_column_right()
let line = getline('.')
@ -631,7 +659,7 @@ function! vimwiki#tbl#move_column_right() "{{{
endif
if cur_col < s:col_count(line('.'))-1
call vimwiki#tbl#format(line('.'), cur_col, cur_col+1)
call vimwiki#tbl#format(line('.'), cur_col, cur_col+1)
call cursor(line('.'), 1)
let sep = '\('.s:rxSep().'\).\zs'
@ -641,33 +669,35 @@ function! vimwiki#tbl#move_column_right() "{{{
let mpos = match(line, sep, mpos+1)
if mpos != -1
let col += 1
else
else
break
endif
endwhile
endif
endfunction
endfunction "}}}
function! vimwiki#tbl#get_rows(lnum) "{{{
function! vimwiki#tbl#get_rows(lnum)
return s:get_rows(a:lnum)
endfunction "}}}
endfunction
function! vimwiki#tbl#is_table(line) "{{{
function! vimwiki#tbl#is_table(line)
return s:is_table(a:line)
endfunction "}}}
endfunction
function! vimwiki#tbl#is_separator(line) "{{{
function! vimwiki#tbl#is_separator(line)
return s:is_separator(a:line)
endfunction "}}}
endfunction
function! vimwiki#tbl#cell_splitter() "{{{
function! vimwiki#tbl#cell_splitter()
return s:cell_splitter()
endfunction "}}}
endfunction
function! vimwiki#tbl#sep_splitter() "{{{
function! vimwiki#tbl#sep_splitter()
return s:sep_splitter()
endfunction "}}}
endfunction
"}}}

View File

@ -1,9 +1,9 @@
" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=99
" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99
" Vimwiki autoload plugin file
" Desc: Utility functions
" Description: Utility functions
" Home: https://github.com/vimwiki/vimwiki/
function! vimwiki#u#trim(string, ...) "{{{
function! vimwiki#u#trim(string, ...)
let chars = ''
if a:0 > 0
let chars = a:1
@ -11,17 +11,20 @@ function! vimwiki#u#trim(string, ...) "{{{
let res = substitute(a:string, '^[[:space:]'.chars.']\+', '', '')
let res = substitute(res, '[[:space:]'.chars.']\+$', '', '')
return res
endfunction "}}}
endfunction
" Builtin cursor doesn't work right with unicode characters.
function! vimwiki#u#cursor(lnum, cnum) "{{{
function! vimwiki#u#cursor(lnum, cnum)
exe a:lnum
exe 'normal! 0'.a:cnum.'|'
endfunction "}}}
endfunction
function! vimwiki#u#is_windows() "{{{
function! vimwiki#u#is_windows()
return has("win32") || has("win64") || has("win95") || has("win16")
endfunction "}}}
endfunction
function! vimwiki#u#is_macos()
if has("mac") || has("macunix") || has("gui_mac")
@ -32,27 +35,32 @@ function! vimwiki#u#is_macos()
return os == 'Darwin' || os == 'Mac'
endfunction
function! vimwiki#u#count_first_sym(line) "{{{
function! vimwiki#u#count_first_sym(line)
let first_sym = matchstr(a:line, '\S')
return len(matchstr(a:line, first_sym.'\+'))
endfunction "}}}
endfunction
function! vimwiki#u#escape(string) "{{{
function! vimwiki#u#escape(string)
return escape(a:string, '~.*[]\^$')
endfunction "}}}
endfunction
" Load concrete Wiki syntax: sets regexes and templates for headers and links
function vimwiki#u#reload_regexes() "{{{
function vimwiki#u#reload_regexes()
execute 'runtime! syntax/vimwiki_'.vimwiki#vars#get_wikilocal('syntax').'.vim'
endfunction "}}}
endfunction
" Load syntax-specific functionality
function vimwiki#u#reload_regexes_custom() "{{{
function vimwiki#u#reload_regexes_custom()
execute 'runtime! syntax/vimwiki_'.vimwiki#vars#get_wikilocal('syntax').'_custom.vim'
endfunction "}}}
endfunction
" Backward compatible version of the built-in function shiftwidth()
if exists('*shiftwidth') "{{{
if exists('*shiftwidth')
func vimwiki#u#sw()
return shiftwidth()
endfunc
@ -60,4 +68,5 @@ else
func vimwiki#u#sw()
return &sw
endfunc
endif "}}}
endif

View File

@ -2,6 +2,8 @@
" Vimwiki autoload plugin file
" Home: https://github.com/vimwiki/vimwiki/
" ------------------------------------------------------------------------------------------------
" This file provides functions to manage the various state variables which are needed during a
" Vimwiki session.
@ -268,7 +270,7 @@ function! s:validate_settings()
endfunction
function! s:normalize_path(path) "{{{
function! s:normalize_path(path)
" trim trailing / and \ because otherwise resolve() doesn't work quite right
let path = substitute(a:path, '[/\\]\+$', '', '')
if path !~# '^scp:'
@ -276,7 +278,7 @@ function! s:normalize_path(path) "{{{
else
return path.'/'
endif
endfunction "}}}
endfunction
function! vimwiki#vars#populate_syntax_vars(syntax)
@ -703,7 +705,9 @@ function! vimwiki#vars#add_temporary_wiki(settings)
call s:validate_settings()
endfunction
" number of registered wikis + temporary
function! vimwiki#vars#number_of_wikis()
return len(g:vimwiki_wikilocal_vars) - 1
endfunction