commit 0b416c28343fad8fad3729dad8722c6b4547a1a5
parent 4f28e21f3f7822008ea229a6c0755c064ef015ab
Author: Maxim Kim <habamax@gmail.com>
Date: Mon, 5 May 2008 00:00:00 +0000
Version 0.2
* (+) Add part of Google's Wiki syntax.
* (+) Add auto insert # with ENTER.
* (+) On/Off auto insert bullet with ENTER.
* (+) Strip `[[complex wiki name]]` from symbols that cannot be used in file names.
* (+) Links to non-wiki files. Non wiki files are files with extensions ie `[[hello world.txt]]` or `[[my homesite.html]]`
Diffstat:
M | ftplugin/vimwiki.vim | | | 83 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------- |
M | syntax/vimwiki.vim | | | 66 | +++++++++++++++++++++++------------------------------------------- |
2 files changed, 82 insertions(+), 67 deletions(-)
diff --git a/ftplugin/vimwiki.vim b/ftplugin/vimwiki.vim
@@ -4,8 +4,8 @@
" Home: http://code.google.com/p/vimwiki/
" Author: Maxim Kim
" Filenames: *.wiki
-" Last Change: (04.05.2008 17:45)
-" Version: 0.1
+" Last Change: (05.05.2008 19:30)
+" Version: 0.2
if exists("b:did_ftplugin")
finish
@@ -35,12 +35,16 @@ function! s:default(varname,value)
endif
endfunction
+"" Could be redefined by users
call s:default('index',"")
call s:default('home',"")
call s:default('upper','A-ZА-Я')
call s:default('lower','a-zа-я')
call s:default('other','0-9_')
call s:default('ext','.wiki')
+call s:default('smartCR',1)
+call s:default('stripsym','_')
+
call s:default('history',[])
let upp = g:vimwiki_upper
@@ -74,6 +78,7 @@ function! s:SearchWord(wikiRx,cmd)
let &hls = hl
endfunction
+
function! s:WikiNextWord()
call s:SearchWord(s:wiki_word, 'n')
endfunction
@@ -104,27 +109,44 @@ function! s:WikiGetWordAtCursor(wikiRX)
endif
endf
-function! s:WikiStripWord(word)
+function! s:WikiStripWord(word, sym)
+ function! s:WikiStripWordHelper(word, sym)
+ return substitute(a:word, '[<>|?*/\:"]', a:sym, 'g')
+ endfunction
+
let result = a:word
if strpart(a:word, 0, 2) == "[["
- let result = strpart(a:word, 2, strlen(a:word)-4)
+ let result = s:WikiStripWordHelper(strpart(a:word, 2, strlen(a:word)-4), a:sym)
endif
return result
endfunction
+" Check if word is link to a non-wiki file.
+" The easiest way is to check if it has extension like .txt or .html
+function! s:WikiLinkToNonWikiFile(word)
+ if a:word =~ '\..\{1,4}$'
+ return 1
+ endif
+ return 0
+endfunction
+
if !exists('*s:WikiFollowWord')
function! s:WikiFollowWord()
- let word = s:WikiStripWord(s:WikiGetWordAtCursor(s:wiki_word))
+ let word = s:WikiStripWord(s:WikiGetWordAtCursor(s:wiki_word), g:vimwiki_stripsym)
" insert doesn't work properly inside :if. Check :help :if.
if word == ""
execute "normal! \n"
return
endif
- " history is [['WikiWord.wiki', 11], ['AnotherWikiWord', 3] ... etc]
- " where numbers are column positions we should return when coming back.
- call insert(g:vimwiki_history, [expand('%:p'), col('.')])
- execute ":e ".g:vimwiki_home.word.g:vimwiki_ext
+ if s:WikiLinkToNonWikiFile(word)
+ execute ":e ".word
+ else
+ " history is [['WikiWord.wiki', 11], ['AnotherWikiWord', 3] ... etc]
+ " where numbers are column positions we should return when coming back.
+ call insert(g:vimwiki_history, [expand('%:p'), col('.')])
+ execute ":e ".g:vimwiki_home.word.g:vimwiki_ext
+ endif
endfunction
function! s:WikiGoBackWord()
@@ -138,30 +160,40 @@ if !exists('*s:WikiFollowWord')
endif
function! s:WikiNewLine()
- let prevline = getline(line('.')-1)
-
- if prevline =~ '^\s*\*'
- let curline = substitute(getline('.'),'^\s\+',"","g")
- if prevline =~ '^\s*\*\s*$'
- " there should be easier way ...
- execute 'normal kA '."\<ESC>".'"_dF*JX'
- return
+ function! WikiAutoListItemInsert(listSym)
+ let sym = escape(a:listSym, '*')
+ let prevline = getline(line('.')-1)
+ if prevline =~ '^\s*'.sym
+ let curline = substitute(getline('.'),'^\s\+',"","g")
+ if prevline =~ '^\s*'.sym.'\s*$'
+ " there should be easier way ...
+ execute 'normal kA '."\<ESC>".'"_dF'.a:listSym.'JX'
+ return 1
+ endif
+ let ind = indent(line('.')-1)
+ call setline(line('.'), strpart(prevline, 0, ind).a:listSym.' '.curline)
+ call cursor(line('.'), ind+3)
+ return 1
endif
- call setline(line('.'), '* '.curline)
- execute "normal =="
- let ind = indent(line('.')) + 3
- call cursor(line('.'), ind)
+ return 0
+ endfunction
+
+ if WikiAutoListItemInsert('*')
+ return
+ endif
+
+ if WikiAutoListItemInsert('#')
return
endif
" delete <space>
- execute 'normal X'
+ execute 'normal x'
endfunction
" Functions }}}
-"" Keybindings
+"" Keybindings {{{
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
nmap <buffer> <Up> gk
nmap <buffer> k gk
@@ -182,4 +214,7 @@ nmap <buffer> <BS> :call <SID>WikiGoBackWord()<CR>
nmap <buffer> <TAB> :call <SID>WikiNextWord()<CR>
nmap <buffer> <S-TAB> :call <SID>WikiPrevWord()<CR>
-inoremap <CR> <CR> <C-O>:call <SID>WikiNewLine()<CR>
+if g:vimwiki_smartCR
+ inoremap <CR> <CR> <C-O>:call <SID>WikiNewLine()<CR>
+endif
+" Keybindings }}}
diff --git a/syntax/vimwiki.vim b/syntax/vimwiki.vim
@@ -4,8 +4,8 @@
" Home: http://code.google.com/p/vimwiki/
" Author: Maxim Kim
" Filenames: *.wiki
-" Last Change: (04.05.2008 17:45)
-" Version: 0.1
+" Last Change: (05.05.2008 19:30)
+" Version: 0.2
" Based on FlexWiki
" Quit if syntax file is already loaded
@@ -26,70 +26,51 @@ syntax match wikiLink `\("[^"(]\+\((\([^)]\+\))\)\?":\)\?\(https\?\|ft
" text: *strong*
syntax match wikiBold /\(^\|\W\)\zs\*\([^ ].\{-}\)\*/
-" '''bold'''
-syntax match wikiBold /'''\([^'].\{-}\)'''/
" text: _emphasis_
-syntax match wikiItalic /\(^\|\W\)\zs_\([^ ].\{-}\)_/
-" ''italic''
-syntax match wikiItalic /''\([^'].\{-}\)''/
+syntax match wikiItalic /_.\{-}_/
-" ``deemphasis``
-syntax match wikiDeEmphasis /``\([^`].\{-}\)``/
+" text: `code`
+syntax match wikiCode /`.\{-}`/
-" text: @code@
-syntax match wikiCode /\(^\|\s\|(\|\[\)\zs@\([^@]\+\)@/
-
-" text: -deleted text-
-syntax match wikiDelText /\(^\|\s\+\)\zs-\([^ <a ]\|[^ <img ]\|[^ -].*\)-/
-
-" text: +inserted text+
-syntax match wikiInsText /\(^\|\W\)\zs+\([^ ].\{-}\)+/
+" text: ~~deleted text~~
+syntax match wikiDelText /\~\{2}.\{-}\~\{2}/
" text: ^superscript^
-syntax match wikiSuperScript /\(^\|\W\)\zs^\([^ ].\{-}\)^/
+syntax match wikiSuperScript /\^.\{-}\^/
-" text: ~subscript~
-syntax match wikiSubScript /\(^\|\W\)\zs\~\([^ ].\{-}\)\~/
-
-" text: ??citation??
-syntax match wikiCitation /\(^\|\W\)\zs??\([^ ].\{-}\)??/
+" text: ,,subscript,,
+syntax match wikiSubScript /,,.\{-},,/
" Emoticons: must come after the Textilisms, as later rules take precedence
" over earlier ones. This match is an approximation for the ~70 distinct
" patterns that FlexWiki knows.
syntax match wikiEmoticons /\((.)\|:[()|$@]\|:-[DOPS()\]|$@]\|;)\|:'(\)/
-" Aggregate all the regular text highlighting into flexwikiText
-syntax cluster wikiText contains=wikiItalic,wikiBold,wikiCode,wikiDeEmphasis,wikiDelText,wikiInsText,wikiSuperScript,wikiSubScript,wikiCitation,wikiLink,wikiWord,wikiEmoticons
+" Aggregate all the regular text highlighting into wikiText
+syntax cluster wikiText contains=wikiItalic,wikiBold,wikiCode,wikiDelText,wikiSuperScript,wikiSubScript,wikiLink,wikiWord,wikiEmoticons
-" single-line WikiPropertys
-syntax match wikiSingleLineProperty /^:\?[A-Z_][_a-zA-Z0-9]\+:/
+" Treat all other lines that start with spaces as PRE-formatted text.
+syntax match wikiPre /^[ \t]\+.*$/ contains=@wikiText
" Header levels, 1-6
-syntax match wikiH1 /^!.*$/
-syntax match wikiH2 /^!!.*$/
-syntax match wikiH3 /^!!!.*$/
-syntax match wikiH4 /^!!!!.*$/
-syntax match wikiH5 /^!!!!!.*$/
-syntax match wikiH6 /^!!!!!!.*$/
+syntax match wikiH1 /\(^!\{1}.*$\|^\s*=\{1}.*=\{1}\s*$\)/
+syntax match wikiH2 /\(^!\{2}.*$\|^\s*=\{2}.*=\{2}\s*$\)/
+syntax match wikiH3 /\(^!\{3}.*$\|^\s*=\{3}.*=\{3}\s*$\)/
+syntax match wikiH4 /\(^!\{4}.*$\|^\s*=\{4}.*=\{4}\s*$\)/
+syntax match wikiH5 /\(^!\{5}.*$\|^\s*=\{5}.*=\{5}\s*$\)/
+syntax match wikiH6 /\(^!\{6}.*$\|^\s*=\{6}.*=\{6}\s*$\)/
" <hr>, horizontal rule
syntax match wikiHR /^----.*$/
-" Formatting can be turned off by ""enclosing it in pairs of double quotes""
-syntax match wikiEscape /"".\{-}""/
-
" Tables. Each line starts and ends with '||'; each cell is separated by '||'
syntax match wikiTable /||/
-" Treat all other lines that start with spaces as PRE-formatted text.
-syntax match wikiPre /^[ \t]\+.*$/
-
" Bulleted list items start with whitespace(s), then '*'
" syntax match wikiList /^\s\+\(\*\|[1-9]\+0*\.\).*$/ contains=@wikiText
" highlight only bullets and digits.
-syntax match wikiList /^\s\+\(\*\|[1-9]\+0*\.\)/
+syntax match wikiList /^\s\+\(\*\|[1-9]\+0*\.\|#\)/
@@ -102,11 +83,11 @@ hi def link wikiH4 wikiH3
hi def link wikiH5 wikiH4
hi def link wikiH6 wikiH5
hi def link wikiHR wikiH6
-
+
hi def wikiBold term=bold cterm=bold gui=bold
hi def wikiItalic term=italic cterm=italic gui=italic
-hi def link wikiCode Statement
+hi def link wikiCode PreProc
hi def link wikiWord Underlined
hi def link wikiEscape Todo
@@ -116,7 +97,6 @@ hi def link wikiList Type
hi def link wikiTable Type
hi def link wikiEmoticons Constant
hi def link wikiDelText Comment
-hi def link wikiDeEmphasis Comment
hi def link wikiInsText Constant
hi def link wikiSuperScript Constant
hi def link wikiSubScript Constant