“ Vim script that turns Vim into a personal wiki ” Maintainer: Daniel Choi <dhchoi@gmail.com> “ License: MIT License © 2011 Daniel Choi

if exists(“g:SoyWikiLoaded”) || &cp || version < 700

finish

endif

let g:SoyWikiLoaded = 1

let mapleader = ','

“ This regex matches namedspaced WikiWords and unqualified WikiWords let s:wiki_link_pattern = 'Cm<\([[:alnum:]_]+.)?[a-z]+w*>' let s:uri_link_pattern = 'v(https|http|file|soyfile):[^ >)]]+V' let s:soyfile_pattern = 'v^soyfile:[^ >)]]+V' let s:wiki_or_web_link_pattern = 'C<\([[:alnum:]_]+.)?[a-z]+w*>|https?:[^ >)]]+'

let s:rename_links_command = 'soywiki-rename ' let s:find_pages_linking_in_command = 'soywiki-pages-linking-in ' let s:expand_command = 'soywiki-expand ' let s:ls_command = 'soywiki-ls-t ' let s:search_for_link = “”

if !exists(“g:soywiki_filetype”)

let g:soywiki_filetype = 'txt'

endif

func! s:trimString(string)

let string = substitute(a:string, '\s\+$', '', '')
return substitute(string, '^\s\+', '', '')

endfunc

func! s:page_title()

let path = s:wiki_root()
let raw_title = substitute(expand('%:p'), path, '', '')
let page_title = substitute(raw_title, '\/', '.', '')
return page_title

endfunc

func! s:current_namespace_path()

let absolutepath = expand('%:p')
let dir_path = fnamemodify(absolutepath, ':h')
return dir_path

endfunc

func! s:wiki_root()

let root_path = split(system("git rev-parse --show-toplevel"), "\n")[0] . '/'
return root_path

endfunc

func! s:display_missing_namespace_error(num_segments, page_title)

if a:num_segments == 1
  call s:error("Invalid wiki page: ".a:page_title." is missing a namespace. Put it in a namespace subdirectory.")
elseif a:num_segments > 2
  call s:error("Invalid wiki page: ".a:page_title." is nested too deeply. Namespaces are limited to one level.")
endif

endfunc

func! s:display_invalid_wiki_word_error(word)

call s:error(a:word . " is not a valid WikiWord.")

endfunc

func! s:namespace_of_title(page_title)

let segments = split(a:page_title, '[./]')
" page must have namespace
if len(segments) == 2
  return get(segments, 0)
else
  call s:display_missing_namespace_error(len(segments), a:page_title)
  return ""
endif

endfunc

func! s:namespace_path_of_title(page_title)

let namespace = s:namespace_of_title(a:page_title)
let root_path = s:wiki_root()
return root_path . namespace

endfunc

func! s:page_namespace()

return s:namespace_of_title(s:page_title())

endfunc

func! s:title_without_namespace(page_title)

let segments = split(a:page_title, '\.')
if len(segments) == 2
  return "." . get(segments, 1)
else
  call s:display_missing_namespace_error(len(segments), a:page_title)
endif

endfunc

“ returns 1 or 0 func! s:has_namespace(link)

return (match(a:link, '\w\.') != -1)

endfunc

“ adds current page's namespace to the link func! s:infer_namespace(link)

if s:has_namespace(s:filename2pagetitle(a:link))
  return s:filename2pagetitle(a:link)
else
  let x = s:page_namespace() . "." . a:link
  return x
endif

endfunc

func! s:valid_wiki_word(link)

return (match(a:link, s:wiki_link_pattern) == 0)

endfunc

func! s:is_wiki_page()

return s:valid_wiki_word(s:page_title())

endfunc

func! s:pagetitle2file(page)

let path = s:wiki_root()
let filepath =  path . substitute(a:page, '\.', '/', 'g')
return filepath

endfunc

func! s:filename2pagetitle(page)

let path = s:wiki_root()
let title = substitute(substitute(a:page, path, '', 'g'), '/', '.', 'g')
return title

endfunc

func! s:list_pages()

let s:search_for_link = ""
let pages = s:get_page_list()
if len(pages) == 0
  echom "There are no wiki pages yet but this one."
else
  call s:page_list_window(pages, 'select-page', "Select page: ")
