I broke up with neovim....vim is my best friend now
This commit is contained in:
3074
dot_vim/plugged/vimwiki/autoload/vimwiki/base.vim
Normal file
3074
dot_vim/plugged/vimwiki/autoload/vimwiki/base.vim
Normal file
File diff suppressed because it is too large
Load Diff
13
dot_vim/plugged/vimwiki/autoload/vimwiki/default.tpl
Normal file
13
dot_vim/plugged/vimwiki/autoload/vimwiki/default.tpl
Normal file
@@ -0,0 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<link rel="Stylesheet" type="text/css" href="%root_path%%css%">
|
||||
<link rel="alternate" type="application/rss+xml" title="RSS" href="%root_path%%rss%">
|
||||
<title>%title%</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=%encoding%">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
</head>
|
||||
<body>
|
||||
%content%
|
||||
</body>
|
||||
</html>
|
||||
535
dot_vim/plugged/vimwiki/autoload/vimwiki/diary.vim
Normal file
535
dot_vim/plugged/vimwiki/autoload/vimwiki/diary.vim
Normal file
@@ -0,0 +1,535 @@
|
||||
" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99
|
||||
" Vimwiki autoload plugin file
|
||||
" Description: Handle diary notes
|
||||
" Home: https://github.com/vimwiki/vimwiki/
|
||||
|
||||
|
||||
" Clause: load only once
|
||||
if exists('g:loaded_vimwiki_diary_auto') || &compatible
|
||||
finish
|
||||
endif
|
||||
let g:loaded_vimwiki_diary_auto = 1
|
||||
|
||||
|
||||
function! s:prefix_zero(num) abort
|
||||
" Add zero prefix to a number
|
||||
if a:num < 10
|
||||
return '0'.a:num
|
||||
endif
|
||||
return a:num
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:diary_path(...) abort
|
||||
" Return: diary directory path <String>
|
||||
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
|
||||
|
||||
|
||||
function! s:diary_index(...) abort
|
||||
" Return: diary index file path <String>
|
||||
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
|
||||
|
||||
|
||||
function! vimwiki#diary#diary_date_link(...) abort
|
||||
" Return: <String> date
|
||||
|
||||
let wiki_nr = vimwiki#vars#get_bufferlocal('wiki_nr')
|
||||
if wiki_nr < 0 " this happens when called outside a wiki buffer
|
||||
let wiki_nr = 0
|
||||
endif
|
||||
|
||||
if wiki_nr >= vimwiki#vars#number_of_wikis()
|
||||
call vimwiki#u#error('Wiki '.wiki_nr.' is not registered in g:vimwiki_list!')
|
||||
return
|
||||
endif
|
||||
|
||||
if a:0
|
||||
let l:timestamp = a:1
|
||||
else
|
||||
let l:timestamp = localtime()
|
||||
endif
|
||||
|
||||
let l:delta_periods = 0
|
||||
if a:0 > 1
|
||||
let l:delta_periods = a:2
|
||||
endif
|
||||
|
||||
let l:day_s = 60*60*24
|
||||
|
||||
let l:weekday_number = {
|
||||
\ 'monday': 1, 'tuesday': 2,
|
||||
\ 'wednesday': 3, 'thursday': 4,
|
||||
\ 'friday': 5, 'saturday': 6,
|
||||
\ 'sunday': 0}
|
||||
|
||||
let l:frequency = vimwiki#vars#get_wikilocal('diary_frequency', wiki_nr)
|
||||
|
||||
if l:frequency ==? 'weekly'
|
||||
let l:start_week_day = vimwiki#vars#get_wikilocal('diary_start_week_day', wiki_nr)
|
||||
let l:weekday_num = str2nr(strftime('%w', l:timestamp))
|
||||
let l:days_to_end_of_week = (7-l:weekday_number[l:start_week_day]+weekday_num) % 7
|
||||
let l:computed_timestamp = l:timestamp
|
||||
\ + 7*l:day_s*l:delta_periods
|
||||
\ - l:day_s*l:days_to_end_of_week
|
||||
|
||||
elseif l:frequency ==? 'monthly'
|
||||
let l:day_of_month = str2nr(strftime('%d', l:timestamp))
|
||||
let l:beginning_of_month = l:timestamp - (l:day_of_month - 1)*l:day_s
|
||||
let l:middle_of_month = l:beginning_of_month + 15*l:day_s
|
||||
let l:middle_of_computed_month = l:middle_of_month + float2nr(30.5*l:day_s*l:delta_periods)
|
||||
let l:day_of_computed_month = str2nr(strftime('%d', l:middle_of_computed_month)) - 1
|
||||
let l:computed_timestamp = l:middle_of_computed_month - l:day_of_computed_month*l:day_s
|
||||
|
||||
elseif l:frequency ==? 'yearly'
|
||||
let l:day_of_year = str2nr(strftime('%j', l:timestamp))
|
||||
let l:beginning_of_year = l:timestamp - (l:day_of_year - 1)*l:day_s
|
||||
let l:middle_of_year = l:beginning_of_year + float2nr(365.25/2*l:day_s)
|
||||
let l:middle_of_computed_year = l:middle_of_year + float2nr(365.25*l:day_s*l:delta_periods)
|
||||
let l:day_of_computed_year = str2nr(strftime('%j', l:middle_of_computed_year)) - 1
|
||||
let l:computed_timestamp = l:middle_of_computed_year - l:day_of_computed_year*l:day_s
|
||||
|
||||
else "daily
|
||||
let l:computed_timestamp = localtime() + l:delta_periods*l:day_s
|
||||
endif
|
||||
|
||||
return strftime('%Y-%m-%d', l:computed_timestamp)
|
||||
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:get_position_links(link) abort
|
||||
" Return: <int:index, list:links>
|
||||
let idx = -1
|
||||
let links = []
|
||||
if a:link =~# '^\d\{4}-\d\d-\d\d'
|
||||
let links = map(vimwiki#diary#get_diary_files(), 'fnamemodify(v:val, ":t:r")')
|
||||
" include 'today' into links
|
||||
if index(links, vimwiki#diary#diary_date_link()) == -1
|
||||
call add(links, vimwiki#diary#diary_date_link())
|
||||
endif
|
||||
call sort(links)
|
||||
let idx = index(links, a:link)
|
||||
endif
|
||||
return [idx, links]
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:get_month_name(month) abort
|
||||
" Convert month: number -> name
|
||||
return vimwiki#vars#get_global('diary_months')[str2nr(a:month)]
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:get_first_header(fl) abort
|
||||
" Get the first header in the file within the first s:vimwiki_max_scan_for_caption lines.
|
||||
let header_rx = vimwiki#vars#get_syntaxlocal('rxHeader')
|
||||
|
||||
for line in readfile(a:fl, '', g:vimwiki_max_scan_for_caption)
|
||||
if line =~# header_rx
|
||||
return vimwiki#u#trim(matchstr(line, header_rx))
|
||||
endif
|
||||
endfor
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:get_all_headers(fl, maxlevel) abort
|
||||
" Get a list of all headers in a file up to a given level.
|
||||
" Return: list whose elements are pairs [level, title]
|
||||
let headers_rx = {}
|
||||
for i in range(1, a:maxlevel)
|
||||
let headers_rx[i] = vimwiki#vars#get_syntaxlocal('rxH'.i.'_Text')
|
||||
endfor
|
||||
|
||||
let headers = []
|
||||
for line in readfile(a:fl, '')
|
||||
for [i, header_rx] in items(headers_rx)
|
||||
if line =~# header_rx
|
||||
call add(headers, [i, vimwiki#u#trim(matchstr(line, header_rx))])
|
||||
break
|
||||
endif
|
||||
endfor
|
||||
endfor
|
||||
return headers
|
||||
endfunction
|
||||
|
||||
function! s:count_headers_level_less_equal(headers, maxlevel) abort
|
||||
" Count headers with level <= maxlevel in a list of [level, title] pairs.
|
||||
let l:count = 0
|
||||
for [header_level, _] in a:headers
|
||||
if header_level <= a:maxlevel
|
||||
let l:count += 1
|
||||
endif
|
||||
endfor
|
||||
return l:count
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:get_min_header_level(headers) abort
|
||||
" Get the minimum level of any header in a list of [level, title] pairs.
|
||||
if len(a:headers) == 0
|
||||
return 0
|
||||
endif
|
||||
let minlevel = a:headers[0][0]
|
||||
for [level, _] in a:headers
|
||||
let minlevel = min([minlevel, level])
|
||||
endfor
|
||||
return minlevel
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:read_captions(files) abort
|
||||
" Read all cpation in 1. <List>files
|
||||
" Return: <Dic>: key -> caption
|
||||
let result = {}
|
||||
let caption_level = vimwiki#vars#get_wikilocal('diary_caption_level')
|
||||
|
||||
for fl in a:files
|
||||
" Remove paths and extensions
|
||||
let fl_captions = {}
|
||||
|
||||
" Default; no captions from the file.
|
||||
let fl_captions['top'] = ''
|
||||
let fl_captions['rest'] = []
|
||||
|
||||
if caption_level >= 0 && filereadable(fl)
|
||||
if caption_level == 0
|
||||
" Take first header of any level as the top caption.
|
||||
let fl_captions['top'] = s:get_first_header(fl)
|
||||
else
|
||||
let headers = s:get_all_headers(fl, caption_level)
|
||||
if len(headers) > 0
|
||||
" If first header is the only one at its level or less, then make it the top caption.
|
||||
let [first_level, first_header] = headers[0]
|
||||
if s:count_headers_level_less_equal(headers, first_level) == 1
|
||||
let fl_captions['top'] = first_header
|
||||
call remove(headers, 0)
|
||||
endif
|
||||
|
||||
let min_header_level = s:get_min_header_level(headers)
|
||||
for [level, header] in headers
|
||||
call add(fl_captions['rest'], [level - min_header_level, header])
|
||||
endfor
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
let fl_key = substitute(fnamemodify(fl, ':t'), vimwiki#vars#get_wikilocal('ext').'$', '', '')
|
||||
let result[fl_key] = fl_captions
|
||||
endfor
|
||||
return result
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#diary#get_diary_files() abort
|
||||
" Return: <list> diary file names
|
||||
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 files = split(s_files, '\n')
|
||||
call filter(files, 'fnamemodify(v:val, ":t") =~# "'.escape(rx, '\').'"')
|
||||
|
||||
" remove backup files (.wiki~)
|
||||
call filter(files, 'v:val !~# ''.*\~$''')
|
||||
|
||||
return files
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:group_links(links) abort
|
||||
" Return: <dic> nested -> links
|
||||
let result = {}
|
||||
let p_year = 0
|
||||
let p_month = 0
|
||||
for fl in sort(keys(a:links))
|
||||
let year = strpart(fl, 0, 4)
|
||||
let month = strpart(fl, 5, 2)
|
||||
if p_year != year
|
||||
let result[year] = {}
|
||||
let p_month = 0
|
||||
endif
|
||||
if p_month != month
|
||||
let result[year][month] = {}
|
||||
endif
|
||||
let result[year][month][fl] = a:links[fl]
|
||||
let p_year = year
|
||||
let p_month = month
|
||||
endfor
|
||||
return result
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:sort(lst) abort
|
||||
" Sort list
|
||||
if vimwiki#vars#get_wikilocal('diary_sort') ==? 'desc'
|
||||
return reverse(sort(a:lst))
|
||||
else
|
||||
return sort(a:lst)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! vimwiki#diary#diary_sort(lst) abort
|
||||
return s:sort(a:lst)
|
||||
endfunction
|
||||
|
||||
function! vimwiki#diary#make_note(wnum, ...) abort
|
||||
" Create note
|
||||
" The given wiki number a:wnum is 1 for the first wiki, 2 for the second and so on. This is in
|
||||
" contrast to most other places, where counting starts with 0. When a:wnum is 0, the current wiki
|
||||
" is used.
|
||||
if a:wnum == 0
|
||||
let wiki_nr = vimwiki#vars#get_bufferlocal('wiki_nr')
|
||||
if wiki_nr < 0 " this happens when e.g. VimwikiMakeDiaryNote was called outside a wiki buffer
|
||||
let wiki_nr = 0
|
||||
endif
|
||||
else
|
||||
let wiki_nr = a:wnum - 1
|
||||
endif
|
||||
|
||||
if wiki_nr >= vimwiki#vars#number_of_wikis()
|
||||
call vimwiki#u#error('Wiki '.wiki_nr.' is not registered in g:vimwiki_list!')
|
||||
return
|
||||
endif
|
||||
|
||||
call vimwiki#path#mkdir(vimwiki#vars#get_wikilocal('path', wiki_nr).
|
||||
\ vimwiki#vars#get_wikilocal('diary_rel_path', wiki_nr))
|
||||
|
||||
let cmd = 'edit'
|
||||
if a:0
|
||||
if a:1 == 1
|
||||
let cmd = 'tabedit'
|
||||
elseif a:1 == 2
|
||||
let cmd = 'split'
|
||||
elseif a:1 == 3
|
||||
let cmd = 'vsplit'
|
||||
elseif a:1 == 4
|
||||
let cmd = 'tab drop'
|
||||
elseif a:1 == 5
|
||||
let cmd = 'drop'
|
||||
if exists(':drop')
|
||||
let cmd = 'drop'
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
if a:0>1
|
||||
let link = 'diary:'.a:2
|
||||
else
|
||||
let link = 'diary:'.vimwiki#diary#diary_date_link()
|
||||
endif
|
||||
|
||||
call vimwiki#base#open_link(cmd, link, s:diary_index(wiki_nr))
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#diary#goto_diary_index(wnum) abort
|
||||
" Jump to diary index of 1. <Int> wikinumber
|
||||
" if wnum = 0 the current wiki is used
|
||||
if a:wnum == 0
|
||||
let idx = vimwiki#vars#get_bufferlocal('wiki_nr')
|
||||
if idx < 0 " not in a wiki
|
||||
let idx = 0
|
||||
endif
|
||||
else
|
||||
let idx = a:wnum - 1 " convert to 0 based counting
|
||||
endif
|
||||
|
||||
if a:wnum > vimwiki#vars#number_of_wikis()
|
||||
call vimwiki#u#error('Wiki '.a:wnum.' is not registered in g:vimwiki_list!')
|
||||
return
|
||||
endif
|
||||
|
||||
call vimwiki#base#edit_file('e', s:diary_index(idx), '')
|
||||
|
||||
if vimwiki#vars#get_wikilocal('auto_diary_index')
|
||||
call vimwiki#diary#generate_diary_section()
|
||||
write! " save changes
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#diary#goto_next_day() abort
|
||||
" Jump to next day
|
||||
let link = ''
|
||||
let [idx, links] = s:get_position_links(expand('%:t:r'))
|
||||
|
||||
if idx == (len(links) - 1)
|
||||
return
|
||||
endif
|
||||
|
||||
if idx != -1 && idx < len(links) - 1
|
||||
let link = 'diary:'.links[idx+1]
|
||||
else
|
||||
" goto today
|
||||
let link = 'diary:'.vimwiki#diary#diary_date_link()
|
||||
endif
|
||||
|
||||
if len(link)
|
||||
call vimwiki#base#open_link(':e ', link)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#diary#goto_prev_day() abort
|
||||
" Jump to previous day
|
||||
let link = ''
|
||||
let [idx, links] = s:get_position_links(expand('%:t:r'))
|
||||
|
||||
if idx == 0
|
||||
return
|
||||
endif
|
||||
|
||||
if idx > 0
|
||||
let link = 'diary:'.links[idx-1]
|
||||
else
|
||||
" goto today
|
||||
let link = 'diary:'.vimwiki#diary#diary_date_link()
|
||||
endif
|
||||
|
||||
if len(link)
|
||||
call vimwiki#base#open_link(':e ', link)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#diary#generate_diary_section() abort
|
||||
" Create diary index content
|
||||
let GeneratorDiary = copy(l:)
|
||||
function! GeneratorDiary.f() abort
|
||||
let lines = []
|
||||
|
||||
let links_with_captions = s:read_captions(vimwiki#diary#get_diary_files())
|
||||
let g_files = s:group_links(links_with_captions)
|
||||
let g_keys = s:sort(keys(g_files))
|
||||
|
||||
for year in g_keys
|
||||
if len(lines) > 0
|
||||
call add(lines, '')
|
||||
endif
|
||||
|
||||
call add(lines, substitute(vimwiki#vars#get_syntaxlocal('rxH2_Template'), '__Header__', year , ''))
|
||||
|
||||
for month in s:sort(keys(g_files[year]))
|
||||
call add(lines, '')
|
||||
call add(lines, substitute(vimwiki#vars#get_syntaxlocal('rxH3_Template'),
|
||||
\ '__Header__', s:get_month_name(month), ''))
|
||||
|
||||
if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown'
|
||||
for _ in range(vimwiki#vars#get_global('markdown_header_style'))
|
||||
call add(lines, '')
|
||||
endfor
|
||||
endif
|
||||
|
||||
for [fl, captions] in s:sort(items(g_files[year][month]))
|
||||
let topcap = captions['top']
|
||||
let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate2')
|
||||
|
||||
if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown'
|
||||
let link_tpl = vimwiki#vars#get_syntaxlocal('Weblink1Template')
|
||||
|
||||
if empty(topcap) " When using markdown syntax, we should ensure we always have a link description.
|
||||
let topcap = fl
|
||||
endif
|
||||
endif
|
||||
|
||||
if empty(topcap)
|
||||
let top_link_tpl = vimwiki#vars#get_global('WikiLinkTemplate1')
|
||||
else
|
||||
let top_link_tpl = link_tpl
|
||||
endif
|
||||
|
||||
let bullet = vimwiki#lst#default_symbol().' '
|
||||
let entry = substitute(top_link_tpl, '__LinkUrl__', fl, '')
|
||||
let entry = substitute(entry, '__LinkDescription__', topcap, '')
|
||||
let wiki_nr = vimwiki#vars#get_bufferlocal('wiki_nr')
|
||||
let extension = vimwiki#vars#get_wikilocal('ext', wiki_nr)
|
||||
let entry = substitute(entry, '__FileExtension__', extension, 'g')
|
||||
" If single H1 then that will be used as the description for the link to the file
|
||||
" if multple H1 then the filename will be used as the description for the link to the
|
||||
" file and multiple H1 headers will be indented by shiftwidth
|
||||
call add(lines, repeat(' ', vimwiki#lst#get_list_margin()).bullet.entry)
|
||||
|
||||
let startindent = repeat(' ', vimwiki#lst#get_list_margin())
|
||||
let indentstring = repeat(' ', vimwiki#u#sw())
|
||||
|
||||
for [depth, subcap] in captions['rest']
|
||||
if empty(subcap)
|
||||
continue
|
||||
endif
|
||||
let entry = substitute(link_tpl, '__LinkUrl__', fl.'#'.subcap, '')
|
||||
let entry = substitute(entry, '__LinkDescription__', subcap, '')
|
||||
" if single H1 then depth H2=0, H3=1, H4=2, H5=3, H6=4
|
||||
" if multiple H1 then depth H1= 0, H2=1, H3=2, H4=3, H5=4, H6=5
|
||||
" indent subsequent headers levels by shiftwidth
|
||||
call add(lines, startindent.repeat(indentstring, depth+1).bullet.entry)
|
||||
endfor
|
||||
endfor
|
||||
|
||||
endfor
|
||||
endfor
|
||||
|
||||
return lines
|
||||
endfunction
|
||||
|
||||
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)
|
||||
let content_rx = '^\%('.vimwiki#vars#get_syntaxlocal('rxHeader').'\)\|'.
|
||||
\ '\%(^\s*$\)\|\%('.vimwiki#vars#get_syntaxlocal('rxListBullet').'\)'
|
||||
|
||||
call vimwiki#base#update_listing_in_buffer(
|
||||
\ GeneratorDiary,
|
||||
\ vimwiki#vars#get_wikilocal('diary_header'),
|
||||
\ content_rx,
|
||||
\ 1,
|
||||
\ 1,
|
||||
\ 1)
|
||||
else
|
||||
call vimwiki#u#error('You can generate diary links only in a diary index page!')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#diary#calendar_action(day, month, year, week, dir) abort
|
||||
" Callback function for Calendar.vim
|
||||
let day = s:prefix_zero(a:day)
|
||||
let month = s:prefix_zero(a:month)
|
||||
|
||||
let link = a:year.'-'.month.'-'.day
|
||||
if winnr('#') == 0
|
||||
if a:dir ==? 'V'
|
||||
vsplit
|
||||
else
|
||||
split
|
||||
endif
|
||||
else
|
||||
wincmd p
|
||||
if !&hidden && &modified
|
||||
new
|
||||
endif
|
||||
endif
|
||||
|
||||
call vimwiki#diary#make_note(0, 0, link)
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#diary#calendar_sign(day, month, year) abort
|
||||
" Callback function for Calendar.vim
|
||||
" Clause: no wiki no sign #290
|
||||
if len(g:vimwiki_list) <= 0
|
||||
return
|
||||
endif
|
||||
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
|
||||
|
||||
function! vimwiki#diary#diary_file_captions() abort
|
||||
return s:read_captions(vimwiki#diary#get_diary_files())
|
||||
endfunction
|
||||
1831
dot_vim/plugged/vimwiki/autoload/vimwiki/emoji.vim
Normal file
1831
dot_vim/plugged/vimwiki/autoload/vimwiki/emoji.vim
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,61 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
#
|
||||
# This script converts markdown into html, to be used with vimwiki's
|
||||
# "customwiki2html" option. Experiment with the two proposed methods by
|
||||
# commenting / uncommenting the relevant lines below.
|
||||
#
|
||||
# NEW! An alternative converter was developed by Jason6Anderson, and can
|
||||
# be located at https://github.com/vimwiki-backup/vimwiki/issues/384
|
||||
#
|
||||
#
|
||||
# To use this script, you must have the Discount converter installed.
|
||||
#
|
||||
# http://www.pell.portland.or.us/~orc/Code/discount/
|
||||
#
|
||||
# To verify your installation, check that the commands markdown and mkd2html,
|
||||
# are on your path.
|
||||
#
|
||||
# Also verify that this file is executable.
|
||||
#
|
||||
# Then, in your .vimrc file, set:
|
||||
#
|
||||
# g:vimwiki_custom_wiki2html=$HOME.'/.vim/autoload/vimwiki/customwiki2html.sh'
|
||||
#
|
||||
# On your next restart, Vimwiki will run this script instead of using the
|
||||
# internal wiki2html converter.
|
||||
#
|
||||
|
||||
MKD2HTML=mkd2html
|
||||
|
||||
|
||||
# shellcheck disable=SC2034 # FORCE appears unused
|
||||
FORCE="$1"
|
||||
SYNTAX="$2"
|
||||
EXTENSION="$3"
|
||||
OUTPUTDIR="$4"
|
||||
INPUT="$5"
|
||||
CSSFILE="$6"
|
||||
|
||||
|
||||
[[ "$SYNTAX" == "markdown" ]] || { echo "Error: Unsupported syntax"; exit 2; };
|
||||
|
||||
OUTPUT="$OUTPUTDIR/$(basename "$INPUT" ."$EXTENSION").html"
|
||||
|
||||
# # Method 1:
|
||||
# FORCEFLAG=
|
||||
# (( "$FORCE" == 0 )) || { FORCEFLAG="-f"; };
|
||||
# MARKDOWN=markdown
|
||||
#
|
||||
# # markdown [-d] [-T] [-V] [-b url-base] [-C prefix] [-F bitmap] [-f flags] [-o file] [-s text] [-t text] [textfile]
|
||||
#
|
||||
# URLBASE=http://example.com
|
||||
# $MARKDOWN -T -b $URLBASE -o $OUTPUT $INPUT
|
||||
|
||||
|
||||
# Method 2:
|
||||
# mkd2html [-css file] [-header string] [-footer string] [file]
|
||||
|
||||
$MKD2HTML -css "$CSSFILE" "$INPUT"
|
||||
OUTPUTTMP=$(dirname "$INPUT")/$(basename "$INPUT" ."$EXTENSION").html
|
||||
mv -f "$OUTPUTTMP" "$OUTPUT"
|
||||
2107
dot_vim/plugged/vimwiki/autoload/vimwiki/html.vim
Normal file
2107
dot_vim/plugged/vimwiki/autoload/vimwiki/html.vim
Normal file
File diff suppressed because it is too large
Load Diff
1844
dot_vim/plugged/vimwiki/autoload/vimwiki/lst.vim
Normal file
1844
dot_vim/plugged/vimwiki/autoload/vimwiki/lst.vim
Normal file
File diff suppressed because it is too large
Load Diff
115
dot_vim/plugged/vimwiki/autoload/vimwiki/markdown_base.vim
Normal file
115
dot_vim/plugged/vimwiki/autoload/vimwiki/markdown_base.vim
Normal file
@@ -0,0 +1,115 @@
|
||||
" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99
|
||||
" Vimwiki autoload plugin file
|
||||
" Description: Link functions for markdown syntax
|
||||
" Home: https://github.com/vimwiki/vimwiki/
|
||||
|
||||
|
||||
function! s:safesubstitute(text, search, replace, mode) abort
|
||||
" Substitute regexp but do not interpret replace
|
||||
let escaped = escape(a:replace, '\&')
|
||||
return substitute(a:text, a:search, escaped, a:mode)
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#markdown_base#scan_reflinks() abort
|
||||
let mkd_refs = {}
|
||||
" construct list of references using vimgrep
|
||||
try
|
||||
" Why noautocmd? Because https://github.com/vimwiki/vimwiki/issues/121
|
||||
noautocmd execute 'vimgrep #'.vimwiki#vars#get_syntaxlocal('rxMkdRef').'#j %'
|
||||
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'))
|
||||
let url = matchstr(matchline, vimwiki#vars#get_syntaxlocal('rxMkdRefMatchUrl'))
|
||||
if descr !=? '' && url !=? ''
|
||||
let mkd_refs[descr] = url
|
||||
endif
|
||||
endfor
|
||||
call vimwiki#vars#set_bufferlocal('markdown_refs', mkd_refs)
|
||||
return mkd_refs
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#markdown_base#open_reflink(link) abort
|
||||
" try markdown reference links
|
||||
let link = a:link
|
||||
let mkd_refs = vimwiki#vars#get_bufferlocal('markdown_refs')
|
||||
if has_key(mkd_refs, link)
|
||||
let url = mkd_refs[link]
|
||||
call vimwiki#base#system_open_link(url)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:normalize_link_syntax_n() abort
|
||||
let lnum = line('.')
|
||||
|
||||
" try WikiIncl
|
||||
let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_global('rxWikiIncl'))
|
||||
if !empty(lnk)
|
||||
" NO-OP !!
|
||||
return
|
||||
endif
|
||||
|
||||
" try WikiLink0: replace with WikiLink1
|
||||
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('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_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('Weblink1Template'))
|
||||
call vimwiki#base#replacestr_at_cursor(vimwiki#vars#get_syntaxlocal('rxWeblink'), sub)
|
||||
return
|
||||
endif
|
||||
|
||||
" try Word (any characters except separators)
|
||||
" rxWord is less permissive than rxWikiLinkUrl which is used in
|
||||
" normalize_link_syntax_v
|
||||
let lnk = vimwiki#base#matchstr_at_cursor(vimwiki#vars#get_global('rxWord'))
|
||||
if !empty(lnk)
|
||||
if vimwiki#base#is_diary_file(expand('%:p'))
|
||||
let sub = vimwiki#base#normalize_link_in_diary(lnk)
|
||||
else
|
||||
let sub = vimwiki#base#normalize_link_helper(lnk,
|
||||
\ vimwiki#vars#get_global('rxWord'), '',
|
||||
\ vimwiki#vars#get_syntaxlocal('Link1'))
|
||||
endif
|
||||
call vimwiki#base#replacestr_at_cursor('\V'.lnk, sub)
|
||||
return
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#markdown_base#normalize_link() abort
|
||||
" TODO mutualize with base
|
||||
call s:normalize_link_syntax_n()
|
||||
endfunction
|
||||
251
dot_vim/plugged/vimwiki/autoload/vimwiki/path.vim
Normal file
251
dot_vim/plugged/vimwiki/autoload/vimwiki/path.vim
Normal file
@@ -0,0 +1,251 @@
|
||||
" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99
|
||||
" Vimwiki autoload plugin file
|
||||
" Description: Path manipulation functions
|
||||
" Home: https://github.com/vimwiki/vimwiki/
|
||||
|
||||
|
||||
|
||||
function! s:unixify(path) abort
|
||||
" Unixify Path:
|
||||
return substitute(a:path, '\', '/', 'g')
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:windowsify(path) abort
|
||||
" Windowsify Path:
|
||||
return substitute(a:path, '/', '\', 'g')
|
||||
endfunction
|
||||
|
||||
|
||||
" Define: os specific path convertion
|
||||
if vimwiki#u#is_windows()
|
||||
function! s:osxify(path) abort
|
||||
return s:windowsify(a:path)
|
||||
endfunction
|
||||
else
|
||||
function! s:osxify(path) abort
|
||||
return s:unixify(a:path)
|
||||
endfunction
|
||||
endif
|
||||
|
||||
|
||||
function! vimwiki#path#chomp_slash(str) abort
|
||||
" Remove Delimiter: of last path (slash or backslash)
|
||||
return substitute(a:str, '[/\\]\+$', '', '')
|
||||
endfunction
|
||||
|
||||
|
||||
" Define: path-compare function, either case-sensitive or not, depending on OS.
|
||||
if vimwiki#u#is_windows()
|
||||
function! vimwiki#path#is_equal(p1, p2) abort
|
||||
return a:p1 ==? a:p2
|
||||
endfunction
|
||||
else
|
||||
function! vimwiki#path#is_equal(p1, p2) abort
|
||||
return a:p1 ==# a:p2
|
||||
endfunction
|
||||
endif
|
||||
|
||||
|
||||
function! vimwiki#path#normalize(path) abort
|
||||
" Collapse Sections: like /a/b/../c to /a/c and /a/b/./c to /a/b/c
|
||||
let path = a:path
|
||||
while 1
|
||||
let intermediateResult = substitute(path, '/[^/]\+/\.\.', '', '')
|
||||
let result = substitute(intermediateResult, '/\./', '/', '')
|
||||
if result ==# path
|
||||
break
|
||||
endif
|
||||
let path = result
|
||||
endwhile
|
||||
return result
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#path#path_norm(path) abort
|
||||
" Normalize Path: \ -> / && /// -> / && resolve(symlinks)
|
||||
" return if scp
|
||||
if a:path =~# '^scp:' | return a:path | endif
|
||||
" convert backslash to slash
|
||||
let path = substitute(a:path, '\', '/', 'g')
|
||||
" treat multiple consecutive slashes as one path separator
|
||||
let path = substitute(path, '/\+', '/', 'g')
|
||||
" ensure that we are not fooled by a symbolic link
|
||||
return resolve(path)
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#path#is_link_to_dir(link) abort
|
||||
" Check: if link is to a directory
|
||||
" It should be ended with \ or /.
|
||||
return a:link =~# '\m[/\\]$'
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#path#abs_path_of_link(link) abort
|
||||
" Get: absolute path <- path relative to current file
|
||||
return vimwiki#path#normalize(expand('%:p:h').'/'.a:link)
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#path#path_common_pfx(path1, path2) abort
|
||||
" Returns: longest common path prefix of 2 given paths.
|
||||
" Ex: '~/home/usrname/wiki', '~/home/usrname/wiki/shmiki' => '~/home/usrname/wiki'
|
||||
let p1 = split(a:path1, '[/\\]', 1)
|
||||
let p2 = split(a:path2, '[/\\]', 1)
|
||||
|
||||
let idx = 0
|
||||
let minlen = min([len(p1), len(p2)])
|
||||
while (idx < minlen) && vimwiki#path#is_equal(p1[idx], p2[idx])
|
||||
let idx = idx + 1
|
||||
endwhile
|
||||
if idx == 0
|
||||
return ''
|
||||
else
|
||||
return join(p1[: idx-1], '/')
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#path#wikify_path(path) abort
|
||||
" Convert: path -> full resolved slashed 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
|
||||
|
||||
|
||||
function! vimwiki#path#current_wiki_file() abort
|
||||
" Return: Current file path relative
|
||||
return vimwiki#path#wikify_path(expand('%:p'))
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#path#relpath(dir, file) abort
|
||||
" Return: the relative path from a:dir to a:file
|
||||
" Check if dir here ('.') -> return file
|
||||
if empty(a:dir) || a:dir =~# '^\.[/\\]\?$'
|
||||
return a:file
|
||||
endif
|
||||
" Unixify && Expand in
|
||||
let s_dir = s:unixify(expand(a:dir))
|
||||
let s_file = s:unixify(expand(a:file))
|
||||
|
||||
" Split path
|
||||
let dir = split(s_dir, '/')
|
||||
let file = split(s_file, '/')
|
||||
|
||||
" Shorten loop till equality
|
||||
while (len(dir) > 0 && len(file) > 0) && vimwiki#path#is_equal(dir[0], file[0])
|
||||
call remove(dir, 0)
|
||||
call remove(file, 0)
|
||||
endwhile
|
||||
|
||||
" Return './' if nothing left
|
||||
if empty(dir) && empty(file)
|
||||
return s:osxify('./')
|
||||
endif
|
||||
|
||||
" Build path segment
|
||||
let segments = []
|
||||
for segment in dir
|
||||
let segments += ['..']
|
||||
endfor
|
||||
for segment in file
|
||||
let segments += [segment]
|
||||
endfor
|
||||
|
||||
" Join segments
|
||||
let result_path = join(segments, '/')
|
||||
if a:file =~# '\m/$'
|
||||
let result_path .= '/'
|
||||
endif
|
||||
|
||||
return result_path
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#path#mkdir(path, ...) abort
|
||||
" Mkdir:
|
||||
" if the optional argument provided and nonzero,
|
||||
" it will ask before creating a directory
|
||||
" returns: 1 iff directory exists or successfully created
|
||||
let path = expand(a:path)
|
||||
|
||||
if path =~# '^scp:'
|
||||
" we can not do much, so let's pretend everything is ok
|
||||
return 1
|
||||
endif
|
||||
|
||||
if isdirectory(path)
|
||||
return 1
|
||||
else
|
||||
if !exists('*mkdir')
|
||||
return 0
|
||||
endif
|
||||
|
||||
let path = vimwiki#path#chomp_slash(path)
|
||||
if vimwiki#u#is_windows() && !empty(vimwiki#vars#get_global('w32_dir_enc'))
|
||||
let path = iconv(path, &encoding, 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'
|
||||
return 0
|
||||
endif
|
||||
|
||||
call mkdir(path, 'p')
|
||||
return 1
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#path#is_absolute(path) abort
|
||||
" Check: if path is absolute
|
||||
let res=0
|
||||
|
||||
" Match 'C:' or '/' or '~'
|
||||
if vimwiki#u#is_windows()
|
||||
let res += a:path =~? '\m^\a:'
|
||||
else
|
||||
let res += a:path =~# '\m^/\|\~/'
|
||||
endif
|
||||
|
||||
" Do not prepend root_path to scp files
|
||||
" See: https://vim.fandom.com/wiki/Editing_remote_files_via_scp_in_vim
|
||||
let res += a:path =~# '\m^scp:'
|
||||
|
||||
return res
|
||||
endfunction
|
||||
|
||||
|
||||
|
||||
function! s:get_wikifile_link(wikifile) abort
|
||||
return vimwiki#base#subdir(vimwiki#vars#get_wikilocal('path'), a:wikifile).
|
||||
\ fnamemodify(a:wikifile, ':t:r')
|
||||
endfunction
|
||||
|
||||
function! vimwiki#path#PasteLink(wikifile) abort
|
||||
call append(line('.'), '[[/'.s:get_wikifile_link(a:wikifile).']]')
|
||||
endfunction
|
||||
|
||||
|
||||
if vimwiki#u#is_windows()
|
||||
" Combine: a directory and a file into one path, doesn't generate duplicate
|
||||
" path separator in case the directory is also having an ending / or \. This
|
||||
" is because on windows ~\vimwiki//.tags is invalid but ~\vimwiki/.tags is a
|
||||
" valid path.
|
||||
function! vimwiki#path#join_path(directory, file) abort
|
||||
let directory = vimwiki#path#chomp_slash(a:directory)
|
||||
let file = substitute(a:file, '\m^[\\/]\+', '', '')
|
||||
return directory . '/' . file
|
||||
endfunction
|
||||
else
|
||||
function! vimwiki#path#join_path(directory, file) abort
|
||||
let directory = substitute(a:directory, '\m/\+$', '', '')
|
||||
let file = substitute(a:file, '\m^/\+', '', '')
|
||||
return directory . '/' . file
|
||||
endfunction
|
||||
endif
|
||||
187
dot_vim/plugged/vimwiki/autoload/vimwiki/style.css
Normal file
187
dot_vim/plugged/vimwiki/autoload/vimwiki/style.css
Normal file
@@ -0,0 +1,187 @@
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;;
|
||||
margin: 2em 4em 2em 4em;
|
||||
font-size: 120%;
|
||||
line-height: 130%;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-weight: bold;
|
||||
line-height:100%;
|
||||
margin-top: 1.5em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
h1 {font-size: 2em; color: #000000;}
|
||||
h2 {font-size: 1.8em; color: #404040;}
|
||||
h3 {font-size: 1.6em; color: #707070;}
|
||||
h4 {font-size: 1.4em; color: #909090;}
|
||||
h5 {font-size: 1.2em; color: #989898;}
|
||||
h6 {font-size: 1em; color: #9c9c9c;}
|
||||
|
||||
p, pre, blockquote, table, ul, ol, dl {
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
ul ul, ul ol, ol ol, ol ul {
|
||||
margin-top: 0.5em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
li { margin: 0.3em auto; }
|
||||
|
||||
ul {
|
||||
margin-left: 2em;
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
dt { font-weight: bold; }
|
||||
|
||||
img { border: none; }
|
||||
|
||||
pre {
|
||||
border-left: 5px solid #dcdcdc;
|
||||
background-color: #f5f5f5;
|
||||
padding-left: 1em;
|
||||
font-family: Monaco, "Courier New", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", monospace;
|
||||
font-size: 0.8em;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
p > a {
|
||||
color: white;
|
||||
text-decoration: none;
|
||||
font-size: 0.7em;
|
||||
padding: 3px 6px;
|
||||
border-radius: 3px;
|
||||
background-color: #1e90ff;
|
||||
text-transform: uppercase;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
p > a:hover {
|
||||
color: #dcdcdc;
|
||||
background-color: #484848;
|
||||
}
|
||||
|
||||
li > a {
|
||||
color: #1e90ff;
|
||||
font-weight: bold;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
li > a:hover { color: #ff4500; }
|
||||
|
||||
blockquote {
|
||||
color: #686868;
|
||||
font-size: 0.8em;
|
||||
line-height: 120%;
|
||||
padding: 0.8em;
|
||||
border-left: 5px solid #dcdcdc;
|
||||
}
|
||||
|
||||
th, td {
|
||||
border: 1px solid #ccc;
|
||||
padding: 0.3em;
|
||||
}
|
||||
|
||||
th { background-color: #f0f0f0; }
|
||||
|
||||
hr {
|
||||
border: none;
|
||||
border-top: 1px solid #ccc;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
del {
|
||||
text-decoration: line-through;
|
||||
color: #777777;
|
||||
}
|
||||
|
||||
.toc li { list-style-type: none; }
|
||||
|
||||
.todo {
|
||||
font-weight: bold;
|
||||
background-color: #ff4500 ;
|
||||
color: white;
|
||||
font-size: 0.8em;
|
||||
padding: 3px 6px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.justleft { text-align: left; }
|
||||
.justright { text-align: right; }
|
||||
.justcenter { text-align: center; }
|
||||
|
||||
.center {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.tag {
|
||||
background-color: #eeeeee;
|
||||
font-family: monospace;
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
.header a {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
/* classes for items of todo lists */
|
||||
|
||||
.rejected {
|
||||
/* list-style: none; */
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAAACXBIWXMAAADFAAAAxQEdzbqoAAAAB3RJTUUH4QgEFhAtuWgv9wAAAPZQTFRFmpqam5iYnJaWnJeXnpSUn5OTopCQpoqKpouLp4iIqIiIrYCAt3V1vW1tv2xsmZmZmpeXnpKS/x4e/x8f/yAg/yIi/yQk/yUl/yYm/ygo/ykp/yws/zAw/zIy/zMz/zQ0/zU1/zY2/zw8/0BA/0ZG/0pK/1FR/1JS/1NT/1RU/1VV/1ZW/1dX/1pa/15e/19f/2Zm/2lp/21t/25u/3R0/3p6/4CA/4GB/4SE/4iI/46O/4+P/52d/6am/6ur/66u/7Oz/7S0/7e3/87O/9fX/9zc/93d/+Dg/+vr/+3t/+/v//Dw//Ly//X1//f3//n5//z8////gzaKowAAAA90Uk5T/Pz8/Pz8/Pz8/Pz8/f39ppQKWQAAAAFiS0dEEnu8bAAAAACuSURBVAhbPY9ZF4FQFEZPSKbIMmWep4gMGTKLkIv6/3/GPbfF97b3w17rA0kQOPgvAeHW6uJ6+5h7HqLdwowgOzejXRXBdx6UdSru216xuOMBHHNU0clTzeSUA6EhF8V8kqroluMiU6HKcuf4phGPr1o2q9kYZWwNq1qfRRmTaXpqsyjj17KkWCxKBUBgXWueHIyiAIg18gsse4KHkLF5IKIY10WQgv7fOy4ST34BRiopZ8WLNrgAAAAASUVORK5CYII=);
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0 .2em;
|
||||
padding-left: 1.5em;
|
||||
}
|
||||
.done0 {
|
||||
/* list-style: none; */
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAxQAAAMUBHc26qAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAA7SURBVCiR7dMxEgAgCANBI3yVRzF5KxNbW6wsuH7LQ2YKQK1mkswBVERYF5Os3UV3gwd/jF2SkXy66gAZkxS6BniubAAAAABJRU5ErkJggg==);
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0 .2em;
|
||||
padding-left: 1.5em;
|
||||
}
|
||||
.done1 {
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAxQAAAMUBHc26qAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABtSURBVCiR1ZO7DYAwDER9BDmTeZQMFXmUbGYpOjrEryA0wOvO8itOslFrJYAug5BMM4BeSkmjsrv3aVTa8p48Xw1JSkSsWVUFwD05IqS1tmYzk5zzae9jnVVVzGyXb8sALjse+euRkEzu/uirFomVIdDGOLjuAAAAAElFTkSuQmCC);
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0 .15em;
|
||||
padding-left: 1.5em;
|
||||
}
|
||||
.done2 {
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAxQAAAMUBHc26qAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAB1SURBVCiRzdO5DcAgDAVQGxjAYgTvxlDIu1FTIRYAp8qlFISkSH7l5kk+ZIwxKiI2mIyqWoeILYRgZ7GINDOLjnmF3VqklKCUMgTee2DmM661Qs55iI3Zm/1u5h9sm4ig9z4ERHTFzLyd4G4+nFlVrYg8+qoF/c0kdpeMsmcAAAAASUVORK5CYII=);
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0 .15em;
|
||||
padding-left: 1.5em;
|
||||
}
|
||||
.done3 {
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAxQAAAMUBHc26qAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAABoSURBVCiR7dOxDcAgDATA/0DtUdiKoZC3YhLkHjkVKF3idJHiztKfvrHZWnOSE8Fx95RJzlprimJVnXktvXeY2S0SEZRSAAAbmxnGGKH2I5T+8VfxPhIReQSuuY3XyYWa3T2p6quvOgGrvSFGlewuUAAAAABJRU5ErkJggg==);
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0 .15em;
|
||||
padding-left: 1.5em;
|
||||
}
|
||||
.done4 {
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAYAAAAbBi9cAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAzgAAAM4BlP6ToAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIISURBVDiNnZQ9SFtRFMd/773kpTaGJoQk1im4VDpWQcTNODhkFBcVTCNCF0NWyeDiIIiCm82QoIMIUkHUxcFBg1SEQoZszSat6cdTn1qNue92CMbEr9Sey+XC/Z/zu+f8h6ukUil3sVg0+M+4cFxk42/jH2wAqqqKSCSiPQdwcHHAnDHH9s/tN1h8V28ETdP+eU8fT9Nt62ancYdIPvJNtsu87bmjrJlrTDVM4RROJs1JrHPrD4Bar7A6cpc54iKOaTdJXCUI2UMVrQZ0Js7YPN18ECKkYNQcJe/OE/4dZsw7VqNXQMvHy3QZXQypQ6ycrtwDjf8aJ+PNEDSCzLpn7+m2pD8ZKHlKarYhy6XjEoCYGcN95qansQeA3fNdki+SaJZGTMQIOoL3W/Z89rxv+tokubNajlvk/vm+LFpF2XnUKZHI0I+QrI7Dw0OZTqdzUkpsM7mZTyfy5OPGyw1tK7AFSvmB/Ks8w8YwbUYbe6/3QEKv0vugfxWPnMLJun+d/kI/WLdizpNjMbAIKrhMF4OuwadBALqqs+RfInwUvuNi+fBd+wjogfogAFVRmffO02q01mZZ0HHdgXIzdz0QQLPezIQygX6llxNKKgOFARYCC49CqhoHIUTlss/Vx2phlYwjw8j1CAlfAiwQiJpiy7o1VHnsG5FISkoJu7Q/2YmmaV+i0ei7v38L2CBguSi5AAAAAElFTkSuQmCC);
|
||||
background-repeat: no-repeat;
|
||||
background-position: 0 .15em;
|
||||
padding-left: 1.5em;
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: Monaco, "Courier New", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", monospace;
|
||||
-webkit-border-radius: 1px;
|
||||
-moz-border-radius: 1px;
|
||||
border-radius: 1px;
|
||||
-moz-background-clip: padding;
|
||||
-webkit-background-clip: padding-box;
|
||||
background-clip: padding-box;
|
||||
padding: 0px 3px;
|
||||
display: inline-block;
|
||||
color: #52595d;
|
||||
border: 1px solid #ccc;
|
||||
background-color: #f9f9f9;
|
||||
}
|
||||
450
dot_vim/plugged/vimwiki/autoload/vimwiki/tags.vim
Normal file
450
dot_vim/plugged/vimwiki/autoload/vimwiki/tags.vim
Normal file
@@ -0,0 +1,450 @@
|
||||
" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99
|
||||
" Vimwiki autoload plugin file
|
||||
" Description: Tag manipulation functions
|
||||
" Home: https://github.com/vimwiki/vimwiki/
|
||||
"
|
||||
" Tags metadata in-memory format:
|
||||
" metadata := { 'pagename': [entries, ...] }
|
||||
" entry := { 'tagname':..., 'lineno':..., 'link':... }
|
||||
|
||||
" Tags metadata in-file format:
|
||||
"
|
||||
" Is based on CTags format (see |tags-file-format|) and
|
||||
" https://ctags.sourceforge.net/FORMAT
|
||||
"
|
||||
" {tagaddress} is set to lineno. We'll let vim search by exact line number; we
|
||||
" can afford that, we assume metadata file is always updated before use.
|
||||
"
|
||||
" Pagename and link are not saved in standard ctags fields, so we'll add
|
||||
" an optional field, "vimwiki:". In this field, we encode tab-separated values
|
||||
" of missing parameters -- "pagename" and "link".
|
||||
|
||||
|
||||
let s:TAGS_METADATA_FILE_NAME = '.vimwiki_tags'
|
||||
|
||||
|
||||
function! vimwiki#tags#update_tags(full_rebuild, all_files) abort
|
||||
" Update tags metadata.
|
||||
" Param: a:full_rebuild == 1: re-scan entire wiki
|
||||
" Param: a:full_rebuild == 0: only re-scan current page
|
||||
" a:all_files == '': only if the file is newer than .tags
|
||||
let all_files = a:all_files !=? ''
|
||||
if !a:full_rebuild
|
||||
" Updating for one page (current)
|
||||
let page_name = vimwiki#vars#get_bufferlocal('subdir') . expand('%:t:r')
|
||||
" Collect tags in current file
|
||||
let tags = s:scan_tags(getline(1, '$'), page_name)
|
||||
" Load metadata file
|
||||
let metadata = s:load_tags_metadata()
|
||||
" Drop old tags
|
||||
let metadata = s:remove_page_from_tags(metadata, page_name)
|
||||
" Merge in the new ones
|
||||
let metadata = s:merge_tags(metadata, page_name, tags)
|
||||
" Save
|
||||
call s:write_tags_metadata(metadata)
|
||||
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 metadata = s:load_tags_metadata()
|
||||
for file in files
|
||||
if all_files || getftime(file) >= tags_file_last_modification
|
||||
let subdir = vimwiki#base#subdir(wiki_base_dir, file)
|
||||
let page_name = subdir . fnamemodify(file, ':t:r')
|
||||
let tags = s:scan_tags(readfile(file), page_name)
|
||||
let metadata = s:remove_page_from_tags(metadata, page_name)
|
||||
let metadata = s:merge_tags(metadata, page_name, tags)
|
||||
endif
|
||||
endfor
|
||||
call s:write_tags_metadata(metadata)
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:safesubstitute(text, search, replace, mode) abort
|
||||
" Substitute regexp but do not interpret replace
|
||||
" TODO mutualize with same function in base
|
||||
let escaped = escape(a:replace, '\&')
|
||||
return substitute(a:text, a:search, escaped, a:mode)
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:scan_tags(lines, page_name) abort
|
||||
" Scan the list of text lines (argument) and produces tags metadata as a list of tag entries.
|
||||
" Code wireframe to scan for headers -- borrowed from
|
||||
" vimwiki#base#get_anchors(), with minor modifications.
|
||||
|
||||
let entries = []
|
||||
|
||||
" Get syntax wide regex
|
||||
let rxheader = vimwiki#vars#get_syntaxlocal('header_search')
|
||||
let tag_search_rx = vimwiki#vars#get_syntaxlocal('tag_search')
|
||||
let tag_format = vimwiki#vars#get_syntaxlocal('tag_format')
|
||||
|
||||
let anchor_level = ['', '', '', '', '', '', '']
|
||||
let current_complete_anchor = ''
|
||||
|
||||
let PROXIMITY_LINES_NR = 2
|
||||
let header_line_nr = - (2 * PROXIMITY_LINES_NR)
|
||||
|
||||
for line_nr in range(1, len(a:lines))
|
||||
let line = a:lines[line_nr - 1]
|
||||
|
||||
" ignore verbatim blocks
|
||||
if vimwiki#u#is_codeblock(line_nr)
|
||||
continue
|
||||
endif
|
||||
|
||||
" process headers
|
||||
let h_match = matchlist(line, rxheader)
|
||||
if !empty(h_match) " got a header
|
||||
let header_line_nr = line_nr
|
||||
let header = vimwiki#base#normalize_anchor(h_match[2])
|
||||
let current_header_description = vimwiki#u#trim(h_match[2])
|
||||
let level = len(h_match[1])
|
||||
let anchor_level[level-1] = header
|
||||
for l in range(level, 6)
|
||||
let anchor_level[l] = ''
|
||||
endfor
|
||||
if level == 1
|
||||
let current_complete_anchor = header
|
||||
else
|
||||
let current_complete_anchor = ''
|
||||
for l in range(level-1)
|
||||
if anchor_level[l] !=? ''
|
||||
let current_complete_anchor .= anchor_level[l].'#'
|
||||
endif
|
||||
endfor
|
||||
let current_complete_anchor .= header
|
||||
endif
|
||||
continue " tags are not allowed in headers
|
||||
endif
|
||||
|
||||
" Scan line for tags. There can be many of them.
|
||||
let str = line
|
||||
while 1
|
||||
" Get all matches
|
||||
let tag_groups = []
|
||||
call substitute(str, tag_search_rx, '\=add(tag_groups, submatch(0))', 'g')
|
||||
if tag_groups == []
|
||||
break
|
||||
endif
|
||||
let tagend = matchend(str, tag_search_rx)
|
||||
let str = str[(tagend):]
|
||||
for tag_group in tag_groups
|
||||
for tag in split(tag_group, tag_format.sep)
|
||||
" Create metadata entry
|
||||
let entry = {}
|
||||
let entry.tagname = tag
|
||||
let entry.lineno = line_nr
|
||||
if line_nr <= PROXIMITY_LINES_NR && header_line_nr < 0
|
||||
" Tag appeared at the top of the file
|
||||
let entry.link = a:page_name
|
||||
let entry.description = entry.link
|
||||
elseif line_nr <= (header_line_nr + PROXIMITY_LINES_NR)
|
||||
" Tag appeared right below a header
|
||||
let entry.link = a:page_name . '#' . current_complete_anchor
|
||||
let entry.description = current_header_description
|
||||
else
|
||||
" Tag stands on its own
|
||||
let entry.link = a:page_name . '#' . tag
|
||||
let entry.description = entry.link
|
||||
endif
|
||||
call add(entries, entry)
|
||||
endfor
|
||||
endfor
|
||||
endwhile
|
||||
|
||||
endfor " loop over lines
|
||||
return entries
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tags#metadata_file_path() abort
|
||||
" Return: tags metadata file path
|
||||
return fnamemodify(vimwiki#path#join_path(vimwiki#vars#get_wikilocal('path'),
|
||||
\ s:TAGS_METADATA_FILE_NAME), ':p')
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:load_tags_metadata() abort
|
||||
" Load tags metadata from file, returns a dictionary
|
||||
let metadata_path = vimwiki#tags#metadata_file_path()
|
||||
if !filereadable(metadata_path)
|
||||
return {}
|
||||
endif
|
||||
let metadata = {}
|
||||
for line in readfile(metadata_path)
|
||||
if line =~# '^!_TAG_.*$'
|
||||
continue
|
||||
endif
|
||||
let parts = matchlist(line, '^\(.\{-}\);"\(.*\)$')
|
||||
if parts[0] ==? '' || parts[1] ==? '' || parts[2] ==? ''
|
||||
throw 'VimwikiTags1: Metadata file corrupted'
|
||||
endif
|
||||
let std_fields = split(parts[1], '\t')
|
||||
if len(std_fields) != 3
|
||||
throw 'VimwikiTags2: Metadata file corrupted'
|
||||
endif
|
||||
let vw_part = parts[2]
|
||||
if vw_part[0] !=? "\t"
|
||||
throw 'VimwikiTags3: Metadata file corrupted'
|
||||
endif
|
||||
let vw_fields = split(vw_part[1:], "\t")
|
||||
if len(vw_fields) != 1 || vw_fields[0] !~# '^vimwiki:'
|
||||
throw 'VimwikiTags4: Metadata file corrupted'
|
||||
endif
|
||||
let vw_data = substitute(vw_fields[0], '^vimwiki:', '', '')
|
||||
let vw_data = substitute(vw_data, '\\n', "\n", 'g')
|
||||
let vw_data = substitute(vw_data, '\\r', "\r", 'g')
|
||||
let vw_data = substitute(vw_data, '\\t', "\t", 'g')
|
||||
let vw_data = substitute(vw_data, '\\\\', "\\", 'g')
|
||||
let vw_fields = split(vw_data, "\t")
|
||||
if len(vw_fields) != 3
|
||||
throw 'VimwikiTags5: Metadata file corrupted'
|
||||
endif
|
||||
let pagename = vw_fields[0]
|
||||
let entry = {}
|
||||
let entry.tagname = std_fields[0]
|
||||
let entry.lineno = std_fields[2]
|
||||
let entry.link = vw_fields[1]
|
||||
let entry.description = vw_fields[2]
|
||||
if has_key(metadata, pagename)
|
||||
call add(metadata[pagename], entry)
|
||||
else
|
||||
let metadata[pagename] = [entry]
|
||||
endif
|
||||
endfor
|
||||
return metadata
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:remove_page_from_tags(metadata, page_name) abort
|
||||
" Remove all entries for given page from metadata in-place. Returns updated
|
||||
" metadata (just in case).
|
||||
if has_key(a:metadata, a:page_name)
|
||||
call remove(a:metadata, a:page_name)
|
||||
return a:metadata
|
||||
else
|
||||
return a:metadata
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:merge_tags(metadata, pagename, file_metadata) abort
|
||||
" Merge metadata of one file into a:metadata
|
||||
let metadata = a:metadata
|
||||
let metadata[a:pagename] = a:file_metadata
|
||||
return metadata
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:tags_entry_cmp(i1, i2) abort
|
||||
" Compare 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
|
||||
" file lines.
|
||||
"
|
||||
" This function is needed for tags sorting, since plain sort() compares line
|
||||
" 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".)
|
||||
let items = []
|
||||
for orig_item in [a:i1, a:i2]
|
||||
let fields = split(orig_item, "\t")
|
||||
let item = {}
|
||||
let item.text = fields[0]."\t".fields[1]
|
||||
let item.lineno = 0 + matchstr(fields[2], '\m\d\+')
|
||||
call add(items, item)
|
||||
endfor
|
||||
if items[0].text ># items[1].text
|
||||
return 1
|
||||
elseif items[0].text <# items[1].text
|
||||
return -1
|
||||
elseif items[0].lineno > items[1].lineno
|
||||
return 1
|
||||
elseif items[0].lineno < items[1].lineno
|
||||
return -1
|
||||
else
|
||||
return 0
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:write_tags_metadata(metadata) abort
|
||||
" Save metadata object into a file. Throws exceptions in case of problems.
|
||||
let metadata_path = vimwiki#tags#metadata_file_path()
|
||||
let tags = []
|
||||
for pagename in keys(a:metadata)
|
||||
for entry in a:metadata[pagename]
|
||||
let entry_data = pagename . "\t" . entry.link . "\t" . entry.description
|
||||
let entry_data = substitute(entry_data, "\\", '\\\\', 'g')
|
||||
let entry_data = substitute(entry_data, "\t", '\\t', 'g')
|
||||
let entry_data = substitute(entry_data, "\r", '\\r', 'g')
|
||||
let entry_data = substitute(entry_data, "\n", '\\n', 'g')
|
||||
call add(tags,
|
||||
\ entry.tagname . "\t"
|
||||
\ . pagename . vimwiki#vars#get_wikilocal('ext') . "\t"
|
||||
\ . entry.lineno
|
||||
\ . ';"'
|
||||
\ . "\t" . 'vimwiki:' . entry_data
|
||||
\)
|
||||
endfor
|
||||
endfor
|
||||
call sort(tags, 's:tags_entry_cmp')
|
||||
let tag_comments = [
|
||||
\ "!_TAG_PROGRAM_VERSION\t" . g:vimwiki_version,
|
||||
\ "!_TAG_PROGRAM_URL\thttps://github.com/vimwiki/vimwiki",
|
||||
\ "!_TAG_PROGRAM_NAME\tVimwiki Tags",
|
||||
\ "!_TAG_PROGRAM_AUTHOR\tVimwiki",
|
||||
\ "!_TAG_OUTPUT_MODE\tvimwiki-tags",
|
||||
\ "!_TAG_FILE_SORTED\t1",
|
||||
\ "!_TAG_FILE_FORMAT\t2",
|
||||
\ ]
|
||||
for c in tag_comments
|
||||
call insert(tags, c)
|
||||
endfor
|
||||
call writefile(tags, metadata_path)
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tags#get_tags() abort
|
||||
" Return: list of unique tags found in the .tags file
|
||||
let metadata = s:load_tags_metadata()
|
||||
let tags = {}
|
||||
for entries in values(metadata)
|
||||
for entry in entries
|
||||
let tags[entry.tagname] = 1
|
||||
endfor
|
||||
endfor
|
||||
return keys(tags)
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tags#generate_tags(create, ...) abort
|
||||
" Generate tags in current buffer
|
||||
" 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.
|
||||
let header_level = vimwiki#vars#get_global('tags_header_level')
|
||||
let tags_header_text = vimwiki#vars#get_global('tags_header')
|
||||
|
||||
" If tag headers should only be updated, search for already present tag headers
|
||||
if !a:create
|
||||
let headers = vimwiki#base#collect_headers()
|
||||
let specific_tags = []
|
||||
let inside_tag_headers = 0
|
||||
for header in headers
|
||||
" If we ran out of the headers containing the tags, stop
|
||||
if inside_tag_headers && header[1] <= header_level
|
||||
break
|
||||
endif
|
||||
|
||||
" All headers in the tag headers section correspond to tag names. Collect all of them in a list.
|
||||
if inside_tag_headers
|
||||
call add(specific_tags, header[2])
|
||||
endif
|
||||
|
||||
" If we found the start of the tag headers section, remember that the following headers are now inside of it
|
||||
if header[1] == header_level && header[2] ==# tags_header_text
|
||||
let inside_tag_headers = 1
|
||||
endif
|
||||
endfor
|
||||
else
|
||||
let specific_tags = a:000
|
||||
endif
|
||||
|
||||
" use a dictionary function for closure like capability
|
||||
" copy all local variables into dict (add a: if arguments are needed)
|
||||
let GeneratorTags = copy(l:)
|
||||
function! GeneratorTags.f() abort
|
||||
let need_all_tags = empty(self.specific_tags)
|
||||
let metadata = s:load_tags_metadata()
|
||||
|
||||
" make a dictionary { tag_name: [tag_links, ...] }
|
||||
let tags_entries = {}
|
||||
for entries in values(metadata)
|
||||
for entry in entries
|
||||
if has_key(tags_entries, entry.tagname)
|
||||
call add(tags_entries[entry.tagname], [entry.link, entry.description])
|
||||
else
|
||||
let tags_entries[entry.tagname] = [[entry.link, entry.description]]
|
||||
endif
|
||||
endfor
|
||||
unlet entry " needed for older vims with sticky type checking since name is reused
|
||||
endfor
|
||||
|
||||
let lines = []
|
||||
let bullet = repeat(' ', vimwiki#lst#get_list_margin()).vimwiki#lst#default_symbol().' '
|
||||
let current_dir = vimwiki#base#current_subdir()
|
||||
for tagname in sort(keys(tags_entries))
|
||||
if need_all_tags || index(self.specific_tags, tagname) != -1
|
||||
if len(lines) > 0
|
||||
call add(lines, '')
|
||||
endif
|
||||
|
||||
let tag_tpl = printf('rxH%d_Template', self.header_level + 1)
|
||||
call add(lines, s:safesubstitute(vimwiki#vars#get_syntaxlocal(tag_tpl), '__Header__', tagname, ''))
|
||||
|
||||
if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown'
|
||||
for _ in range(vimwiki#vars#get_global('markdown_header_style'))
|
||||
call add(lines, '')
|
||||
endfor
|
||||
endif
|
||||
|
||||
for [taglink, tagdescription] in sort(tags_entries[tagname])
|
||||
let taglink = vimwiki#path#relpath(current_dir, taglink)
|
||||
if vimwiki#vars#get_wikilocal('syntax') ==# 'markdown'
|
||||
let link_tpl = vimwiki#vars#get_syntaxlocal('Weblink3Template')
|
||||
let link_infos = vimwiki#base#resolve_link(taglink)
|
||||
if empty(link_infos.anchor)
|
||||
let link_tpl = vimwiki#vars#get_syntaxlocal('Link1')
|
||||
let entry = s:safesubstitute(link_tpl, '__LinkUrl__', taglink, '')
|
||||
let entry = s:safesubstitute(entry, '__LinkDescription__', tagdescription, '')
|
||||
let file_extension = vimwiki#vars#get_wikilocal('ext', vimwiki#vars#get_bufferlocal('wiki_nr'))
|
||||
let entry = s:safesubstitute(entry, '__FileExtension__', file_extension , '')
|
||||
else
|
||||
let link_caption = split(tagdescription, '#', 0)[-1]
|
||||
let link_text = split(taglink, '#', 1)[0]
|
||||
let entry = s:safesubstitute(link_tpl, '__LinkUrl__', link_text, '')
|
||||
let entry = s:safesubstitute(entry, '__LinkAnchor__', link_infos.anchor, '')
|
||||
let entry = s:safesubstitute(entry, '__LinkDescription__', link_caption, '')
|
||||
let file_extension = vimwiki#vars#get_wikilocal('ext', vimwiki#vars#get_bufferlocal('wiki_nr'))
|
||||
let entry = s:safesubstitute(entry, '__FileExtension__', file_extension , '')
|
||||
endif
|
||||
|
||||
call add(lines, bullet . entry)
|
||||
else
|
||||
let link_tpl = vimwiki#vars#get_global('WikiLinkTemplate1')
|
||||
let file_extension = vimwiki#vars#get_wikilocal('ext', vimwiki#vars#get_bufferlocal('wiki_nr'))
|
||||
let link_tpl = s:safesubstitute(link_tpl, '__FileExtension__', file_extension , '')
|
||||
call add(lines, bullet . substitute(link_tpl, '__LinkUrl__', taglink, ''))
|
||||
endif
|
||||
endfor
|
||||
endif
|
||||
endfor
|
||||
|
||||
return lines
|
||||
endfunction
|
||||
|
||||
let tag_match = printf('rxH%d', header_level + 1)
|
||||
let links_rx = '^\%('.vimwiki#vars#get_syntaxlocal(tag_match).'\)\|'.
|
||||
\ '\%(^\s*$\)\|^\s*\%('.vimwiki#vars#get_syntaxlocal('rxListBullet').'\)'
|
||||
|
||||
call vimwiki#base#update_listing_in_buffer(
|
||||
\ GeneratorTags,
|
||||
\ tags_header_text,
|
||||
\ links_rx,
|
||||
\ line('$')+1,
|
||||
\ header_level,
|
||||
\ a:create)
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tags#complete_tags(ArgLead, CmdLine, CursorPos) abort
|
||||
" Complete tags
|
||||
" 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
|
||||
856
dot_vim/plugged/vimwiki/autoload/vimwiki/tbl.vim
Normal file
856
dot_vim/plugged/vimwiki/autoload/vimwiki/tbl.vim
Normal file
@@ -0,0 +1,856 @@
|
||||
" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99
|
||||
" Vimwiki autoload plugin file
|
||||
" Description: Tables
|
||||
" | Easily | manageable | text | tables | ! |
|
||||
" |--------|------------|-------|--------|---------|
|
||||
" | Have | fun! | Drink | tea | Period. |
|
||||
"
|
||||
" Home: https://github.com/vimwiki/vimwiki/
|
||||
|
||||
|
||||
" Clause: Load only once
|
||||
if exists('g:loaded_vimwiki_tbl_auto') || &compatible
|
||||
finish
|
||||
endif
|
||||
let g:loaded_vimwiki_tbl_auto = 1
|
||||
|
||||
|
||||
function! s:s_sep() abort
|
||||
" Return string column separator
|
||||
return vimwiki#vars#get_syntaxlocal('rxTableSep')
|
||||
endfunction
|
||||
|
||||
function! s:r_sep() abort
|
||||
" Return regex column separator
|
||||
" Not prefixed with \
|
||||
let res = '\(^\|[^\\]\)\@<='
|
||||
let res .= vimwiki#vars#get_syntaxlocal('rxTableSep')
|
||||
return res
|
||||
endfunction
|
||||
|
||||
function! s:wide_len(str) abort
|
||||
" vim73 has new function that gives correct string width.
|
||||
if exists('*strdisplaywidth')
|
||||
return strdisplaywidth(a:str)
|
||||
endif
|
||||
|
||||
" get str display width in vim ver < 7.2
|
||||
if !vimwiki#vars#get_global('CJK_length')
|
||||
let ret = strlen(substitute(a:str, '.', 'x', 'g'))
|
||||
else
|
||||
let savemodified = &modified
|
||||
let save_cursor = getpos('.')
|
||||
exe "norm! o\<esc>"
|
||||
call setline(line('.'), a:str)
|
||||
let ret = virtcol('$') - 1
|
||||
d
|
||||
call setpos('.', save_cursor)
|
||||
let &modified = savemodified
|
||||
endif
|
||||
return ret
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:cell_splitter() abort
|
||||
return '\s*'.s:r_sep().'\s*'
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:sep_splitter() abort
|
||||
return '-'.s:r_sep().'-'
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:is_table(line) abort
|
||||
" Check if param:line is in a table
|
||||
return s:is_separator(a:line) ||
|
||||
\ (a:line !~# s:r_sep().s:r_sep() && a:line =~# '^\s*'.s:r_sep().'.\+'.s:r_sep().'\s*$')
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:is_separator(line) abort
|
||||
" Check if param:line is a separator (ex: | --- | --- |)
|
||||
return a:line =~# '^\s*'.s:r_sep().'\(:\=--\+:\='.s:r_sep().'\)\+\s*$'
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:is_separator_tail(line) abort
|
||||
return a:line =~# '^\{-1}\%(\s*\|-*\)\%('.s:r_sep().'-\+\)\+'.s:r_sep().'\s*$'
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:is_last_column(lnum, cnum) abort
|
||||
let line = strpart(getline(a:lnum), a:cnum - 1)
|
||||
return line =~# s:r_sep().'\s*$' && line !~# s:r_sep().'.*'.s:r_sep().'\s*$'
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:is_first_column(lnum, cnum) abort
|
||||
let line = strpart(getline(a:lnum), 0, a:cnum - 1)
|
||||
return line =~# '^\s*$' ||
|
||||
\ (line =~# '^\s*'.s:r_sep() && line !~# '^\s*'.s:r_sep().'.*'.s:r_sep())
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:count_separators_up(lnum) abort
|
||||
let lnum = a:lnum - 1
|
||||
while lnum > 1
|
||||
if !s:is_separator(getline(lnum))
|
||||
break
|
||||
endif
|
||||
let lnum -= 1
|
||||
endwhile
|
||||
|
||||
return (a:lnum-lnum)
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:count_separators_down(lnum) abort
|
||||
let lnum = a:lnum + 1
|
||||
while lnum < line('$')
|
||||
if !s:is_separator(getline(lnum))
|
||||
break
|
||||
endif
|
||||
let lnum += 1
|
||||
endwhile
|
||||
|
||||
return (lnum-a:lnum)
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:create_empty_row(cols) abort
|
||||
" Create an empty row of a:cols columns
|
||||
let row = s:s_sep()
|
||||
let cell = ' '.s:s_sep()
|
||||
|
||||
for c in range(a:cols)
|
||||
let row .= cell
|
||||
endfor
|
||||
|
||||
return row
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:create_row_sep(cols) abort
|
||||
" Create an empty separator row of a:cols columns
|
||||
let row = s:s_sep()
|
||||
let cell = '---'.s:s_sep()
|
||||
|
||||
for c in range(a:cols)
|
||||
let row .= cell
|
||||
endfor
|
||||
|
||||
return row
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tbl#get_cells(line, ...) abort
|
||||
let result = []
|
||||
let state = 'NONE'
|
||||
let cell_start = 0
|
||||
let quote_start = 0
|
||||
let len = strlen(a:line) - 1
|
||||
|
||||
" 'Simple' FSM
|
||||
while state !=# 'CELL'
|
||||
if quote_start != 0 && state !=# 'CELL'
|
||||
let state = 'CELL'
|
||||
endif
|
||||
for idx in range(quote_start, len)
|
||||
" The only way I know Vim can do Unicode...
|
||||
let ch = a:line[idx]
|
||||
if state ==# 'NONE'
|
||||
if ch ==# s:s_sep() && (idx < 1 || a:line[idx-1] !=# '\')
|
||||
let cell_start = idx + 1
|
||||
let state = 'CELL'
|
||||
endif
|
||||
elseif state ==# 'CELL'
|
||||
if ch ==# '[' || ch ==# '{'
|
||||
let state = 'BEFORE_QUOTE_START'
|
||||
let quote_start = idx
|
||||
elseif ch ==# s:s_sep() && (idx < 1 || a:line[idx-1] !=# '\')
|
||||
let cell = strpart(a:line, cell_start, idx - cell_start)
|
||||
if a:0 && a:1
|
||||
let cell = substitute(cell, '^ \(.*\) $', '\1', '')
|
||||
else
|
||||
let cell = vimwiki#u#trim(cell)
|
||||
endif
|
||||
call add(result, cell)
|
||||
let cell_start = idx + 1
|
||||
endif
|
||||
elseif state ==# 'BEFORE_QUOTE_START'
|
||||
if ch ==# '[' || ch ==# '{'
|
||||
let state = 'QUOTE'
|
||||
let quote_start = idx
|
||||
else
|
||||
let state = 'CELL'
|
||||
endif
|
||||
elseif state ==# 'QUOTE'
|
||||
if ch ==# ']' || ch ==# '}'
|
||||
let state = 'BEFORE_QUOTE_END'
|
||||
endif
|
||||
elseif state ==# 'BEFORE_QUOTE_END'
|
||||
if ch ==# ']' || ch ==# '}'
|
||||
let state = 'CELL'
|
||||
endif
|
||||
endif
|
||||
endfor
|
||||
if state ==# 'NONE'
|
||||
break
|
||||
endif
|
||||
endwhile
|
||||
|
||||
return result
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:col_count(lnum) abort
|
||||
return len(vimwiki#tbl#get_cells(getline(a:lnum)))
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:get_indent(lnum, depth) abort
|
||||
if !s:is_table(getline(a:lnum))
|
||||
return
|
||||
endif
|
||||
|
||||
let indent = 0
|
||||
|
||||
let lnum = a:lnum - 1
|
||||
while lnum > 1
|
||||
let line = getline(lnum)
|
||||
if !s:is_table(line)
|
||||
let indent = indent(lnum+1)
|
||||
break
|
||||
endif
|
||||
let lnum -= 1
|
||||
if a:depth > 0 && lnum < a:lnum - a:depth
|
||||
break
|
||||
endif
|
||||
endwhile
|
||||
|
||||
return indent
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:get_rows(lnum, ...) abort
|
||||
let rows = []
|
||||
|
||||
if !s:is_table(getline(a:lnum))
|
||||
return rows
|
||||
endif
|
||||
|
||||
let lnum = a:lnum - 1
|
||||
let depth = a:0 > 0 ? a:1 : 0
|
||||
let ldepth = 0
|
||||
while lnum >= 1 && (depth == 0 || ldepth < depth)
|
||||
let line = getline(lnum)
|
||||
if s:is_table(line)
|
||||
call insert(rows, [lnum, line])
|
||||
else
|
||||
break
|
||||
endif
|
||||
let lnum -= 1
|
||||
let ldepth += 1
|
||||
endwhile
|
||||
|
||||
let lnum = a:lnum
|
||||
while lnum <= line('$')
|
||||
let line = getline(lnum)
|
||||
if s:is_table(line)
|
||||
call add(rows, [lnum, line])
|
||||
else
|
||||
break
|
||||
endif
|
||||
if depth > 0
|
||||
break
|
||||
endif
|
||||
let lnum += 1
|
||||
endwhile
|
||||
|
||||
return rows
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:get_cell_aligns(lnum, ...) abort
|
||||
let aligns = {}
|
||||
let depth = a:0 > 0 ? a:1 : 0
|
||||
for [lnum, row] in s:get_rows(a:lnum, depth)
|
||||
if s:is_separator(row)
|
||||
let cells = vimwiki#tbl#get_cells(row)
|
||||
for idx in range(len(cells))
|
||||
let cell = cells[idx]
|
||||
if cell =~# '^--\+:'
|
||||
let aligns[idx] = 'right'
|
||||
elseif cell =~# '^:--\+:'
|
||||
let aligns[idx] = 'center'
|
||||
else
|
||||
let aligns[idx] = 'left'
|
||||
endif
|
||||
endfor
|
||||
else
|
||||
let cells = vimwiki#tbl#get_cells(row)
|
||||
for idx in range(len(cells))
|
||||
if !has_key(aligns, idx)
|
||||
let aligns[idx] = 'left'
|
||||
endif
|
||||
endfor
|
||||
endif
|
||||
endfor
|
||||
return aligns
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:get_cell_aligns_fast(rows) abort
|
||||
let aligns = {}
|
||||
let clen = 0
|
||||
for [lnum, row] in a:rows
|
||||
if s:is_separator(row)
|
||||
return s:get_cell_aligns(lnum, 1)
|
||||
endif
|
||||
let cells = vimwiki#tbl#get_cells(row, 1)
|
||||
let clen = len(cells)
|
||||
for idx in range(clen)
|
||||
let cell = cells[idx]
|
||||
if !has_key(aligns, idx)
|
||||
let cs = matchlist(cell, '^\(\s*\)[^[:space:]].\{-}\(\s*\)$')
|
||||
if !empty(cs)
|
||||
let lstart = len(cs[1])
|
||||
let lend = len(cs[2])
|
||||
if lstart > 0 && lend > 0
|
||||
let aligns[idx] = 'center'
|
||||
elseif lend > 0
|
||||
let aligns[idx] = 'left'
|
||||
elseif lstart > 0
|
||||
let aligns[idx] = 'right'
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endfor
|
||||
endfor
|
||||
for idx in range(clen)
|
||||
if !has_key(aligns, idx)
|
||||
return {}
|
||||
endif
|
||||
endfor
|
||||
return aligns
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:get_cell_max_lens(lnum, ...) abort
|
||||
let max_lens = {}
|
||||
let rows = a:0 > 2 ? a:3 : s:get_rows(a:lnum)
|
||||
for [lnum, row] in rows
|
||||
if s:is_separator(row)
|
||||
continue
|
||||
endif
|
||||
let cells = a:0 > 1 ? a:1[lnum - a:2] : vimwiki#tbl#get_cells(row)
|
||||
for idx in range(len(cells))
|
||||
let value = cells[idx]
|
||||
if has_key(max_lens, idx)
|
||||
let max_lens[idx] = max([s:wide_len(value), max_lens[idx]])
|
||||
else
|
||||
let max_lens[idx] = s:wide_len(value)
|
||||
endif
|
||||
endfor
|
||||
endfor
|
||||
return max_lens
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:get_aligned_rows(lnum, col1, col2, depth) abort
|
||||
let rows = []
|
||||
let aligns = {}
|
||||
let startlnum = 0
|
||||
let cells = []
|
||||
let max_lens = {}
|
||||
let check_all = 1
|
||||
if a:depth > 0
|
||||
let rows = s:get_rows(a:lnum, a:depth)
|
||||
let startlnum = len(rows) > 0 ? rows[0][0] : 0
|
||||
let lrows = len(rows)
|
||||
if lrows == a:depth + 1
|
||||
let line = rows[-1][1]
|
||||
if !s:is_separator(line)
|
||||
let lcells = vimwiki#tbl#get_cells(line)
|
||||
let lclen = len(lcells)
|
||||
let lmax_lens = repeat([0], lclen)
|
||||
let laligns = repeat(['left'], lclen)
|
||||
let rows[-1][1] = s:fmt_row(lcells, lmax_lens, laligns, 0, 0)
|
||||
endif
|
||||
let i = 1
|
||||
for [lnum, row] in rows
|
||||
call add(cells, vimwiki#tbl#get_cells(row, i != lrows - 1))
|
||||
let i += 1
|
||||
endfor
|
||||
let max_lens = s:get_cell_max_lens(a:lnum, cells, startlnum, rows)
|
||||
" user option not to expand last call
|
||||
if vimwiki#vars#get_global('table_reduce_last_col')
|
||||
let last_index = keys(max_lens)[-1]
|
||||
let max_lens[last_index] = 1
|
||||
endif
|
||||
let fst_lens = s:get_cell_max_lens(a:lnum, cells, startlnum, rows[0:0])
|
||||
let check_all = max_lens != fst_lens
|
||||
let aligns = s:get_cell_aligns_fast(rows[0:-2])
|
||||
let rows[-1][1] = line
|
||||
endif
|
||||
endif
|
||||
if check_all
|
||||
" all the table must be re-formatted
|
||||
let rows = s:get_rows(a:lnum)
|
||||
let startlnum = len(rows) > 0 ? rows[0][0] : 0
|
||||
let cells = []
|
||||
for [lnum, row] in rows
|
||||
call add(cells, vimwiki#tbl#get_cells(row))
|
||||
endfor
|
||||
let max_lens = s:get_cell_max_lens(a:lnum, cells, startlnum, rows)
|
||||
" user option not to expand last call
|
||||
if vimwiki#vars#get_global('table_reduce_last_col')
|
||||
let last_index = keys(max_lens)[-1]
|
||||
let max_lens[last_index] = 1
|
||||
endif
|
||||
endif
|
||||
if empty(aligns)
|
||||
let aligns = s:get_cell_aligns(a:lnum)
|
||||
endif
|
||||
let result = []
|
||||
for [lnum, row] in rows
|
||||
if s:is_separator(row)
|
||||
let new_row = s:fmt_sep(max_lens, aligns, a:col1, a:col2)
|
||||
else
|
||||
let new_row = s:fmt_row(cells[lnum - startlnum], max_lens, aligns, a:col1, a:col2)
|
||||
endif
|
||||
call add(result, [lnum, new_row])
|
||||
endfor
|
||||
return result
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:cur_column() abort
|
||||
" Number of the current column. Starts from 0.
|
||||
let line = getline('.')
|
||||
if !s:is_table(line)
|
||||
return -1
|
||||
endif
|
||||
" TODO: do we need conditional: if s:is_separator(line)
|
||||
|
||||
let curs_pos = col('.')
|
||||
let mpos = match(line, s:r_sep(), 0)
|
||||
let col = -1
|
||||
while mpos < curs_pos && mpos != -1
|
||||
let mpos = match(line, s:r_sep(), mpos+1)
|
||||
if mpos != -1
|
||||
let col += 1
|
||||
endif
|
||||
endwhile
|
||||
return col
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:fmt_cell(cell, max_len, align) abort
|
||||
let cell = ' '.a:cell.' '
|
||||
|
||||
let diff = a:max_len - s:wide_len(a:cell)
|
||||
if diff == 0 && empty(a:cell)
|
||||
let diff = 1
|
||||
endif
|
||||
if a:align ==# 'left'
|
||||
let cell .= repeat(' ', diff)
|
||||
elseif a:align ==# 'right'
|
||||
let cell = repeat(' ',diff).cell
|
||||
else
|
||||
let cell = repeat(' ',diff/2).cell.repeat(' ',diff-diff/2)
|
||||
endif
|
||||
return cell
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:fmt_row(cells, max_lens, aligns, col1, col2) abort
|
||||
let new_line = s:s_sep()
|
||||
for idx in range(len(a:cells))
|
||||
if idx == a:col1
|
||||
let idx = a:col2
|
||||
elseif idx == a:col2
|
||||
let idx = a:col1
|
||||
endif
|
||||
let value = a:cells[idx]
|
||||
let new_line .= s:fmt_cell(value, a:max_lens[idx], a:aligns[idx]).s:s_sep()
|
||||
endfor
|
||||
|
||||
let idx = len(a:cells)
|
||||
while idx < len(a:max_lens)
|
||||
let new_line .= s:fmt_cell('', a:max_lens[idx], a:aligns[idx]).s:s_sep()
|
||||
let idx += 1
|
||||
endwhile
|
||||
return new_line
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:fmt_cell_sep(max_len, align) abort
|
||||
let cell = ''
|
||||
if a:max_len == 0
|
||||
let cell .= '-'
|
||||
else
|
||||
let cell .= repeat('-', a:max_len)
|
||||
endif
|
||||
if a:align ==# 'right'
|
||||
return cell.'-:'
|
||||
elseif a:align ==# 'left'
|
||||
return cell.'--'
|
||||
else
|
||||
return ':'.cell.':'
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:fmt_sep(max_lens, aligns, col1, col2) abort
|
||||
let new_line = s:s_sep()
|
||||
for idx in range(len(a:max_lens))
|
||||
if idx == a:col1
|
||||
let idx = a:col2
|
||||
elseif idx == a:col2
|
||||
let idx = a:col1
|
||||
endif
|
||||
let new_line .= s:fmt_cell_sep(a:max_lens[idx], a:aligns[idx]).s:s_sep()
|
||||
endfor
|
||||
return new_line
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:kbd_create_new_row(cols, goto_first) abort
|
||||
let cmd = "\<ESC>o".s:create_empty_row(a:cols)
|
||||
let cmd .= "\<ESC>:call vimwiki#tbl#format(line('.'), 2)\<CR>"
|
||||
let cmd .= "\<ESC>0"
|
||||
if a:goto_first
|
||||
let cmd .= ":call search('\\(".s:r_sep()."\\)\\zs', 'c', line('.'))\<CR>"
|
||||
else
|
||||
let cmd .= (col('.')-1).'l'
|
||||
let cmd .= ":call search('\\(".s:r_sep()."\\)\\zs', 'bc', line('.'))\<CR>"
|
||||
endif
|
||||
let cmd .= 'a'
|
||||
|
||||
return cmd
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:kbd_goto_next_row() abort
|
||||
let cmd = "\<ESC>j"
|
||||
let cmd .= ":call search('.\\(".s:r_sep()."\\)', 'c', line('.'))\<CR>"
|
||||
let cmd .= ":call search('\\(".s:r_sep()."\\)\\zs', 'bc', line('.'))\<CR>"
|
||||
let cmd .= 'a'
|
||||
return cmd
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:kbd_goto_prev_row() abort
|
||||
let cmd = "\<ESC>k"
|
||||
let cmd .= ":call search('.\\(".s:r_sep()."\\)', 'c', line('.'))\<CR>"
|
||||
let cmd .= ":call search('\\(".s:r_sep()."\\)\\zs', 'bc', line('.'))\<CR>"
|
||||
let cmd .= 'a'
|
||||
return cmd
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tbl#goto_next_col() abort
|
||||
" Used in s:kbd_goto_next_col
|
||||
let curcol = virtcol('.')
|
||||
let lnum = line('.')
|
||||
let depth = 2
|
||||
let newcol = s:get_indent(lnum, depth)
|
||||
let rows = s:get_rows(lnum, depth)
|
||||
let startlnum = len(rows) > 0 ? rows[0][0] : 0
|
||||
let cells = []
|
||||
for [lnum, row] in rows
|
||||
call add(cells, vimwiki#tbl#get_cells(row, 1))
|
||||
endfor
|
||||
let max_lens = s:get_cell_max_lens(lnum, cells, startlnum, rows)
|
||||
for cell_len in values(max_lens)
|
||||
if newcol >= curcol-1
|
||||
break
|
||||
endif
|
||||
let newcol += cell_len + 3 " +3 == 2 spaces + 1 separator |<space>...<space>
|
||||
endfor
|
||||
let newcol += 2 " +2 == 1 separator + 1 space |<space
|
||||
call vimwiki#u#cursor(lnum, newcol)
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:kbd_goto_next_col(jumpdown) abort
|
||||
let cmd = "\<ESC>"
|
||||
if a:jumpdown
|
||||
let seps = s:count_separators_down(line('.'))
|
||||
let cmd .= seps.'j0'
|
||||
endif
|
||||
let cmd .= ":call vimwiki#tbl#goto_next_col()\<CR>a"
|
||||
return cmd
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tbl#goto_prev_col() abort
|
||||
" Used in s:kbd_goto_prev_col
|
||||
let curcol = virtcol('.')
|
||||
let lnum = line('.')
|
||||
let depth = 2
|
||||
let newcol = s:get_indent(lnum, depth)
|
||||
let rows = s:get_rows(lnum, depth)
|
||||
let startlnum = len(rows) > 0 ? rows[0][0] : 0
|
||||
let cells = []
|
||||
for [lnum, row] in rows
|
||||
call add(cells, vimwiki#tbl#get_cells(row, 1))
|
||||
endfor
|
||||
let max_lens = s:get_cell_max_lens(lnum, cells, startlnum, rows)
|
||||
let prev_cell_len = 0
|
||||
for cell_len in values(max_lens)
|
||||
let delta = cell_len + 3 " +3 == 2 spaces + 1 separator |<space>...<space>
|
||||
if newcol + delta > curcol-1
|
||||
let newcol -= (prev_cell_len + 3) " +3 == 2 spaces + 1 separator |<space>...<space>
|
||||
break
|
||||
elseif newcol + delta == curcol-1
|
||||
break
|
||||
endif
|
||||
let prev_cell_len = cell_len
|
||||
let newcol += delta
|
||||
endfor
|
||||
let newcol += 2 " +2 == 1 separator + 1 space |<space
|
||||
call vimwiki#u#cursor(lnum, newcol)
|
||||
endfunction
|
||||
|
||||
|
||||
function! s:kbd_goto_prev_col(jumpup) abort
|
||||
let cmd = "\<ESC>"
|
||||
if a:jumpup
|
||||
let seps = s:count_separators_up(line('.'))
|
||||
let cmd .= seps.'k'
|
||||
let cmd .= '$'
|
||||
endif
|
||||
let cmd .= ":call vimwiki#tbl#goto_prev_col()\<CR>a"
|
||||
" let cmd .= ":call search('\\(".s:r_sep()."\\)\\zs', 'b', line('.'))\<CR>"
|
||||
" let cmd .= "a"
|
||||
return cmd
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tbl#kbd_cr() abort
|
||||
let lnum = line('.')
|
||||
if !s:is_table(getline(lnum))
|
||||
return ''
|
||||
endif
|
||||
|
||||
if s:is_separator(getline(lnum+1)) || !s:is_table(getline(lnum+1))
|
||||
let cols = len(vimwiki#tbl#get_cells(getline(lnum)))
|
||||
return s:kbd_create_new_row(cols, 0)
|
||||
else
|
||||
return s:kbd_goto_next_row()
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tbl#kbd_tab() abort
|
||||
let lnum = line('.')
|
||||
if !s:is_table(getline(lnum))
|
||||
return "\<Tab>"
|
||||
endif
|
||||
|
||||
let last = s:is_last_column(lnum, col('.'))
|
||||
let is_sep = s:is_separator_tail(getline(lnum))
|
||||
"vimwiki#u#debug("DEBUG kbd_tab> last=".last.", is_sep=".is_sep)
|
||||
if (is_sep || last) && !s:is_table(getline(lnum+1))
|
||||
let cols = len(vimwiki#tbl#get_cells(getline(lnum)))
|
||||
return s:kbd_create_new_row(cols, 1)
|
||||
endif
|
||||
return s:kbd_goto_next_col(is_sep || last)
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tbl#kbd_shift_tab() abort
|
||||
let lnum = line('.')
|
||||
if !s:is_table(getline(lnum))
|
||||
return "\<S-Tab>"
|
||||
endif
|
||||
|
||||
let first = s:is_first_column(lnum, col('.'))
|
||||
let is_sep = s:is_separator_tail(getline(lnum))
|
||||
"vimwiki#u#debug("kbd_tab> ".first)
|
||||
if (is_sep || first) && !s:is_table(getline(lnum-1))
|
||||
return ''
|
||||
endif
|
||||
return s:kbd_goto_prev_col(is_sep || first)
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tbl#format(lnum, ...) abort
|
||||
" Clause in
|
||||
if !vimwiki#u#ft_is_vw()
|
||||
return
|
||||
endif
|
||||
let line = getline(a:lnum)
|
||||
if !s:is_table(line)
|
||||
return
|
||||
endif
|
||||
|
||||
" Backup textwidth
|
||||
let textwidth = &textwidth
|
||||
|
||||
let depth = a:0 == 1 ? a:1 : 0
|
||||
|
||||
if a:0 == 2
|
||||
let col1 = a:1
|
||||
let col2 = a:2
|
||||
else
|
||||
let col1 = 0
|
||||
let col2 = 0
|
||||
endif
|
||||
|
||||
let indent = s:get_indent(a:lnum, depth)
|
||||
if &expandtab
|
||||
let indentstring = repeat(' ', indent)
|
||||
else
|
||||
execute "let indentstring = repeat('\<TAB>', indent / &tabstop) . repeat(' ', indent % &tabstop)"
|
||||
endif
|
||||
|
||||
" getting N = depth last rows is enough for having been formatted tables
|
||||
for [lnum, row] in s:get_aligned_rows(a:lnum, col1, col2, depth)
|
||||
let row = indentstring.row
|
||||
if getline(lnum) != row
|
||||
call setline(lnum, row)
|
||||
endif
|
||||
endfor
|
||||
|
||||
" Restore user textwidth
|
||||
let &textwidth = textwidth
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tbl#create(...) abort
|
||||
if a:0 > 1
|
||||
let cols = a:1
|
||||
let rows = a:2
|
||||
elseif a:0 == 1
|
||||
let cols = a:1
|
||||
let rows = 2
|
||||
elseif a:0 == 0
|
||||
let cols = 5
|
||||
let rows = 2
|
||||
endif
|
||||
|
||||
if cols < 1
|
||||
let cols = 5
|
||||
endif
|
||||
|
||||
if rows < 1
|
||||
let rows = 2
|
||||
endif
|
||||
|
||||
let lines = []
|
||||
let row = s:create_empty_row(cols)
|
||||
|
||||
call add(lines, row)
|
||||
if rows > 1
|
||||
call add(lines, s:create_row_sep(cols))
|
||||
endif
|
||||
|
||||
for r in range(rows - 1)
|
||||
call add(lines, row)
|
||||
endfor
|
||||
|
||||
call append(line('.'), lines)
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tbl#align_or_cmd(cmd, ...) abort
|
||||
if s:is_table(getline('.'))
|
||||
call call('vimwiki#tbl#format', [line('.')] + a:000)
|
||||
else
|
||||
exe 'normal! '.a:cmd
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tbl#move_column_left() abort
|
||||
" TODO: move_column_left and move_column_right are good candidates to be refactored.
|
||||
" Clause in
|
||||
let line = getline('.')
|
||||
if !s:is_table(line)
|
||||
return
|
||||
endif
|
||||
let cur_col = s:cur_column()
|
||||
if cur_col == -1
|
||||
return
|
||||
endif
|
||||
if cur_col <= 0
|
||||
return
|
||||
endif
|
||||
|
||||
call vimwiki#tbl#format(line('.'), cur_col-1, cur_col)
|
||||
call cursor(line('.'), 1)
|
||||
|
||||
let sep = '\('.s:r_sep().'\).\zs'
|
||||
let mpos = -1
|
||||
let col = -1
|
||||
while col < cur_col-1
|
||||
let mpos = match(line, sep, mpos+1)
|
||||
if mpos != -1
|
||||
let col += 1
|
||||
else
|
||||
break
|
||||
endif
|
||||
endwhile
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tbl#move_column_right() abort
|
||||
" Clause in
|
||||
let line = getline('.')
|
||||
if !s:is_table(line)
|
||||
return
|
||||
endif
|
||||
let cur_col = s:cur_column()
|
||||
if cur_col == -1
|
||||
return
|
||||
endif
|
||||
if cur_col >= s:col_count(line('.'))-1
|
||||
return
|
||||
endif
|
||||
|
||||
" Format table && Put cursor on first col
|
||||
call vimwiki#tbl#format(line('.'), cur_col, cur_col+1)
|
||||
call cursor(line('.'), 1)
|
||||
|
||||
" Change add one to all col
|
||||
let sep = '\('.s:r_sep().'\).\zs'
|
||||
let mpos = -1
|
||||
let col = -1
|
||||
while col < cur_col+1
|
||||
let mpos = match(line, sep, mpos+1)
|
||||
if mpos != -1
|
||||
let col += 1
|
||||
else
|
||||
break
|
||||
endif
|
||||
endwhile
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tbl#get_rows(lnum) abort
|
||||
return s:get_rows(a:lnum)
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tbl#is_table(line) abort
|
||||
return s:is_table(a:line)
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tbl#is_separator(line) abort
|
||||
return s:is_separator(a:line)
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tbl#cell_splitter() abort
|
||||
return s:cell_splitter()
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#tbl#sep_splitter() abort
|
||||
return s:sep_splitter()
|
||||
endfunction
|
||||
446
dot_vim/plugged/vimwiki/autoload/vimwiki/u.vim
Normal file
446
dot_vim/plugged/vimwiki/autoload/vimwiki/u.vim
Normal file
@@ -0,0 +1,446 @@
|
||||
" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99
|
||||
" Vimwiki autoload plugin file
|
||||
" Description: Utility functions
|
||||
" Home: https://github.com/vimwiki/vimwiki/
|
||||
|
||||
function! vimwiki#u#echo(msg, ...) abort
|
||||
" Echo: msg
|
||||
" :param: (1) <string> highlighting group
|
||||
" :param: (2) <string> echo suffix (ex: 'n', 'm')
|
||||
" :param: (3) <string> message prefix, default Vimwiki
|
||||
let hl_group = a:0 > 0 ? a:1 : ''
|
||||
let echo_suffix = a:0 > 1 ? a:2 : ''
|
||||
let msg_prefix = a:0 > 2 ? a:3 : 'Vimwiki: '
|
||||
" Start highlighting
|
||||
if hl_group !=# ''
|
||||
exe 'echohl ' . hl_group
|
||||
endif
|
||||
|
||||
" Escape
|
||||
let msg = substitute(a:msg, "'", "''", 'g')
|
||||
" Print
|
||||
exe 'echo'.echo_suffix . " '" . msg_prefix . msg . "'"
|
||||
|
||||
" Stop highlighting
|
||||
if hl_group !=# ''
|
||||
echohl None
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! vimwiki#u#debug(msg) abort
|
||||
" Debug: msg
|
||||
" let b:vimwiki_debug to trigger
|
||||
if !exists('b:vimwiki_debug') || b:vimwiki_debug == 0
|
||||
return
|
||||
endif
|
||||
echomsg 'DEBUG: ' . a:msg
|
||||
endfunction
|
||||
|
||||
function! vimwiki#u#warn(msg) abort
|
||||
" Warn: msg
|
||||
call vimwiki#u#echo('Warning: ' . a:msg, 'WarningMsg', '')
|
||||
endfunction
|
||||
|
||||
function! vimwiki#u#error(msg) abort
|
||||
" Error: msg
|
||||
call vimwiki#u#echo('Error: ' . a:msg, 'Error', 'msg')
|
||||
endfunction
|
||||
|
||||
function! vimwiki#u#deprecate(old, new) abort
|
||||
" Warn: deprecated feature: old -> new
|
||||
call vimwiki#u#warn('Deprecated: ' . a:old . ' is deprecated and '
|
||||
\ . 'will be removed in future versions. Use ' . a:new . ' instead.')
|
||||
endfunction
|
||||
|
||||
function! vimwiki#u#get_selection(...) abort
|
||||
" Get visual selection text content, optionaly replace its content
|
||||
" :param: Text to replace selection
|
||||
" Copyed from DarkWiiPlayer at stackoverflow
|
||||
" https://stackoverflow.com/a/47051271/2544873
|
||||
" Get selection extremity position,
|
||||
" Discriminate selection mode
|
||||
if mode() ==? 'v'
|
||||
let [line_start, column_start] = getpos('v')[1:2]
|
||||
let [line_end, column_end] = getpos('.')[1:2]
|
||||
else
|
||||
let [line_start, column_start] = getpos("'<")[1:2]
|
||||
let [line_end, column_end] = getpos("'>")[1:2]
|
||||
end
|
||||
|
||||
" Guard
|
||||
if (line2byte(line_start)+column_start) > (line2byte(line_end)+column_end)
|
||||
let [line_start, column_start, line_end, column_end] =
|
||||
\ [line_end, column_end, line_start, column_start]
|
||||
end
|
||||
let lines = getline(line_start, line_end)
|
||||
if len(lines) == 0
|
||||
return ''
|
||||
endif
|
||||
|
||||
" If want to modify selection
|
||||
if a:0 > 0
|
||||
" Grab new content
|
||||
let line_link = a:1
|
||||
|
||||
" Grab the content of line around the link: pre and post
|
||||
let start_link = max([column_start - 2, 0])
|
||||
let line_pre = ''
|
||||
if start_link > 0
|
||||
let line_pre .= lines[0][ : start_link]
|
||||
endif
|
||||
let line_post = lines[0][column_end - (&selection ==# 'inclusive' ? 0 : 1) : ]
|
||||
|
||||
" Set the only single selected line
|
||||
call setline(line_start, line_pre . line_link . line_post)
|
||||
endif
|
||||
|
||||
" Get selection extremity position, take into account selection option
|
||||
let lines[-1] = lines[-1][: column_end - (&selection ==# 'inclusive' ? 1 : 2)]
|
||||
let lines[0] = lines[0][column_start - 1:]
|
||||
return join(lines, "\n")
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#count_exe(cmd) abort
|
||||
" Execute: string v:count times
|
||||
" Called: prefixable mapping
|
||||
for i in range( max([1, v:count]) )
|
||||
exe a:cmd
|
||||
endfor
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#sort_len(list) abort
|
||||
function! s:len_compare(s1, s2) abort
|
||||
let i1 = len(a:s1)
|
||||
let i2 = len(a:s2)
|
||||
return i1 == i2 ? 0 : i1 > i2 ? 1 : -1
|
||||
endfunction
|
||||
return sort(a:list, 's:len_compare')
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#trim(string, ...) abort
|
||||
" Trim spaces: leading and trailing
|
||||
" :param: string in
|
||||
" :param: (1) <string> optional list of character to trim
|
||||
let chars = ''
|
||||
if a:0 > 0
|
||||
let chars = a:1
|
||||
endif
|
||||
let res = substitute(a:string, '^[[:space:]'.chars.']\+', '', '')
|
||||
let res = substitute(res, '[[:space:]'.chars.']\+$', '', '')
|
||||
return res
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#cursor(lnum, cnum) abort
|
||||
" Builtin cursor doesn't work right with unicode characters.
|
||||
exe a:lnum
|
||||
exe 'normal! 0'.a:cnum.'|'
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#os_name() abort
|
||||
" Returns: OS name, human readable
|
||||
if vimwiki#u#is_windows()
|
||||
return 'Windows'
|
||||
elseif vimwiki#u#is_macos()
|
||||
return 'Mac'
|
||||
else
|
||||
return 'Linux'
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#is_windows() abort
|
||||
" Check if OS is windows
|
||||
return has('win32') || has('win64') || has('win95') || has('win16')
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#is_macos() abort
|
||||
" Check if OS is mac
|
||||
if has('mac') || has('macunix') || has('gui_mac')
|
||||
return 1
|
||||
endif
|
||||
" that still doesn't mean we are not on Mac OS
|
||||
let os = substitute(system('uname'), '\n', '', '')
|
||||
return os ==? 'Darwin' || os ==? 'Mac'
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#count_first_sym(line) abort
|
||||
let first_sym = matchstr(a:line, '\S')
|
||||
return len(matchstr(a:line, first_sym.'\+'))
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#escape(string) abort
|
||||
" Escape string for literal magic regex match
|
||||
return escape(a:string, '~.*[]\^$')
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#reload_regexes() abort
|
||||
" Load concrete Wiki syntax: sets regexes and templates for headers and links
|
||||
execute 'runtime! syntax/vimwiki_'.vimwiki#vars#get_wikilocal('syntax').'.vim'
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#reload_regexes_custom() abort
|
||||
" Load syntax-specific functionality
|
||||
execute 'runtime! syntax/vimwiki_'.vimwiki#vars#get_wikilocal('syntax').'_custom.vim'
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#sw() abort
|
||||
" Backward compatible version of the built-in function shiftwidth()
|
||||
if exists('*shiftwidth')
|
||||
return shiftwidth()
|
||||
else
|
||||
return &shiftwidth
|
||||
endif
|
||||
endfunc
|
||||
|
||||
function! vimwiki#u#map_key(mode, key, plug, ...) abort
|
||||
" a:mode single character indicating the mode as defined by :h maparg
|
||||
" a:key the key sequence to map
|
||||
" a:plug the plug command the key sequence should be mapped to
|
||||
" a:1 optional argument with the following functionality:
|
||||
" if a:1==1 then the hasmapto(<Plug>) check is skipped.
|
||||
" this can be used to map different keys to the same <Plug> definition
|
||||
" if a:1==2 then the mapping is not <buffer> specific i.e. it is global
|
||||
if a:0 && a:1 == 2
|
||||
" global mappings
|
||||
if !hasmapto(a:plug, a:mode) && maparg(a:key, a:mode) ==# ''
|
||||
exe a:mode . 'map ' . a:key . ' ' . a:plug
|
||||
endif
|
||||
elseif a:0 && a:1 == 1
|
||||
" vimwiki buffer mappings, repeat mapping to the same <Plug> definition
|
||||
exe a:mode . 'map <buffer> ' . a:key . ' ' . a:plug
|
||||
else
|
||||
" vimwiki buffer mappings
|
||||
if !hasmapto(a:plug, a:mode)
|
||||
exe a:mode . 'map <buffer> ' . a:key . ' ' . a:plug
|
||||
endif
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#is_codeblock(lnum) abort
|
||||
" Returns: 1 if line is a code block or math block
|
||||
"
|
||||
" The last two conditions are needed for this to correctly
|
||||
" detect nested syntaxes within code blocks
|
||||
let syn_g = synIDattr(synID(a:lnum,1,1),'name')
|
||||
if syn_g =~# 'Vimwiki\(Pre.*\|IndentedCodeBlock\|Math.*\)'
|
||||
\ || (syn_g !~# 'Vimwiki.*' && syn_g !=? '')
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
endif
|
||||
endfunction
|
||||
|
||||
function! vimwiki#u#ft_set() abort
|
||||
" Sets the filetype to vimwiki
|
||||
" If g:vimwiki_filetypes variable is set
|
||||
" the filetype will be vimwiki.<ft1>.<ft2> etc.
|
||||
let ftypelist = vimwiki#vars#get_global('filetypes')
|
||||
let ftype = 'vimwiki'
|
||||
for ftypeadd in ftypelist
|
||||
let ftype = ftype . '.' . ftypeadd
|
||||
endfor
|
||||
let &filetype = ftype
|
||||
endfunction
|
||||
|
||||
function! vimwiki#u#ft_is_vw() abort
|
||||
" Returns: 1 if filetype is vimwiki, 0 else
|
||||
" If multiple fileytpes are in use 1 is returned only if the
|
||||
" first ft is vimwiki which should always be the case unless
|
||||
" the user manually changes it to something else
|
||||
" Clause: is filetype defined
|
||||
if &filetype ==# '' | return 0 | endif
|
||||
if split(&filetype, '\.')[0] ==? 'vimwiki'
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#get_syntax_dic(...) abort
|
||||
" Helper: Getter
|
||||
" :param: syntax <string> to retrive, default to current
|
||||
let syntax = a:0 ? a:1 : vimwiki#vars#get_wikilocal('syntax')
|
||||
return g:vimwiki_syntaxlocal_vars[syntax]
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#get_punctuation_regex() abort
|
||||
" Helper: to mutualize
|
||||
" Called: normalize and unnormalize anchor
|
||||
" From: https://gist.github.com/asabaylus/3071099#gistcomment-2563127
|
||||
" Faster
|
||||
" Unused now
|
||||
if v:version <= 703
|
||||
" Retrocompatibility: Get invalid range for vim 7.03
|
||||
return '[^0-9a-zA-Z_ \-]'
|
||||
else
|
||||
return '[^0-9a-zA-Z\u4e00-\u9fff_ \-]'
|
||||
endif
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#get_punctuation_string() abort
|
||||
" Faster
|
||||
" See: https://github.github.com/gfm/#ascii-punctuation-character
|
||||
return '!"#$%&''()*+,-./:;<=>?@\[\\\]^`{}|~'
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#hi_expand_regex(lst) abort
|
||||
" Helper: Expand regex from reduced typeface delimiters
|
||||
" :param: list<list,delimiters>> with reduced regex
|
||||
" Return: list with extended regex delimiters (not inside a word)
|
||||
" -- [['\*_', '_\*']] -> [['\*_\S\@=', '\S\@<=_\*\%(\s\|$\)\@=']]
|
||||
" See: https://github.github.com/gfm/#left-flanking-delimiter-run
|
||||
let res = []
|
||||
let p = vimwiki#u#get_punctuation_string()
|
||||
for delimiters in a:lst
|
||||
let r_prefix = '\(^\|[[:space:]]\@<=\)'
|
||||
" Regex Start: not preceded by backslash, not ended by space
|
||||
let r_start = r_prefix . delimiters[0] . '\S\@='
|
||||
" Regex End: not preceded by backslash or space, ended by punctuation or space
|
||||
let r_prefix = '\(^\|[^[:space:]\\]\@<=\)'
|
||||
let r_end = r_prefix . delimiters[1] . '\%(\_[[:space:]' . p . ']\)\@='
|
||||
call add(res, [r_start, r_end])
|
||||
endfor
|
||||
return res
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#hi_tag(tag_pre, tag_post, syntax_group, contains, ...) abort
|
||||
" Helper: Create highlight region between two tags
|
||||
" :param: tag <string> example '<b>'
|
||||
" :param: syntax_group <string> example: VimwikiBold
|
||||
" :param: contains <string> coma separated and prefixed, default VimwikiHTMLTag
|
||||
" :param: (1) <boolean> is contained
|
||||
" :param: (2) <string> more param ex:oneline
|
||||
|
||||
" Discriminate parameters
|
||||
let opt_is_contained = a:0 > 0 && a:1 > 0 ? 'contained ' : ''
|
||||
let opt_more = a:0 > 1 ? ' ' . a:2 : ''
|
||||
let opt_contains = ''
|
||||
if a:contains !=# ''
|
||||
let opt_contains = 'contains=' . a:contains . ' '
|
||||
endif
|
||||
|
||||
" Craft command
|
||||
let cmd = 'syn region ' . a:syntax_group . ' matchgroup=VimwikiDelimiter ' .
|
||||
\ opt_is_contained .
|
||||
\ 'skip="\\' . a:tag_pre . '" ' .
|
||||
\ 'start="' . a:tag_pre . '" ' .
|
||||
\ 'end="' . a:tag_post . '" ' .
|
||||
\ 'keepend ' .
|
||||
\ opt_contains .
|
||||
\ b:vimwiki_syntax_concealends .
|
||||
\ opt_more
|
||||
exe cmd
|
||||
endfunction
|
||||
|
||||
|
||||
function! vimwiki#u#hi_typeface(dic) abort
|
||||
" Highight typeface: see $VIMRUNTIME/syntax/html.vim
|
||||
" -- Basically allow nesting with multiple definition contained
|
||||
" :param: dic <dic:list:list> must contain: bold, italic and underline, even if underline is often void,
|
||||
" -- see here for underline not defined: https://stackoverflow.com/questions/3003476
|
||||
" Italic must go before, otherwise single * takes precedence over ** and ** is considered as
|
||||
" -- a void italic.
|
||||
" Note:
|
||||
" The last syntax defined take precedence so that user can change at runtime (:h :syn-define)
|
||||
" Some cases are contained by default:
|
||||
" -- ex: VimwikiCodeBoldUnderline is not defined in colorschemes -> VimwikiCode
|
||||
" -- see: #709 asking for concealing quotes in bold, so it must be higlighted differently
|
||||
" -- -- for the user to understand what is concealed around
|
||||
" VimwikiCheckBoxDone and VimwikiDelText are as their are even when nested in bold or italic
|
||||
" -- This is because it would add a lot of code (as n**2) at startup and is not often used
|
||||
" -- Here n=3 (bold, italic, underline)
|
||||
" Bold > Italic > Underline
|
||||
|
||||
let nested = vimwiki#u#get_syntax_dic().nested
|
||||
|
||||
" Italic
|
||||
for i in a:dic['italic']
|
||||
" -- Italic 1
|
||||
call vimwiki#u#hi_tag(i[0], i[1], 'VimwikiItalic ', nested .',VimwikiItalicBold,VimwikiItalicUnderline')
|
||||
" -- Bold 2
|
||||
call vimwiki#u#hi_tag(i[0], i[1], 'VimwikiBoldItalic', nested . ',VimwikiBoldItalicUnderline', 1)
|
||||
" -- Bold 3
|
||||
call vimwiki#u#hi_tag(i[0], i[1], 'VimwikiBoldUnderlineItalic', nested, 2)
|
||||
" -- Underline 2
|
||||
call vimwiki#u#hi_tag(i[0], i[1], 'VimwikiUnderlineItalic', nested . ',VimwikiUnderlineItalicBold', 1)
|
||||
" -- Underline 3
|
||||
call vimwiki#u#hi_tag(i[0], i[1], 'VimwikiUnderlineBoldItalic', nested, 2)
|
||||
endfor
|
||||
|
||||
" Bold
|
||||
for b in a:dic['bold']
|
||||
" -- Bold 1
|
||||
call vimwiki#u#hi_tag(b[0],b[1], 'VimwikiBold', nested . ',VimwikiBoldUnderline,VimwikiBoldItalic')
|
||||
" -- Italic 2
|
||||
call vimwiki#u#hi_tag(b[0], b[1], 'VimwikiItalicBold', nested . ',VimwikiItalicBoldUnderline', 1)
|
||||
" -- Italic 3
|
||||
call vimwiki#u#hi_tag(b[0], b[1], 'VimwikiItalicUnderlineBold', nested, 2)
|
||||
" -- Underline 2
|
||||
call vimwiki#u#hi_tag(b[0], b[1], 'VimwikiUnderlineBold', nested . ',VimwikiUnderlineBoldItalic', 1)
|
||||
" -- Underline 3
|
||||
call vimwiki#u#hi_tag(b[0], b[1], 'VimwikiUnderlineItalicBold', nested, 2)
|
||||
endfor
|
||||
|
||||
" Bold Italic
|
||||
if has_key(a:dic, 'bold_italic')
|
||||
for bi in a:dic['bold_italic']
|
||||
call vimwiki#u#hi_tag(bi[0], bi[1], 'VimwikiBoldItalic', nested . ',VimwikiBoldItalicUnderline')
|
||||
endfor
|
||||
endif
|
||||
|
||||
" Underline
|
||||
for u in a:dic['underline']
|
||||
" -- Underline 1
|
||||
call vimwiki#u#hi_tag(u[0], u[1], 'VimwikiUnderline', nested . ',VimwikiUnderlineBold,VimwikiUnderlineItalic')
|
||||
" -- Italic 2
|
||||
call vimwiki#u#hi_tag(u[0], u[1], 'VimwikiItalicUnderline', nested . ',VimwikiItalicUnderlineBold', 1)
|
||||
" -- Italic 3
|
||||
call vimwiki#u#hi_tag(u[0], u[1], 'VimwikiBoldItalicUnderline', nested, 2)
|
||||
" -- Underline 2
|
||||
call vimwiki#u#hi_tag(u[0], u[1], 'VimwikiBoldUnderline', nested . ',VimwikiBoldUnderlineItalic', 1)
|
||||
" -- Underline 3
|
||||
call vimwiki#u#hi_tag(u[0], u[1], 'VimwikiItalicBoldUnderline', nested, 2)
|
||||
endfor
|
||||
|
||||
" Strikethrough
|
||||
" Note: VimwikiBoldDelText Not Implemented (see above)
|
||||
for u in a:dic['del']
|
||||
call vimwiki#u#hi_tag(u[0], u[1], 'VimwikiDelText', nested)
|
||||
endfor
|
||||
|
||||
"" Code do not contain anything but can be contained very nested
|
||||
for u in a:dic['code']
|
||||
call vimwiki#u#hi_tag(u[0], u[1], 'VimwikiCode', '')
|
||||
endfor
|
||||
|
||||
" Superscript
|
||||
for u in a:dic['sup']
|
||||
call vimwiki#u#hi_tag(u[0], u[1], 'VimwikiSuperScript', nested, 0, 'oneline')
|
||||
endfor
|
||||
|
||||
" Subscript
|
||||
for u in a:dic['sub']
|
||||
call vimwiki#u#hi_tag(u[0], u[1], 'VimwikiSubScript', nested, 0, 'oneline')
|
||||
endfor
|
||||
|
||||
" Prevent var_with_underscore to trigger italic text
|
||||
" -- See $VIMRUNTIME/syntax/markdown.vim
|
||||
syn match VimwikiError "\w\@<=[_*]\w\@="
|
||||
endfunction
|
||||
1668
dot_vim/plugged/vimwiki/autoload/vimwiki/vars.vim
Normal file
1668
dot_vim/plugged/vimwiki/autoload/vimwiki/vars.vim
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user