mirror of
https://github.com/gryf/.vim.git
synced 2025-12-17 11:30:29 +01:00
Removed GetLatestVimScripts plugin (it's distributed with vim) Added nice function for generating HTML from rst in rst/common.vim Removd NERDtree (didn't used it at all) Removed tasklist (same as above) Removed eclim tools, leaved only buffer functionality Small improvements in vimrc
399 lines
12 KiB
VimL
399 lines
12 KiB
VimL
" vim:tabstop=2:shiftwidth=2:expandtab:foldmethod=marker:textwidth=79
|
|
" Vimwiki plugin file
|
|
" Author: Maxim Kim <habamax@gmail.com>
|
|
" Home: http://code.google.com/p/vimwiki/
|
|
" GetLatestVimScripts: 2226 1 :AutoInstall: vimwiki
|
|
|
|
if exists("loaded_vimwiki") || &cp
|
|
finish
|
|
endif
|
|
let loaded_vimwiki = 1
|
|
|
|
let s:old_cpo = &cpo
|
|
set cpo&vim
|
|
|
|
" HELPER functions {{{
|
|
function! s:default(varname, value) "{{{
|
|
if !exists('g:vimwiki_'.a:varname)
|
|
let g:vimwiki_{a:varname} = a:value
|
|
endif
|
|
endfunction "}}}
|
|
|
|
" return longest common prefix of 2 given strings.
|
|
" 'Hello world', 'Hello worm' => 'Hello wor'
|
|
function! s:str_common_pfx(str1, str2) "{{{
|
|
let idx = 0
|
|
let minlen = min([len(a:str1), len(a:str2)])
|
|
while (idx < minlen) && (a:str1[idx] ==? a:str2[idx])
|
|
let idx = idx + 1
|
|
endwhile
|
|
return strpart(a:str1, 0, idx)
|
|
endfunction "}}}
|
|
|
|
function! s:find_wiki(path) "{{{
|
|
let idx = 0
|
|
while idx < len(g:vimwiki_list)
|
|
let path = vimwiki#chomp_slash(expand(VimwikiGet('path', idx)))
|
|
if s:str_common_pfx(path, a:path) == path
|
|
return idx
|
|
endif
|
|
let idx += 1
|
|
endwhile
|
|
return -1
|
|
endfunction "}}}
|
|
|
|
function! s:setup_buffer_leave()"{{{
|
|
if &filetype == 'vimwiki' && !exists("b:vimwiki_idx")
|
|
let b:vimwiki_idx = g:vimwiki_current_idx
|
|
endif
|
|
|
|
" Set up menu
|
|
if g:vimwiki_menu != ""
|
|
exe 'nmenu disable '.g:vimwiki_menu.'.Table'
|
|
endif
|
|
endfunction"}}}
|
|
|
|
function! s:setup_buffer_enter() "{{{
|
|
if exists("b:vimwiki_idx")
|
|
let g:vimwiki_current_idx = b:vimwiki_idx
|
|
else
|
|
" Find what wiki current buffer belongs to.
|
|
" If wiki does not exist in g:vimwiki_list -- add new wiki there with
|
|
" buffer's path and ext.
|
|
" Else set g:vimwiki_current_idx to that wiki index.
|
|
let path = expand('%:p:h')
|
|
let ext = '.'.expand('%:e')
|
|
let idx = s:find_wiki(path)
|
|
|
|
" The buffer's file is not in the path and user do not want his wiki
|
|
" extension to be global -- do not add new wiki.
|
|
if idx == -1 && g:vimwiki_global_ext == 0
|
|
return
|
|
endif
|
|
|
|
if idx == -1
|
|
call add(g:vimwiki_list, {'path': path, 'ext': ext, 'temp': 1})
|
|
let g:vimwiki_current_idx = len(g:vimwiki_list) - 1
|
|
else
|
|
let g:vimwiki_current_idx = idx
|
|
endif
|
|
|
|
let b:vimwiki_idx = g:vimwiki_current_idx
|
|
endif
|
|
|
|
" Update existed/non-existed links highlighting.
|
|
call vimwiki#highlight_links()
|
|
|
|
" Settings foldmethod, foldexpr and foldtext are local to window. Thus in a
|
|
" new tab with the same buffer folding is reset to vim defaults. So we
|
|
" insist vimwiki folding here.
|
|
if g:vimwiki_folding == 1 && &fdm != 'expr'
|
|
setlocal fdm=expr
|
|
setlocal foldexpr=VimwikiFoldLevel(v:lnum)
|
|
setlocal foldtext=VimwikiFoldText()
|
|
endif
|
|
|
|
" And conceal level too.
|
|
if g:vimwiki_conceallevel && exists("+conceallevel")
|
|
let &conceallevel = g:vimwiki_conceallevel
|
|
endif
|
|
|
|
" Set up menu
|
|
if g:vimwiki_menu != ""
|
|
exe 'nmenu enable '.g:vimwiki_menu.'.Table'
|
|
endif
|
|
endfunction "}}}
|
|
|
|
" OPTION get/set functions {{{
|
|
" return value of option for current wiki or if second parameter exists for
|
|
" wiki with a given index.
|
|
function! VimwikiGet(option, ...) "{{{
|
|
if a:0 == 0
|
|
let idx = g:vimwiki_current_idx
|
|
else
|
|
let idx = a:1
|
|
endif
|
|
if !has_key(g:vimwiki_list[idx], a:option) &&
|
|
\ has_key(s:vimwiki_defaults, a:option)
|
|
if a:option == 'path_html'
|
|
let g:vimwiki_list[idx][a:option] =
|
|
\VimwikiGet('path', idx)[:-2].'_html/'
|
|
else
|
|
let g:vimwiki_list[idx][a:option] =
|
|
\s:vimwiki_defaults[a:option]
|
|
endif
|
|
endif
|
|
|
|
" if path's ending is not a / or \
|
|
" then add it
|
|
if a:option == 'path' || a:option == 'path_html'
|
|
let p = g:vimwiki_list[idx][a:option]
|
|
" resolve doesn't work quite right with symlinks ended with / or \
|
|
let p = substitute(p, '[/\\]\+$', '', '')
|
|
let p = resolve(expand(p))
|
|
let g:vimwiki_list[idx][a:option] = p.'/'
|
|
endif
|
|
|
|
return g:vimwiki_list[idx][a:option]
|
|
endfunction "}}}
|
|
|
|
" set option for current wiki or if third parameter exists for
|
|
" wiki with a given index.
|
|
function! VimwikiSet(option, value, ...) "{{{
|
|
if a:0 == 0
|
|
let idx = g:vimwiki_current_idx
|
|
else
|
|
let idx = a:1
|
|
endif
|
|
let g:vimwiki_list[idx][a:option] = a:value
|
|
endfunction "}}}
|
|
" }}}
|
|
|
|
" }}}
|
|
|
|
" CALLBACK function "{{{
|
|
" User can redefine it.
|
|
if !exists("*VimwikiWeblinkHandler") "{{{
|
|
function VimwikiWeblinkHandler(weblink)
|
|
for browser in g:vimwiki_browsers
|
|
if executable(browser)
|
|
if has("win32")
|
|
execute '!start "'.browser.'" ' . a:weblink
|
|
else
|
|
execute '!'.browser.' ' . a:weblink
|
|
endif
|
|
return
|
|
endif
|
|
endfor
|
|
endfunction
|
|
endif "}}}
|
|
" CALLBACK }}}
|
|
|
|
" DEFAULT wiki {{{
|
|
let s:vimwiki_defaults = {}
|
|
let s:vimwiki_defaults.path = '~/vimwiki/'
|
|
let s:vimwiki_defaults.path_html = '~/vimwiki_html/'
|
|
let s:vimwiki_defaults.css_name = 'style.css'
|
|
let s:vimwiki_defaults.index = 'index'
|
|
let s:vimwiki_defaults.ext = '.wiki'
|
|
let s:vimwiki_defaults.maxhi = 1
|
|
let s:vimwiki_defaults.syntax = 'default'
|
|
let s:vimwiki_defaults.html_header = ''
|
|
let s:vimwiki_defaults.html_footer = ''
|
|
let s:vimwiki_defaults.nested_syntaxes = {}
|
|
let s:vimwiki_defaults.auto_export = 0
|
|
" is wiki temporary -- was added to g:vimwiki_list by opening arbitrary wiki
|
|
" file.
|
|
let s:vimwiki_defaults.temp = 0
|
|
|
|
" diary
|
|
let s:vimwiki_defaults.diary_rel_path = 'diary/'
|
|
let s:vimwiki_defaults.diary_index = 'diary'
|
|
let s:vimwiki_defaults.diary_header = 'Diary'
|
|
|
|
" Do not change this! Will wait till vim become more datetime awareable.
|
|
let s:vimwiki_defaults.diary_link_fmt = '%Y-%m-%d'
|
|
|
|
let s:vimwiki_defaults.diary_link_count = 4
|
|
|
|
"}}}
|
|
|
|
" DEFAULT options {{{
|
|
call s:default('list', [s:vimwiki_defaults])
|
|
if &encoding == 'utf-8'
|
|
call s:default('upper', 'A-Z\u0410-\u042f')
|
|
call s:default('lower', 'a-z\u0430-\u044f')
|
|
else
|
|
call s:default('upper', 'A-Z')
|
|
call s:default('lower', 'a-z')
|
|
endif
|
|
call s:default('other', '0-9')
|
|
call s:default('stripsym', '_')
|
|
call s:default('badsyms', '')
|
|
call s:default('auto_checkbox', 1)
|
|
call s:default('use_mouse', 0)
|
|
call s:default('folding', 0)
|
|
call s:default('fold_trailing_empty_lines', 0)
|
|
call s:default('fold_lists', 0)
|
|
call s:default('menu', 'Vimwiki')
|
|
call s:default('global_ext', 1)
|
|
call s:default('hl_headers', 1)
|
|
call s:default('hl_cb_checked', 0)
|
|
call s:default('camel_case', 1)
|
|
call s:default('list_ignore_newline', 1)
|
|
call s:default('listsyms', ' .oOX')
|
|
if has("win32")
|
|
call s:default('browsers',
|
|
\ [
|
|
\ expand('~').'\Local Settings\Application Data\Google\Chrome\Application\chrome.exe',
|
|
\ 'C:\Program Files\Opera\opera.exe',
|
|
\ 'C:\Program Files\Mozilla Firefox\firefox.exe',
|
|
\ 'C:\Program Files\Internet Explorer\iexplore.exe',
|
|
\ ])
|
|
else
|
|
call s:default('browsers',
|
|
\ [
|
|
\ 'opera',
|
|
\ 'firefox',
|
|
\ 'konqueror',
|
|
\ ])
|
|
endif
|
|
|
|
call s:default('use_calendar', 1)
|
|
call s:default('table_auto_fmt', 1)
|
|
call s:default('w32_dir_enc', '')
|
|
call s:default('CJK_length', 0)
|
|
call s:default('dir_link', '')
|
|
call s:default('file_exts', 'pdf,txt,doc,rtf,xls,php,zip,rar,7z,html,gz')
|
|
call s:default('valid_html_tags', 'b,i,s,u,sub,sup,kbd,br,hr')
|
|
|
|
call s:default('html_header_numbering', 0)
|
|
call s:default('html_header_numbering_sym', '')
|
|
call s:default('conceallevel', 3)
|
|
|
|
call s:default('current_idx', 0)
|
|
|
|
let upp = g:vimwiki_upper
|
|
let low = g:vimwiki_lower
|
|
let oth = g:vimwiki_other
|
|
let nup = low.oth
|
|
let nlo = upp.oth
|
|
let any = upp.nup
|
|
|
|
let wword = '\C\<['.upp.']['.nlo.']*['.low.']['.nup.']*['.upp.']['.any.']*\>'
|
|
let g:vimwiki_rxWikiWord = '!\@<!'.wword
|
|
let g:vimwiki_rxNoWikiWord = '!'.wword
|
|
|
|
let g:vimwiki_rxWikiLink1 = '\[\[[^\]]\+\]\]'
|
|
let g:vimwiki_rxWikiLink2 = '\[\[[^\]]\+\]\[[^\]]\+\]\]'
|
|
if g:vimwiki_camel_case
|
|
let g:vimwiki_rxWikiLink = g:vimwiki_rxWikiWord.'\|'.
|
|
\ g:vimwiki_rxWikiLink1.'\|'.g:vimwiki_rxWikiLink2
|
|
else
|
|
let g:vimwiki_rxWikiLink = g:vimwiki_rxWikiLink1.'\|'.g:vimwiki_rxWikiLink2
|
|
endif
|
|
let g:vimwiki_rxWeblink = '\%("[^"(]\+\((\([^)]\+\))\)\?":\)\?'.
|
|
\'\%(https\?\|ftp\|gopher\|telnet\|file\|notes\|ms-help\):'.
|
|
\'\%(\%(\%(//\)\|\%(\\\\\)\)\+[A-Za-z0-9:#@%/;,$~()_?+=.&\\\-]*\)'.
|
|
\'[().,?]\@<!'
|
|
"}}}
|
|
|
|
" AUTOCOMMANDS for all known wiki extensions {{{
|
|
" Getting all extensions that different wikies could have
|
|
let extensions = {}
|
|
for wiki in g:vimwiki_list
|
|
if has_key(wiki, 'ext')
|
|
let extensions[wiki.ext] = 1
|
|
else
|
|
let extensions['.wiki'] = 1
|
|
endif
|
|
endfor
|
|
|
|
augroup filetypedetect
|
|
" clear FlexWiki's stuff
|
|
au! * *.wiki
|
|
augroup end
|
|
|
|
augroup vimwiki
|
|
autocmd!
|
|
for ext in keys(extensions)
|
|
exe 'autocmd BufEnter *'.ext.' call s:setup_buffer_enter()'
|
|
exe 'autocmd BufLeave,BufHidden *'.ext.' call s:setup_buffer_leave()'
|
|
exe 'autocmd BufNewFile,BufRead, *'.ext.' setf vimwiki'
|
|
|
|
" ColorScheme could have or could have not a
|
|
" VimwikiHeader1..VimwikiHeader6 highlight groups. We need to refresh
|
|
" syntax after colorscheme change.
|
|
exe 'autocmd ColorScheme *'.ext.' call vimwiki#setup_colors()'.
|
|
\ ' | call vimwiki#highlight_links()'
|
|
|
|
" Format tables when exit from insert mode. Do not use textwidth to
|
|
" autowrap tables.
|
|
if g:vimwiki_table_auto_fmt
|
|
exe 'autocmd InsertLeave *'.ext.' call vimwiki_tbl#format(line("."))'
|
|
exe 'autocmd InsertEnter *'.ext.' call vimwiki_tbl#reset_tw(line("."))'
|
|
endif
|
|
endfor
|
|
augroup END
|
|
"}}}
|
|
|
|
" COMMANDS {{{
|
|
command! VimwikiUISelect call vimwiki#ui_select()
|
|
command! -count VimwikiIndex
|
|
\ call vimwiki#goto_index(v:count1)
|
|
command! -count VimwikiTabIndex tabedit <bar>
|
|
\ call vimwiki#goto_index(v:count1)
|
|
|
|
command! -count VimwikiMakeDiaryNote
|
|
\ call vimwiki_diary#make_note(v:count1)
|
|
command! -count VimwikiTabMakeDiaryNote tabedit <bar>
|
|
\ call vimwiki_diary#make_note(v:count1)
|
|
"}}}
|
|
|
|
" MAPPINGS {{{
|
|
if !hasmapto('<Plug>VimwikiIndex')
|
|
map <silent><unique> <Leader>ww <Plug>VimwikiIndex
|
|
endif
|
|
noremap <unique><script> <Plug>VimwikiIndex :VimwikiIndex<CR>
|
|
|
|
if !hasmapto('<Plug>VimwikiTabIndex')
|
|
map <silent><unique> <Leader>wt <Plug>VimwikiTabIndex
|
|
endif
|
|
noremap <unique><script> <Plug>VimwikiTabIndex :VimwikiTabIndex<CR>
|
|
|
|
if !hasmapto('<Plug>VimwikiUISelect')
|
|
map <silent><unique> <Leader>ws <Plug>VimwikiUISelect
|
|
endif
|
|
noremap <unique><script> <Plug>VimwikiUISelect :VimwikiUISelect<CR>
|
|
|
|
if !hasmapto('<Plug>VimwikiMakeDiaryNote')
|
|
map <silent><unique> <Leader>w<Leader>w <Plug>VimwikiMakeDiaryNote
|
|
endif
|
|
noremap <unique><script> <Plug>VimwikiMakeDiaryNote :VimwikiMakeDiaryNote<CR>
|
|
|
|
if !hasmapto('<Plug>VimwikiTabMakeDiaryNote')
|
|
map <silent><unique> <Leader>w<Leader>t <Plug>VimwikiTabMakeDiaryNote
|
|
endif
|
|
noremap <unique><script> <Plug>VimwikiTabMakeDiaryNote
|
|
\ :VimwikiTabMakeDiaryNote<CR>
|
|
|
|
"}}}
|
|
|
|
" MENU {{{
|
|
function! s:build_menu(topmenu)
|
|
let idx = 0
|
|
while idx < len(g:vimwiki_list)
|
|
let norm_path = fnamemodify(VimwikiGet('path', idx), ':h:t')
|
|
let norm_path = escape(norm_path, '\ ')
|
|
execute 'menu '.a:topmenu.'.Open\ index.'.norm_path.
|
|
\ ' :call vimwiki#goto_index('.(idx + 1).')<CR>'
|
|
execute 'menu '.a:topmenu.'.Open/Create\ diary\ note.'.norm_path.
|
|
\ ' :call vimwiki_diary#make_note('.(idx + 1).')<CR>'
|
|
let idx += 1
|
|
endwhile
|
|
endfunction
|
|
|
|
function! s:build_table_menu(topmenu)
|
|
exe 'menu '.a:topmenu.'.-Sep- :'
|
|
exe 'menu '.a:topmenu.'.Table.Create\ (enter\ cols\ rows) :VimwikiTable '
|
|
exe 'nmenu '.a:topmenu.'.Table.Format<tab>gqq gqq'
|
|
exe 'nmenu '.a:topmenu.'.Table.Move\ column\ left<tab><A-Left> :VimwikiTableMoveColumnLeft<CR>'
|
|
exe 'nmenu '.a:topmenu.'.Table.Move\ column\ right<tab><A-Right> :VimwikiTableMoveColumnRight<CR>'
|
|
exe 'nmenu disable '.a:topmenu.'.Table'
|
|
endfunction
|
|
|
|
if !empty(g:vimwiki_menu)
|
|
call s:build_menu(g:vimwiki_menu)
|
|
call s:build_table_menu(g:vimwiki_menu)
|
|
endif
|
|
" }}}
|
|
|
|
" CALENDAR Hook "{{{
|
|
if g:vimwiki_use_calendar
|
|
let g:calendar_action = 'vimwiki_diary#calendar_action'
|
|
let g:calendar_sign = 'vimwiki_diary#calendar_sign'
|
|
endif
|
|
"}}}
|
|
|
|
let &cpo = s:old_cpo
|