end

endfunc

func! s:list_namespaces()

let s:search_for_link = ""
let pages = s:get_namespace_list()
call s:page_list_window(pages, 'select-page', "Select namespace: ")

endfunc

func! s:trim_link(link)

let link = matchstr(a:link, s:wiki_link_pattern)
return link

endfunc

“ returns a fully namespaced link func! s:link_under_cursor()

let link = s:trim_link(expand("<cWORD>"))
" strip off non-letters at the end and beginning (e.g., a comma)
if ! s:has_namespace(link)
  let link = s:infer_namespace(link)
endif
if match(link, s:wiki_link_pattern) == -1
  return ""
else
  return link
end

endfunc

func! s:find_next_wiki_link(backward)

let n = 0
" don't wrap
if a:backward == 1 
  normal lb
  let result = search(s:wiki_or_web_link_pattern, 'Wb') 
else
  let result = search(s:wiki_or_web_link_pattern, 'W')
endif
if (result == 0) 
  return ""
end
return s:link_under_cursor()

endfunc

func! s:follow_link_under_cursor(split)

let word = expand("<cWORD>")
if match(word, s:uri_link_pattern) != -1
  call s:open_href_under_cursor()
  return
endif
let link = s:link_under_cursor()
if link == ""
  echom ""
  return ""
elseif line('.') == 1
  " SPECIAL CASE
  " close window
  if winnr('$') > 1
    close
  endif
  return
else
  call s:load_page(link, a:split)
endif

endfunc

“ If no link under cursor, tries to find the next one func! s:fuzzy_follow_link(split)

let link = s:link_under_cursor()
if link == ""
  let link = s:find_next_wiki_link(0)
  if link == ""
    echom "No links found"
    return
  endif
endif
call s:load_page(link, a:split)

endfunc

“ ——————————————————————————– ” LOAD PAGE

func! s:load_page(page, split)

if (s:is_wiki_page())
  write
endif
let file = s:pagetitle2file(a:page)
let title = s:filename2pagetitle(a:page)
if bufwinnr(file) != -1
  exec bufwinnr(file)."wincmd w"    
  return
endif
if (!filereadable(file)) 
  " create the file
  let namespace = s:namespace_of_title(a:page)
  if namespace == ""
    return
  end
  let namespace_path = s:namespace_path_of_title(a:page)
  call system("mkdir -p " . namespace_path)
  call writefile([title, '', ''], file) 
endif
if (a:split == 2) 
  exec "botright vsplit ". file
elseif (a:split == 1)
  exec "rightbelow split ". file
elseif (a:split == 0) 
  exec "e ".file
endif
normal 3G0
if s:search_for_link != ''
  let res = search(s:search_for_link, 'cw')
  let s:search_for_link = ''
endif

endfunc

func! s:load_most_recently_modified_page(index)

let pages = split(system(s:ls_command), "\n")
let start_page = len(pages) > a:index ? get(pages, a:index) : "main.HomePage" 
call s:load_page(start_page, 0)

endfunc

func! s:delete_page()

let file = bufname('%')
let bufnr = bufnr('%')

if winnr('$') == 1
  " we need a buffer to replace this one with
  " go to previous buffer
  let next_window = bufnr('#')
  if next_window == -1
    " TODO this fails to execute
    call s:load_page("main.HomePage", 0)
  else
    exec ":b".next_window
  endif
  wincmd p
endif

echo system("git rm " . file)
echo system("rm " . file)
call system("git commit -am 'page deletion'")
exec "bdelete " . bufnr
redraw
echom  "Deleted " . file

endfunc

func! s:rename_page(page_path_or_title)

let page_title = s:infer_namespace(a:page_path_or_title)
let newfile = s:pagetitle2file(page_title)
if (filereadable(newfile)) 
  exe "echom '" . newfile . " already exists!'"
  return
endif
if s:valid_wiki_word(page_title)
  write!
  call system("mkdir -p " . s:namespace_of_title(page_title))
  let original_file = bufname('')
  if executable("git")
    echo system("git mv " . original_file . " " .  newfile)
  else
    echo system("mv " . original_file . " " .  newfile)
  endif
  call system("git commit -am 'rename wiki page'")
  let &buftype = "nofile"
  exec "!" . s:rename_links_command . s:wiki_root() . " " . original_file . " " . newfile
  call system("git commit -am 'rename wiki links'")
  exec "e " . newfile
else
  call s:display_invalid_wiki_word_error(page_title)
endif

endfunc

func! s:create_page(page_path)

let page_title = s:infer_namespace(a:page_path)
let page_path = s:pagetitle2file(page_title)
if (filereadable(page_path)) 
  exe "echom '" . page_path . " already exists! Loaded.'"
endif
if s:valid_wiki_word(page_title)
  call s:load_page(s:filename2pagetitle(page_path), 0)
else
  call s:display_invalid_wiki_word_error(page_title)
endif

endfunc

func! s:save_revision()

call system("git add " . bufname('%'))
call system("git commit -a -m 'edit'")

endfunc

func! s:show_revision_history(stat)

if (a:stat)
  exec ":!git log --stat " . bufname('%')
else
  exec ":!git log  -p " . bufname('%')
end

endfunc

func! s:show_blame()

exec ":! git blame --date=relative " . bufname('%')

endfunc

“ ——————————————————————————- ” select Page

func! s:omit_this_page(page_list)

if exists("s:return_to_bufname")
  let page_list = filter( a:page_list,  'v:val != "'.s:return_to_bufname.'"')
  return page_list
else
  return a:page_list
endif

endfunc

“ func! s:get_page_list()

" no file current in buffer
if len(bufname('')) == 0
  let pages = split(system(s:ls_command), "\n")
elseif bufname('') == 'pages-linking-in'
  " this needs refactoring to rely less on state
  let pages = s:pages_linking_in
else
  "let pages = s:omit_this_page(split(system(s:ls_command), "\n"))
  let pages = split(system(s:ls_command), "\n")
endif
return pages

endfunction

func! s:get_namespace_list()

let pages = split(system(s:ls_command . " -n"), "\n")
return pages

endfunction

func! s:pages_in_this_namespace(pages)

let namespace = s:page_namespace()
let pages = filter( a:pages,  'v:val =~ "^' . namespace . '\."')
" strip leading namespace
return map(pages, "substitute(v:val, '^" . namespace . "\.', '', '') ")

endfunc

“ When user press TAB after typing a few characters in the page selection ” window, if the user started typing a namespace (which starts with a “ lowercase letter), try to complete it. Otherwise take no action. func! s:reduce_matches()

if (!exists("s:matching_pages"))
  return
endif
let fragment = expand("<cWORD>")
" find the first namespace in the list
let namespaced_matches = filter( s:matching_pages,  'v:val =~ "^' . fragment . '\."')
if (len(namespaced_matches) == 0)
  return
elseif match(fragment, '^[a-z]') == 0 && match(fragment, '\.' == -1)   
  " we're beginning to type a namespace
  let namespace = get(split(get(namespaced_matches, 0), '\.'), 0) 
  let namespace .= "."
  call feedkeys( "BcW" . namespace . "\<C-x>\<C-u>\<C-p>" , "t")
else
  return
endif

endfunc

function! s:page_list_window(page_match_list, buffer_name, prompt)

" remember the original window 
let s:return_to_winnr = winnr()
let s:return_to_bufname = s:filename2pagetitle(bufname(''))
let s:matching_pages = a:page_match_list
exec "leftabove split ".a:buffer_name
setlocal completefunc=CompletePageTitle 
setlocal buftype=nofile
setlocal noswapfile
setlocal modifiable
setlocal textwidth=0
resize 1
inoremap <silent> <buffer> <cr> <Esc>:call <SID>select_page()<CR> 
inoremap <buffer> <Tab> <Esc>:call <SID>reduce_matches()<cr>
noremap <buffer> q <Esc>:close<cr>
inoremap <buffer> <Esc> <Esc>:close<cr>

"  Bad, gets buggy with frag "dai"
"  autocmd CursorMovedI <buffer> call feedkeys("\<C-x>\<C-u>\<C-p>", "n")
" c-p clears the line
call setline(1, a:prompt)
normal $
call feedkeys("a\<c-x>\<c-u>\<c-p>", 't')
" call feedkeys("a", 't')

endfunction

function! CompletePageTitle(findstart, base)

if a:findstart
  " locate the start of the word
  let line = getline('.')
  let start = col('.') - 1
  while start > 0 && line[start - 1] =~ '\m[[:alnum:]\.]'
    let start -= 1
  endwhile
  return start
else
  let base = s:trimString(a:base)
  if (base == '')
    return s:matching_pages
  else
    let res = []
    if bufname('') == 'select-page'
      let pages = s:get_page_list()
      for m in pages
        if m =~ '\c' . base 
          call add(res, m)
        endif
      endfor
    else
      " autocomplete inline
      if ! exists("s:matching_pages") 
        let s:matching_pages = s:get_page_list()
      endif
      let pages = base =~ '\C^[a-z]' ? s:matching_pages[:] : s:pages_in_this_namespace(s:matching_pages[:])
      for m in pages
        if m =~ '^\c' . base 
          call add(res, m)
        endif
      endfor
    endif
    return res
  endif
endif

endfun

function! s:select_page()

let page = s:trimString( get(split(getline(line('.')), ": "), 1) )
close
exe s:return_to_winnr . "wincmd w"
if (page == '') " no selection
  return
end
" if time is just a namespace, append .HomePage to it
if page =~ '^[a-z][[:alnum:]_]\+$'
  let page = page . ".HomePage"
endif

      for item in s:matching_pages
        if (page =~ item)
    call s:load_page(page, 0)
    break
  end
      endfor

endfunction

“———————————————————————— ” PAGES LINKING IN “ ” this logic could be more precise, in cases where pages have same name “ in different namespaces

func! s:list_pages_linking_in()

let s:pages_linking_in = split(system(s:find_pages_linking_in_command . s:page_title()), "\n")
" cursor should jump to this string after the selected page is loaded:
let s:search_for_link = s:title_without_namespace(s:page_title())
if len(s:pages_linking_in) == 1
  call s:load_page(get(s:pages_linking_in, 0), 0)
elseif len(s:pages_linking_in) == 0
  echom "No pages link to " . s:page_title() . "!"
else
  call s:page_list_window(s:pages_linking_in, "pages-linking-in", "Pages that link to " . s:page_title() . ": ")
endif

endfunc

“———————————————————————— ” This appends the selected text (use visual-mode) to the page selected “ in the page selection window. func! s:extract(…) range

if a:0 != 3
  return s:error("Incorrect number of arguments")
endif

let first = a:firstline
let last = a:lastline
let file = a:1

if match(file, s:wiki_link_pattern) == -1
  echom "Target page must be a WikiWord!"
  return
endif

let mode = a:2 " append or insert
let link = a:3 " replace with link ?
let range = first.",".last
silent exe range."yank"
if link
  let replacement = s:filename2pagetitle(file)
  silent exe "norm! :".first.",".last."change\<CR>".replacement."\<CR>.\<CR>"
else
  " this one just deletes the line
  silent exe "norm! :".first.",".last."change\<CR>.\<CR>"     
endif
write!
if bufnr(file) == -1 || bufwinnr(bufnr(file)) == -1
  if !filereadable(file)
    " create the file
    let page_title = s:filename2pagetitle(file)
    let namespace = s:namespace_of_title(page_title)
    if len(namespace) > 0
      call system("mkdir -p " . namespace)
    endif
    call writefile([page_title, '', ''], file) 
  endif
  exec "botright vsplit ".file
else
  let targetWindow = bufwinnr(bufnr(file))
  exe targetWindow."wincmd w"
end
if mode == 'append'
  normal G
  silent put
  silent put= ''
elseif mode == 'insert'
  call cursor(2, 0)
  silent put
end
write!

endfunc

func! s:error(str)

echohl ErrorMsg
echomsg a:str
echohl None

endfunction

func! s:insert_divider()

let divider = '------------------------------------------------------------------------'
silent put! =divider
silent put=''

endfunc “———————————————————————— ” SEARCH func! s:wiki_search(pattern, in_this_namespace, display_list)

let pattern = (empty(a:pattern)  ? @/ : a:pattern)
if a:in_this_namespace
  execute printf('vimgrep/\c%s/ %s', pattern, s:page_namespace()."/*")
else
  execute printf('vimgrep/\c%s/ %s', pattern, "*/*")
endif
if a:display_list
  execute 'copen'
endif

endfunc

“———————————————————————— ” This opens a new buffer with all the lines with just WikiLinks on them “ expanded (recursively). This is not a wiki buffer but a text buffer

func! s:expand(seamless, vertical)

if a:seamless == 1
  " seamful, the default
  echom "Expanding seamfully. Please wait."
  let res = system(s:expand_command . " " . s:wiki_root() . " seamless " . bufname('%'))
else " seamless
  echom "Expanding seamlessly. Please wait."
  let res = system(s:expand_command . " " . s:wiki_root() . " seamful " . bufname('%'))
endif
if a:vertical
  botright vnew 
else
  new 
endif
setlocal buftype=nofile "scratch buffer for viewing; user can write
silent! put =res
silent! 1delete
silent! normal 1G
redraw
echom "Expanded " . (a:seamless == 0 ? 'seamfully' : 'seamlessly') . "."

endfunc “———————————————————————— func! s:open_href_under_cursor()

let word = expand("<cWORD>")
let soyuri = matchstr(word, s:uri_link_pattern)
let uri = s:expand_iana_uri(soyuri)
let command = g:SoyWiki#browser_command . " '" . uri . "' "
call system(command)
echom command

endfunc

func! s:find_next_href_and_open()

let res = search(s:uri_link_pattern, 'cw')
if res != 0
  call s:open_href_under_cursor()
endif

endfunc

func! s:expand_iana_uri(soyuri)

if match(a:soyuri, s:soyfile_pattern) != -1
  let autochdir_rel_path = s:current_namespace_path()
  let wiki_rel_path = s:wiki_root()

  let filepath = substitute(a:soyuri, 'soyfile://', '', '')

  " the case that the soyfile is actually an absolute path
  if match(filepath, '\v^/') != -1
    return "file://" . filepath
  endif

  let autochdir_path = fnamemodify(autochdir_rel_path . '/' . filepath, ':p')
  let wiki_path = fnamemodify(wiki_rel_path . '/' . filepath, ':p')
  let uri_path_part = wiki_path

  " the case that the path supplied was relative to
  " the current namespace directory (autochdir-option)
  if filereadable(autochdir_path)
    let uri_path_part = autochdir_path
  endif

  return 'file://' . uri_path_part
else
  " return non-soyfile uris unchanged
  return a:soyuri
end

endfunc

func! s:goto_homepage(main)

if a:main
  call s:load_page("main.HomePage", 0)
else
  let namespace_home = s:page_namespace()."/HomePage" 
  call s:load_page(namespace_home, 0)
endif

endfunc

“ ——————————————————————————– ” HELP func! s:show_help()

let command = g:SoyWiki#browser_command . ' ' . shellescape('http://danielchoi.com/software/soywiki.html')
call system(command)

endfunc “————————————————————————

func! s:global_mappings()

nnoremap <leader>m :call <SID>list_pages()<CR>
nnoremap <leader>M :call <SID>list_pages_linking_in()<CR>
nnoremap <leader>n :call <SID>list_namespaces()<CR>

nnoremap <silent> <leader>o :call <SID>find_next_href_and_open()<cr> 
nnoremap <silent> q :close<cr>
" for netrw vertical split
nnoremap ,O :exec "silent botright vsplit ". expand("<cWORD>")<cr>

command! -bar -nargs=1 -range -complete=file SWAppend :<line1>,<line2>call s:extract(<f-args>, 'append', 0)
command! -bar -nargs=1 -range -complete=file SWInsert :<line1>,<line2>call s:extract(<f-args>, 'insert', 0)
command! -bar -nargs=1 -range -complete=file SWLinkAppend :<line1>,<line2>call s:extract(<f-args>, 'append', 1)
command! -bar -nargs=1 -range -complete=file SWLinkInsert :<line1>,<line2>call s:extract(<f-args>, 'insert', 1)

command! -bar -nargs=1 SWSearch :call s:wiki_search(<f-args>, 0, 0)
command! -bar -nargs=1 SWS SWSearch <args>
command! -bar -nargs=1 SWSearchList :call s:wiki_search(<f-args>, 0, 1)
command! -bar -nargs=1 SWSL SWSearchList <args>
command! -bar -nargs=1 SWNamespaceSearch :call s:wiki_search(<f-args>, 1, 0)

autocmd  BufReadPost,BufNewFile,WinEnter,BufEnter,BufNew,BufAdd * call s:highlight_wikiwords() 
autocmd  BufReadPost,BufNewFile,WinEnter,BufEnter,BufNew,BufAdd * call s:prep_buffer() 
autocmd BufReadPost quickfix nnoremap <buffer> <space> <CR>:copen<CR>
" autocmd  BufEnter * call s:prep_buffer()

endfunc

func! s:prep_mapping_default()

if !exists('g:soywiki_mapping_follow_link_under_cursor_here')
  let g:soywiki_mapping_follow_link_under_cursor_here = '<cr>'
endif
if !exists('g:soywiki_mapping_follow_link_under_cursor_vertical')
  let g:soywiki_mapping_follow_link_under_cursor_vertical = '<c-l>'
endif
if !exists('g:soywiki_mapping_follow_link_under_cursor_horizontal')
  let g:soywiki_mapping_follow_link_under_cursor_horizontal = '<c-h>'
endif
if !exists('g:soywiki_mapping_fuzzy_follow')
  let g:soywiki_mapping_fuzzy_follow = '<leader>f'
endif
if !exists('g:soywiki_mapping_next_link')
  let g:soywiki_mapping_next_link = '<c-j>'
endif
if !exists('g:soywiki_mapping_previous_link')
  let g:soywiki_mapping_previous_link = '<c-k>'
endif

if !exists('g:soywiki_mapping_show_history')
  let g:soywiki_mapping_show_history = '<leader>lp'
endif
if !exists('g:soywiki_mapping_show_files_history')
  let g:soywiki_mapping_show_files_history = '<leader>ls'
endif
if !exists('g:soywiki_mapping_show_blame')
  let g:soywiki_mapping_show_blame = '<leader>b'
endif

if !exists('g:soywiki_mapping_expand_seamless_vertical')
  let g:soywiki_mapping_expand_seamless_vertical = '<leader>x'
endif
if !exists('g:soywiki_mapping_expand_seamful_vertical')
  let g:soywiki_mapping_expand_seamful_vertical = '<leader>X'
endif
if !exists('g:soywiki_mapping_expand_seamless_horizontal')
  let g:soywiki_mapping_expand_seamless_horizontal = '<leader>xx'
endif
if !exists('g:soywiki_mapping_expand_seamful_horizontal')
  let g:soywiki_mapping_expand_seamful_horizontal = '<leader>XX'
endif

if !exists('g:soywiki_mapping_goto_homepage')
  let g:soywiki_mapping_goto_homepage = '<leader>h'
endif
if !exists('g:soywiki_mapping_goto_main_homepage')
  let g:soywiki_mapping_goto_main_homepage = '<leader>H'
endif

if !exists('g:soywiki_mapping_show_help')
  let g:soywiki_mapping_show_help = '<leader>?'
endif

if !exists('g:soywiki_mapping_format')
  let g:soywiki_mapping_format = '\'
endif
if !exists('g:soywiki_mapping_add_delimiter_line')
  let g:soywiki_mapping_add_delimiter_line = '<leader>-'
endif
if !exists('g:soywiki_mapping_add_date')
  let g:soywiki_mapping_add_date = '<leader>d'
endif
if !exists('g:soywiki_mapping_add_date_and_delimiter_line')
  let g:soywiki_mapping_add_date_and_delimiter_line = '<leader>D'
endif

endfunc

“ this checks if the buffer is a SoyWiki file (from firstline) ” and then turns on syntax coloring and mappings as necessary func! s:prep_buffer()

if (s:is_wiki_page() && !exists("b:mappings_loaded"))
  call s:prep_mapping_default()
  " let user decide on the textwidth
  let &filetype=g:soywiki_filetype
  execute 'nnoremap <buffer> '.g:soywiki_mapping_follow_link_under_cursor_here.' :call <SID>follow_link_under_cursor(0)<cr>'
  execute 'nnoremap <buffer> '.g:soywiki_mapping_follow_link_under_cursor_vertical.' :call <SID>follow_link_under_cursor(2)<cr>'
  execute 'nnoremap <buffer> '.g:soywiki_mapping_follow_link_under_cursor_horizontal.' :call <SID>follow_link_under_cursor(1)<cr>'
  execute 'noremap <buffer> '.g:soywiki_mapping_fuzzy_follow.' :call <SID>fuzzy_follow_link(0)<CR>'
  execute 'noremap <buffer> '.g:soywiki_mapping_next_link.' :call <SID>find_next_wiki_link(0)<CR>'
  execute 'noremap <buffer> '.g:soywiki_mapping_previous_link.' :call <SID>find_next_wiki_link(1)<CR>'

  command! -bar -nargs=1 -range -complete=file SWCreate :call <SID>create_page(<f-args>)
  command! -bar -nargs=1 -range -complete=file SWRenameTo :call <SID>rename_page(<f-args>)
  command! -buffer SWDelete :call s:delete_page()

  command! -buffer SWLog :call s:show_revision_history(0)
  execute 'noremap <buffer> '.g:soywiki_mapping_show_history.' :call <SID>show_revision_history(0)<CR>'
  command! -buffer SWLogStat :call s:show_revision_history(1)
  execute 'noremap <buffer> '.g:soywiki_mapping_show_files_history.' :call <SID>show_revision_history(1)<CR>'
  command! -buffer SWBlame :call s:show_blame()
  execute 'noremap <buffer> '.g:soywiki_mapping_show_blame.' :call <SID>show_blame()<CR>'

  execute 'noremap <buffer> '.g:soywiki_mapping_expand_seamless_vertical.' :call <SID>expand(0,1)<CR>'
  execute 'noremap <buffer> '.g:soywiki_mapping_expand_seamful_vertical.' :call <SID>expand(1,1)<CR>'
  execute 'noremap <buffer> '.g:soywiki_mapping_expand_seamless_horizontal.' :call <SID>expand(0,0)<CR>'
  execute 'noremap <buffer> '.g:soywiki_mapping_expand_seamful_horizontal.' :call <SID>expand(1,0)<CR>'

  execute 'noremap <buffer> '.g:soywiki_mapping_goto_homepage.' :call <SID>goto_homepage(0)<CR>'
  execute 'noremap <buffer> '.g:soywiki_mapping_goto_main_homepage.' :call <SID>goto_homepage(1)<CR>'

  execute 'noremap <silent> '.g:soywiki_mapping_show_help.' :call <SID>show_help()<cr>'

  execute 'nnoremap <buffer> '.g:soywiki_mapping_format.' gqap '
  execute 'nnoremap <buffer> '.'.g:soywiki_mapping_add_delimiter_line o<Esc>k72i-<Esc><CR>'
  execute 'nnoremap <buffer> '.g:soywiki_mapping_add_date.' :r !date<CR>o<Esc>'
  execute 'nnoremap '.g:soywiki_mapping_add_date_and_delimiter_line.' :r !date<CR><Esc>k72i-<Esc>jo<Esc>'

  "   set nu
  setlocal completefunc=CompletePageTitle

  if !exists('g:soywiki_autosave')
    let g:soywiki_autosave = 1
  endif

  if g:soywiki_autosave
    augroup save_revision
      au!
      autocmd FileWritePost,BufWritePost,BufUnload <buffer> call s:save_revision()
    augroup END
  endif
  let b:mappings_loaded = 1
endif

endfunc

func! s:highlight_wikiwords()

if (s:is_wiki_page()) 
  "syntax clear
  exe "syn match Comment /". s:wiki_link_pattern. "/"
  exe "syn match Constant /". s:uri_link_pattern . "/"
endif

endfunc

call s:global_mappings()

“ also catch detched git directories if (!isdirectory(”.git“)&&!filereadable(”.git“))

call system("git init")
echom "Created .git repository to store revisions"

endif “ compress the repo call system(”git gc“)

if !exists(“g:SoyWiki#browser_command”)

for cmd in ["gnome-open", "open"] 
  if executable(cmd)
    let g:SoyWiki#browser_command = cmd
    break
  endif
endfor
if !exists("g:SoyWiki#browser_command")
  echom "Can't find the to open your web browser."
endif

endif

if len(bufname(“%”)) == 0

call s:load_most_recently_modified_page(0)

else

call s:load_page(bufname("%"), 0)

endif syntax enable call s:highlight_wikiwords() call s:prep_buffer()