Add a unit test. This here is a grey triangle moment, folks.

--HG--
extra : rebase_source : 17ea9665bc826a9365264122781e1a7f99948b34
This commit is contained in:
Steve Losh 2010-11-10 19:52:08 -05:00
parent aa7d609b03
commit 6e679d6d4f
57 changed files with 7235 additions and 0 deletions

View File

@ -0,0 +1 @@
/Users/sjl/src/gundo.vim/tests/bundled/ut/autoload/lh/UT.vim

View File

@ -0,0 +1,147 @@
"=============================================================================
" $Id: askvim.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: autoload/lh/askvim.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 17th Apr 2007
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $ (17th Apr 2007)
"------------------------------------------------------------------------
" Description:
" Defines functions that asks vim what it is relinquish to tell us
" - menu
"
"------------------------------------------------------------------------
" Installation:
" Drop it into {rtp}/autoload/lh/
" Vim 7+ required.
" History:
" v2.0.0:
" TODO: «missing features»
" }}}1
"=============================================================================
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
" ## Functions {{{1
" # Debug {{{2
function! lh#askvim#verbose(level)
let s:verbose = a:level
endfunction
function! s:Verbose(expr)
if exists('s:verbose') && s:verbose
echomsg a:expr
endif
endfunction
function! lh#askvim#debug(expr)
return eval(a:expr)
endfunction
"------------------------------------------------------------------------
" # Public {{{2
" Function: lh#askvim#exe(command) {{{3
function! lh#askvim#Exe(command)
echomsg 'lh#askvim#Exe() is deprecated, use lh#askvim#exe()'
return lh#askvim#exe(a:command)
endfunction
function! lh#askvim#exe(command)
let save_a = @a
try
silent! redir @a
silent! exe a:command
redir END
finally
" Always restore everything
let res = @a
let @a = save_a
return res
endtry
endfunction
" Function: lh#askvim#menu(menuid) {{{3
function! s:AskOneMenu(menuact, res)
let sKnown_menus = lh#askvim#exe(a:menuact)
let lKnown_menus = split(sKnown_menus, '\n')
" echo string(lKnown_menus)
" 1- search for the menuid
" todo: fix the next line to correctly interpret "stuff\.stuff" and
" "stuff\\.stuff".
let menuid_parts = split(a:menuact, '\.')
let simplifiedKnown_menus = deepcopy(lKnown_menus)
call map(simplifiedKnown_menus, 'substitute(v:val, "&", "", "g")')
" let idx = lh#list#match(simplifiedKnown_menus, '^\d\+\s\+'.menuid_parts[-1])
let idx = match(simplifiedKnown_menus, '^\d\+\s\+'.menuid_parts[-1])
if idx == -1
" echo "not found"
return
endif
" echo "l[".idx."]=".lKnown_menus[idx]
if empty(a:res)
let a:res.priority = matchstr(lKnown_menus[idx], '\d\+\ze\s\+.*')
let a:res.name = matchstr(lKnown_menus[idx], '\d\+\s\+\zs.*')
let a:res.actions = {}
" else
" what if the priority isn't the same?
endif
" 2- search for the menu definition
let idx += 1
while idx != len(lKnown_menus)
echo "l[".idx."]=".lKnown_menus[idx]
" should not happen
if lKnown_menus[idx] =~ '^\d\+' | break | endif
" :h showing-menus
" -> The format of the result of the call to Exe() seems to be:
" ^ssssMns-sACTION$
" s == 1 whitespace
" M == mode (inrvcs)
" n == noremap(*)/script(&)
" - == disable(-)/of not
let act = {}
let menu_def = matchlist(lKnown_menus[idx],
\ '^\s*\([invocs]\)\([&* ]\) \([- ]\) \(.*\)$')
if len(menu_def) > 4
let act.mode = menu_def[1]
let act.nore_script = menu_def[2]
let act.disabled = menu_def[3]
let act.action = menu_def[4]
else
echomsg string(menu_def)
echoerr "lh#askvim#menu(): Cannot decode ``".lKnown_menus[idx]."''"
endif
let a:res.actions["mode_" . act.mode] = act
let idx += 1
endwhile
" n- Return the result
return a:res
endfunction
function! lh#askvim#menu(menuid, modes)
let res = {}
let i = 0
while i != strlen(a:modes)
call s:AskOneMenu(a:modes[i].'menu '.a:menuid, res)
let i += 1
endwhile
return res
endfunction
" Functions }}}1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,97 @@
"=============================================================================
" $Id: buffer.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: autoload/lh/buffer.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 23rd Jan 2007
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $
"------------------------------------------------------------------------
" Description:
" Defines functions that help finding windows and handling buffers.
"
"------------------------------------------------------------------------
" Installation:
" Drop it into {rtp}/autoload/lh/
" Vim 7+ required.
" History:
" v 1.0.0 First Version
" (*) Functions moved from searchInRuntimeTime
" v 2.2.0
" (*) new function: lh#buffer#list()
" TODO:
" }}}1
"=============================================================================
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
" ## Functions {{{1
"------------------------------------------------------------------------
" # Debug {{{2
function! lh#buffer#verbose(level)
let s:verbose = a:level
endfunction
function! s:Verbose(expr)
if exists('s:verbose') && s:verbose
echomsg a:expr
endif
endfunction
function! lh#buffer#debug(expr)
return eval(a:expr)
endfunction
"------------------------------------------------------------------------
" # Public {{{2
" Function: lh#buffer#find({filename}) {{{3
" If {filename} is opened in a window, jump to this window, otherwise return -1
" Moved from searchInRuntimeTime.vim
function! lh#buffer#find(filename)
let b = bufwinnr(a:filename)
if b == -1 | return b | endif
exe b.'wincmd w'
return b
endfunction
function! lh#buffer#Find(filename)
return lh#buffer#find(a:filename)
endfunction
" Function: lh#buffer#jump({filename},{cmd}) {{{3
function! lh#buffer#jump(filename, cmd)
if lh#buffer#find(a:filename) != -1 | return | endif
exe a:cmd . ' ' . a:filename
endfunction
function! lh#buffer#Jump(filename, cmd)
return lh#buffer#jump(a:filename, a:cmd)
endfunction
" Function: lh#buffer#scratch({bname},{where}) {{{3
function! lh#buffer#scratch(bname, where)
try
silent exe a:where.' sp '.a:bname
catch /.*/
throw "Can't open a buffer named '".a:bname."'!"
endtry
setlocal bt=nofile bh=wipe nobl noswf ro
endfunction
function! lh#buffer#Scratch(bname, where)
return lh#buffer#scratch(a:bname, a:where)
endfunction
" Function: lh#buffer#list() {{{3
function! lh#buffer#list()
let all = range(0, bufnr('$'))
" let res = lh#list#transform_if(all, [], 'v:1_', 'buflisted')
let res = lh#list#copy_if(all, [], 'buflisted')
return res
endfunction
" Ex: echo lh#list#transform(lh#buffer#list(), [], "bufname")
"=============================================================================
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,268 @@
"=============================================================================
" $Id: dialog.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: autoload/lh/buffer/dialog.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 21st Sep 2007
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $
"------------------------------------------------------------------------
" Description: «description»
"
"------------------------------------------------------------------------
" Installation:
" Drop it into {rtp}/autoload/lh/
" Vim 7+ required.
" History:
" v 1.0.0 First Version
" (*) Functions imported from Mail_mutt_alias.vim
" TODO:
" (*) --abort-- line
" (*) custom messages
" (*) do not mess with search history
" (*) support any &magic
" (*) syntax
" (*) add number/letters
" (*) tag with '[x] ' instead of '* '
" }}}1
"=============================================================================
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"=============================================================================
" ## Globals {{{1
let s:LHdialog = {}
"=============================================================================
" ## Functions {{{1
" # Debug {{{2
function! lh#buffer#dialog#verbose(level)
let s:verbose = a:level
endfunction
function! s:Verbose(expr)
if exists('s:verbose') && s:verbose
echomsg a:expr
endif
endfunction
function! lh#buffer#dialog#debug(expr)
return eval(a:expr)
endfunction
"=============================================================================
" # Dialog functions {{{2
"------------------------------------------------------------------------
function! s:Mappings(abuffer)
" map <enter> to edit a file, also dbl-click
exe "nnoremap <silent> <buffer> <esc> :silent call ".a:abuffer.action."(-1, ".a:abuffer.id.")<cr>"
exe "nnoremap <silent> <buffer> q :call lh#buffer#dialog#select(-1, ".a:abuffer.id.")<cr>"
exe "nnoremap <silent> <buffer> <cr> :call lh#buffer#dialog#select(line('.'), ".a:abuffer.id.")<cr>"
" nnoremap <silent> <buffer> <2-LeftMouse> :silent call <sid>GrepEditFileLine(line("."))<cr>
" nnoremap <silent> <buffer> Q :call <sid>Reformat()<cr>
" nnoremap <silent> <buffer> <Left> :set tabstop-=1<cr>
" nnoremap <silent> <buffer> <Right> :set tabstop+=1<cr>
if a:abuffer.support_tagging
nnoremap <silent> <buffer> t :silent call <sid>ToggleTag(line("."))<cr>
nnoremap <silent> <buffer> <space> :silent call <sid>ToggleTag(line("."))<cr>
endif
nnoremap <silent> <buffer> <tab> :silent call <sid>NextChoice('')<cr>
nnoremap <silent> <buffer> <S-tab> :silent call <sid>NextChoice('b')<cr>
exe "nnoremap <silent> <buffer> h :silent call <sid>ToggleHelp(".a:abuffer.id.")<cr>"
endfunction
"----------------------------------------
" Tag / untag the current choice {{{
function! s:ToggleTag(lineNum)
if a:lineNum > s:Help_NbL()
" If tagged
if (getline(a:lineNum)[0] == '*')
let b:NbTags = b:NbTags - 1
silent exe a:lineNum.'s/^\* / /e'
else
let b:NbTags = b:NbTags + 1
silent exe a:lineNum.'s/^ /* /e'
endif
" Move after the tag ; there is something with the two previous :s. They
" don't leave the cursor at the same position.
silent! normal! 3|
call s:NextChoice('') " move to the next choice
endif
endfunction
" }}}
function! s:Help_NbL()
" return 1 + nb lines of BuildHelp
return 2 + len(b:dialog['help_'.b:dialog.help_type])
endfunction
"----------------------------------------
" Go to the Next (/previous) possible choice. {{{
function! s:NextChoice(direction)
" echomsg "next!"
call search('^[ *]\s*\zs\S\+', a:direction)
endfunction
" }}}
"------------------------------------------------------------------------
function! s:RedisplayHelp(dialog)
silent! 2,$g/^@/d_
normal! gg
for help in a:dialog['help_'.a:dialog.help_type]
silent put=help
endfor
endfunction
function! lh#buffer#dialog#update(dialog)
set noro
exe (s:Help_NbL()+1).',$d_'
for choice in a:dialog.choices
silent $put=' '.choice
endfor
set ro
endfunction
function! s:Display(dialog, atitle)
set noro
0 put = a:atitle
call s:RedisplayHelp(a:dialog)
for choice in a:dialog.choices
silent $put=' '.choice
endfor
set ro
exe s:Help_NbL()+1
endfunction
function! s:ToggleHelp(bufferId)
call lh#buffer#find(a:bufferId)
call b:dialog.toggle_help()
endfunction
function! lh#buffer#dialog#toggle_help() dict
let self.help_type
\ = (self.help_type == 'short')
\ ? 'long'
\ : 'short'
call s:RedisplayHelp(self)
endfunction
function! lh#buffer#dialog#new(bname, title, where, support_tagging, action, choices)
" The ID will be the buffer id
let res = {}
let where_it_started = getpos('.')
let where_it_started[0] = bufnr('%')
let res.where_it_started = where_it_started
try
call lh#buffer#scratch(a:bname, a:where)
catch /.*/
echoerr v:exception
return res
endtry
let res.id = bufnr('%')
let b:NbTags = 0
let b:dialog = res
let s:LHdialog[res.id] = res
let res.help_long = []
let res.help_short = []
let res.help_type = 'short'
let res.support_tagging = a:support_tagging
let res.action = a:action
let res.choices = a:choices
" Long help
call lh#buffer#dialog#add_help(res, '@| <cr>, <double-click> : select this', 'long')
call lh#buffer#dialog#add_help(res, '@| <esc>, q : Abort', 'long')
if a:support_tagging
call lh#buffer#dialog#add_help(res, '@| <t>, <space> : Tag/Untag the current item', 'long')
endif
call lh#buffer#dialog#add_help(res, '@| <up>/<down>, <tab>, +/- : Move between entries', 'long')
call lh#buffer#dialog#add_help(res, '@|', 'long')
" call lh#buffer#dialog#add_help(res, '@| h : Toggle help', 'long')
call lh#buffer#dialog#add_help(res, '@+'.repeat('-', winwidth(bufwinnr(res.id))-3), 'long')
" Short Help
" call lh#buffer#dialog#add_help(res, '@| h : Toggle help', 'short')
call lh#buffer#dialog#add_help(res, '@+'.repeat('-', winwidth(bufwinnr(res.id))-3), 'short')
let res.toggle_help = function("lh#buffer#dialog#toggle_help")
let title = '@ ' . a:title
let helpstr = '| Toggle (h)elp'
let title = title
\ . repeat(' ', winwidth(bufwinnr(res.id))-strlen(title)-strlen(helpstr)-1)
\ . helpstr
call s:Display(res, title)
call s:Mappings(res)
return res
endfunction
function! lh#buffer#dialog#add_help(abuffer, text, help_type)
call add(a:abuffer['help_'.a:help_type],a:text)
endfunction
"=============================================================================
function! lh#buffer#dialog#quit()
let bufferId = b:dialog.where_it_started[0]
echohl WarningMsg
echo "Abort"
echohl None
quit
call lh#buffer#find(bufferId)
endfunction
" Function: lh#buffer#dialog#select(line, bufferId [,overriden-action])
function! lh#buffer#dialog#select(line, bufferId, ...)
if a:line == -1
call lh#buffer#dialog#quit()
return
" elseif a:line <= s:Help_NbL() + 1
elseif a:line <= s:Help_NbL()
echoerr "Unselectable item"
return
else
let dialog = s:LHdialog[a:bufferId]
let results = { 'dialog' : dialog, 'selection' : [] }
if b:NbTags == 0
" -1 because first index is 0
" let results = [ dialog.choices[a:line - s:Help_NbL() - 1] ]
let results.selection = [ a:line - s:Help_NbL() - 1 ]
else
silent g/^* /call add(results.selection, line('.')-s:Help_NbL()-1)
endif
endif
if a:0 > 0 " action overriden
exe 'call '.dialog.action.'(results, a:000)'
else
exe 'call '.dialog.action.'(results)'
endif
endfunction
function! lh#buffer#dialog#Select(line, bufferId, ...)
echomsg "lh#buffer#dialog#Select() is deprecated, use lh#buffer#dialog#select() instead"
if a:0 > 0 " action overriden
exe 'call lh#buffer#dialog#select(a:line, a:bufferId, a:1)'
else
exe 'call lh#buffer#dialog#select(a:line, a:bufferId)'
endif
endfunction
function! Action(results)
let dialog = a:results.dialog
let choices = dialog.choices
for r in a:results.selection
echomsg '-> '.choices[r]
endfor
endfunction
"=============================================================================
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,224 @@
"=============================================================================
" $Id: command.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: autoload/lh/command.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 08th Jan 2007
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $ (08th Jan 2007)
"------------------------------------------------------------------------
" Description:
" Helpers to define commands that:
" - support subcommands
" - support autocompletion
"
"------------------------------------------------------------------------
" Installation:
" Drop it into {rtp}/autoload/lh/
" Vim 7+ required.
" History:
" v2.0.0:
" Code move from other plugins
" TODO: «missing features»
" }}}1
"=============================================================================
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
" ## Debug {{{1
function! lh#command#verbose(level)
let s:verbose = a:level
endfunction
function! s:Verbose(expr)
if exists('s:verbose') && s:verbose
echomsg a:expr
endif
endfunction
function! lh#command#debug(expr)
return eval(a:expr)
endfunction
"------------------------------------------------------------------------
" ## Functions {{{1
" Tool functions {{{2
" Function: lh#command#Fargs2String(aList) {{{3
" @param[in,out] aList list of params from <f-args>
" @see tests/lh/test-Fargs2String.vim
function! lh#command#Fargs2String(aList)
if empty(a:aList) | return '' | endif
let quote_char = a:aList[0][0]
let res = a:aList[0]
call remove(a:aList, 0)
if quote_char !~ '["'."']"
return res
endif
" else
let end_string = '[^\\]\%(\\\\\)*'.quote_char.'$'
while !empty(a:aList) && res !~ end_string
let res .= ' ' . a:aList[0]
call remove(a:aList, 0)
endwhile
return res
endfunction
"------------------------------------------------------------------------
" ## Experimental Functions {{{1
" Internal functions {{{2
" Function: s:SaveData({Data}) {{{3
" @param Data Command definition
" Saves {Data} as s:Data{s:data_id++}. The definition will be used by
" automatically generated commands.
" @return s:data_id
let s:data_id = 0
function! s:SaveData(Data)
if has_key(a:Data, "command_id")
" Avoid data duplication
return a:Data.command_id
else
let s:Data{s:data_id} = a:Data
let id = s:data_id
let s:data_id += 1
let a:Data.command_id = id
return id
endif
endfunction
" BTWComplete(ArgLead, CmdLine, CursorPos): Auto-complete {{{3
function! lh#command#complete(ArgLead, CmdLine, CursorPos)
let tmp = substitute(a:CmdLine, '\s*\S*', 'Z', 'g')
let pos = strlen(tmp)
if 0
call confirm( "AL = ". a:ArgLead."\nCL = ". a:CmdLine."\nCP = ".a:CursorPos
\ . "\ntmp = ".tmp."\npos = ".pos
\, '&Ok', 1)
endif
if 2 == pos
" First argument: a command
return s:commands
elseif 3 == pos
" Second argument: first arg of the command
if -1 != match(a:CmdLine, '^BTW\s\+echo')
return s:functions . "\n" . s:variables
elseif -1 != match(a:CmdLine, '^BTW\s\+\%(help\|?\)')
elseif -1 != match(a:CmdLine, '^BTW\s\+\%(set\|add\)\%(local\)\=')
" Adds a filter
" let files = globpath(&rtp, 'compiler/BT-*')
" let files = files . globpath(&rtp, 'compiler/BT_*')
" let files = files . globpath(&rtp, 'compiler/BT/*')
let files = s:FindFilter('*')
let files = substitute(files,
\ '\(^\|\n\).\{-}compiler[\\/]BTW[-_\\/]\(.\{-}\)\.vim\>\ze\%(\n\|$\)',
\ '\1\2', 'g')
return files
elseif -1 != match(a:CmdLine, '^BTW\s\+remove\%(local\)\=')
" Removes a filter
return substitute(s:FiltersList(), ',', '\n', 'g')
endif
endif
" finally: unknown
echoerr 'BTW: unespected parameter ``'. a:ArgLead ."''"
return ''
endfunction
function! s:BTW(command, ...)
" todo: check a:0 > 1
if 'set' == a:command | let g:BTW_build_tool = a:1
if exists('b:BTW_build_tool')
let b:BTW_build_tool = a:1
endif
elseif 'setlocal' == a:command | let b:BTW_build_tool = a:1
elseif 'add' == a:command | call s:AddFilter('g', a:1)
elseif 'addlocal' == a:command | call s:AddFilter('b', a:1)
" if exists('b:BTW_filters_list') " ?????
" call s:AddFilter('b', a:1)
" endif
elseif 'remove' == a:command | call s:RemoveFilter('g', a:1)
elseif 'removelocal' == a:command | call s:RemoveFilter('b', a:1)
elseif 'rebuild' == a:command " wait for s:ReconstructToolsChain()
elseif 'echo' == a:command | exe "echo s:".a:1
" echo s:{a:f1} ## don't support «echo s:f('foo')»
elseif 'reloadPlugin' == a:command
let g:force_reload_BuildToolsWrapper = 1
let g:BTW_BTW_in_use = 1
exe 'so '.s:sfile
unlet g:force_reload_BuildToolsWrapper
unlet g:BTW_BTW_in_use
return
elseif a:command =~ '\%(help\|?\)'
call s:Usage()
return
endif
call s:ReconstructToolsChain()
endfunction
" ##############################################################
" Public functions {{{2
function! s:FindSubcommand(definition, subcommand)
for arg in a:definition.arguments
if arg.name == a:subcommand
return arg
endif
endfor
throw "NF"
endfunction
function! s:execute_function(definition, params)
if len(a:params) < 1
throw "(lh#command) Not enough arguments"
endif
let l:Fn = a:definition.action
echo "calling ".string(l:Fn)
echo "with ".string(a:params)
" call remove(a:params, 0)
call l:Fn(a:params)
endfunction
function! s:execute_sub_commands(definition, params)
try
if len(a:params) < 1
throw "(lh#command) Not enough arguments"
endif
let subcommand = s:FindSubcommand(a:definition, a:params[0])
call remove(a:params, 0)
call s:int_execute(subcommand, a:params)
catch /NF.*/
throw "(lh#command) Unexpected subcommand `".a:params[0]."'."
endtry
endfunction
function! s:int_execute(definition, params)
echo "params=".string(a:params)
call s:execute_{a:definition.arg_type}(a:definition, a:params)
endfunction
function! s:execute(definition, ...)
try
let params = copy(a:000)
call s:int_execute(a:definition, params)
catch /(lh#command).*/
echoerr v:exception . " in `".a:definition.name.' '.join(a:000, ' ')."'"
endtry
endfunction
function! lh#command#new(definition)
let cmd_name = a:definition.name
" Save the definition as an internal script variable
let id = s:SaveData(a:definition)
exe "command! -nargs=* ".cmd_name." :call s:execute(s:Data".id.", <f-args>)"
endfunction
" Functions }}}1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,93 @@
"=============================================================================
" $Id: common.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: autoload/lh/common.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 07th Oct 2006
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $ (08th Feb 2008)
"------------------------------------------------------------------------
" Description:
" Some common functions for:
" - displaying error messages
" - checking dependencies
"
"------------------------------------------------------------------------
" Installation:
" Drop it into {rtp}/autoload/lh/
" Vim 7+ required.
" History:
" v2.1.1
" - New function: lh#common#echomsg_multilines()
" - lh#common#warning_msg() supports multilines messages
"
" v2.0.0:
" - Code moved from other plugins
" }}}1
"=============================================================================
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
" Functions {{{1
" Function: lh#common#echomsg_multilines {{{2
function! lh#common#echomsg_multilines(text)
let lines = split(a:text, "[\n\r]")
for line in lines
echomsg line
endfor
endfunction
function! lh#common#echomsgMultilines(text)
return lh#common#echomsg_multilines(a:text)
endfunction
" Function: lh#common#error_msg {{{2
function! lh#common#error_msg(text)
if has('gui_running')
call confirm(a:text, '&Ok', '1', 'Error')
else
" echohl ErrorMsg
echoerr a:text
" echohl None
endif
endfunction
function! lh#common#ErrorMsg(text)
return lh#common#error_msg(a:text)
endfunction
" Function: lh#common#warning_msg {{{2
function! lh#common#warning_msg(text)
echohl WarningMsg
" echomsg a:text
call lh#common#echomsg_multilines(a:text)
echohl None
endfunction
function! lh#common#WarningMsg(text)
return lh#common#warning_msg(a:text)
endfunction
" Dependencies {{{2
function! lh#common#check_deps(Symbol, File, path, plugin) " {{{3
if !exists(a:Symbol)
exe "runtime ".a:path.a:File
if !exists(a:Symbol)
call lh#common#error_msg( a:plugin.': Requires <'.a:File.'>')
return 0
endif
endif
return 1
endfunction
function! lh#common#CheckDeps(Symbol, File, path, plugin) " {{{3
echomsg "lh#common#CheckDeps() is deprecated, use lh#common#check_deps() instead."
return lh#common#check_deps(a:Symbol, a:File, a:path, a:plugin)
endfunction
" Functions }}}1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,49 @@
"=============================================================================
" $Id: encoding.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: autoload/lh/encoding.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 21st Feb 2008
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $
"------------------------------------------------------------------------
" Description:
" Defines functions that help managing various encodings
"
"------------------------------------------------------------------------
" Installation:
" Drop it into {rtp}/autoload/lh/
" Vim 7+ required.
" History:
" v2.0.7:
" (*) lh#encoding#Iconv() copied from map-tools
" TODO: «missing features»
" }}}1
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
" Function: lh#encoding#iconv(expr, from, to) " {{{3
" Unlike |iconv()|, this wrapper returns {expr} when we know no convertion can
" be acheived.
function! lh#encoding#iconv(expr, from, to)
" call Dfunc("s:ICONV(".a:expr.','.a:from.','.a:to.')')
if has('multi_byte') &&
\ ( has('iconv') || has('iconv/dyn') ||
\ ((a:from=~'latin1\|utf-8') && (a:to=~'latin1\|utf-8')))
" call confirm('encoding: '.&enc."\nto:".a:to, "&Ok", 1)
" call Dret("s:ICONV convert=".iconv(a:expr, a:from, a:to))
return iconv(a:expr,a:from,a:to)
else
" Cannot convert
" call Dret("s:ICONV no convert=".a:expr)
return a:expr
endif
endfunction
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,75 @@
"=============================================================================
" $Id: env.vim 244 2010-09-19 22:38:24Z luc.hermitte $
" File: autoload/lh/env.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 19th Jul 2010
" Last Update: $Date: 2010-09-19 18:38:24 -0400 (Sun, 19 Sep 2010) $
"------------------------------------------------------------------------
" Description:
" Functions related to environment (variables)
"
"------------------------------------------------------------------------
" Installation:
" Drop this file into {rtp}/autoload/lh
" Requires Vim7+
" History:
" v2.2.1 First Version
" TODO: «missing features»
" }}}1
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
" ## Misc Functions {{{1
" # Version {{{2
let s:k_version = 221
function! lh#env#version()
return s:k_version
endfunction
" # Debug {{{2
let s:verbose = 0
function! lh#env#verbose(...)
if a:0 > 0 | let s:verbose = a:1 | endif
return s:verbose
endfunction
function! s:Verbose(expr)
if s:verbose
echomsg a:expr
endif
endfunction
function! lh#env#debug(expr)
return eval(a:expr)
endfunction
"------------------------------------------------------------------------
" ## Exported functions {{{1
function! lh#env#expand_all(string)
let res = ''
let tail = a:string
while !empty(tail)
let [ all, head, var, tail; dummy ] = matchlist(tail, '\(.\{-}\)\%(${\(.\{-}\)}\)\=\(.*\)')
if empty(var)
let res .= tail
break
else
let res .= head
let val = eval('$'.var)
let res .= val
endif
endwhile
return res
endfunction
"------------------------------------------------------------------------
" ## Internal functions {{{1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,68 @@
"=============================================================================
" $Id: event.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: autoload/lh/event.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 15th Feb 2008
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $
"------------------------------------------------------------------------
" Description:
" Function to help manage vim |autocommand-events|
"
"------------------------------------------------------------------------
" Installation:
" Drop it into {rtp}/autoload/lh/
" Vim 7+ required.
" History:
" v2.0.6:
" Creation
" TODO:
" }}}1
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
" ## Functions {{{1
" # Debug {{{2
function! lh#event#verbose(level)
let s:verbose = a:level
endfunction
function! s:Verbose(expr)
if exists('s:verbose') && s:verbose
echomsg a:expr
endif
endfunction
function! lh#event#debug(expr)
return eval(a:expr)
endfunction
"------------------------------------------------------------------------
" # Event Registration {{{2
function! s:RegisteredOnce(cmd, group)
" We can't delete the current augroup autocommand => increment a counter
if !exists('s:'.a:group) || s:{a:group} == 0
let s:{a:group} = 1
exe a:cmd
endif
endfunction
function! lh#event#register_for_one_execution_at(event, cmd, group)
let group = a:group.'_once'
let s:{group} = 0
exe 'augroup '.group
au!
exe 'au '.a:event.' '.expand('%:p').' call s:RegisteredOnce('.string(a:cmd).','.string(group).')'
augroup END
endfunction
function! lh#event#RegisterForOneExecutionAt(event, cmd, group)
return lh#event#register_for_one_execution_at(a:event, a:cmd, a:group)
endfunction
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,214 @@
"=============================================================================
" $Id: function.vim 161 2010-05-07 01:04:44Z luc.hermitte $
" File: autoload/lh/function.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.0
" Created: 03rd Nov 2008
" Last Update: $Date: 2010-05-06 21:04:44 -0400 (Thu, 06 May 2010) $
"------------------------------------------------------------------------
" Description:
" Implements:
" - lh#function#bind()
" - lh#function#execute()
" - lh#function#prepare()
" - a binded function type
"
"------------------------------------------------------------------------
" Installation:
" Drop it into {rtp}/autoload/lh/
" Vim 7+ required.
" History:
" v2.2.0: first implementation
" TODO: «missing features»
" }}}1
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
" ## Functions {{{1
" # Debug {{{2
function! lh#function#verbose(level)
let s:verbose = a:level
endfunction
function! s:Verbose(expr)
if exists('s:verbose') && s:verbose
echomsg a:expr
endif
endfunction
function! lh#function#debug(expr)
return eval(a:expr)
endfunction
" # Function: s:Join(arguments...) {{{2
function! s:Join(args)
let res = ''
if len(a:args) > 0
let res = string(a:args[0])
let i = 1
while i != len(a:args)
let res.=','.string(a:args[i])
let i += 1
endwhile
endif
return res
endfunction
" # Function: s:DoBindList(arguments...) {{{2
function! s:DoBindList(formal, real)
let args = []
for arg in a:formal
if type(arg)==type('string') && arg =~ '^v:\d\+_$'
let new = a:real[matchstr(arg, 'v:\zs\d\+\ze_')-1]
elseif type(arg)==type('string')
let new = eval(s:DoBindEvaluatedString(arg, a:real))
else
let new = arg
endif
call add(args, new)
unlet new
unlet arg
endfor
return args
endfunction
" # Function: s:DoBindString(arguments...) {{{2
function! s:DoBindString(expr, real)
let expr = substitute(a:expr, '\<v:\(\d\+\)_\>', a:real.'[\1-1]', 'g')
return expr
endfunction
function! s:ToString(expr)
return type(a:expr) != type('')
\ ? string(a:expr)
\ : (a:expr)
endfunction
function! s:DoBindEvaluatedString(expr, real)
let expr = a:expr
let p = 0
while 1
let p = match(expr, '\<v:\d\+_\>', p)
if -1 == p | break | endif
let e = matchend(expr, '\<v:\d\+_\>', p)
let n = eval(expr[p+2 : e-2])
" let new = (type(a:real[n-1])==type('') && a:real[n-1]=~ '\<v:\d\+_\>')
" \ ? a:real[n-1]
" \ : string(a:real[n-1])
let new = s:ToString(a:real[n-1])
" let new = string(a:real[n-1]) " -> bind_counpound vars
let expr = ((p>0) ? (expr[0:p-1]) : '') . new . expr[e : -1]
" echo expr
let p += len(new)
" silent! unlet new
endwhile
return expr
endfunction
" # Function: s:Execute(arguments...) {{{2
function! s:Execute(args) dict
if type(self.function) == type(function('exists'))
let args = s:DoBindList(self.args, a:args)
" echomsg '##'.string(self.function).'('.join(args, ',').')'
let res = eval(string(self.function).'('.s:Join(args).')')
elseif type(self.function) == type('string')
let expr = s:DoBindString(self.function, 'a:args')
let res = eval(expr)
elseif type(self.function) == type({})
return self.function.execute(a:args)
else
throw "lh#functor#execute: unpected function type: ".type(self.function)
endif
return res
endfunction
" # Function: lh#function#prepare(function, arguments_list) {{{2
function! lh#function#prepare(Fn, arguments_list)
if type(a:Fn) == type(function('exists'))
let expr = string(a:Fn).'('.s:Join(a:arguments_list).')'
return expr
elseif type(a:Fn) == type('string')
if a:Fn =~ '^[a-zA-Z0-9_#]\+$'
let expr = string(function(a:Fn)).'('.s:Join(a:arguments_list).')'
return expr
else
let expr = s:DoBindString(a:Fn, 'a:000')
return expr
endif
else
throw "lh#function#prepare(): {Fn} argument of type ".type(a:Fn). " is unsupported"
endif
endfunction
" # Function: lh#function#execute(function, arguments...) {{{2
function! lh#function#execute(Fn, ...)
if type(a:Fn) == type({}) && has_key(a:Fn, 'execute')
return a:Fn.execute(a:000)
else
let expr = lh#function#prepare(a:Fn, a:000)
return eval(expr)
endif
endfunction
" # Function: lh#function#bind(function, arguments...) {{{2
function! lh#function#bind(Fn, ...)
let args = copy(a:000)
if type(a:Fn) == type('string') && a:Fn =~ '^[a-zA-Z0-9_#]\+$'
\ && exists('*'.a:Fn)
let Fn = function(a:Fn)
elseif type(a:Fn) == type({})
" echo string(a:Fn).'('.string(a:000).')'
" Rebinding another binded function
" TASSERT has_key(a:Fn, 'function')
" TASSERT has_key(a:Fn, 'execute')
" TASSERT has_key(a:Fn, 'args')
let Fn = a:Fn.function
let N = len(a:Fn.args)
if N != 0 " args to rebind
let i = 0
let t_args = [] " necessary to avoid type changes
while i != N
silent! unlet arg
let arg = a:Fn.args[i]
if arg =~ 'v:\d\+_$'
let arg2 = eval(s:DoBindString(arg, string(args)))
" echo arg."-(".string(args).")->".string(arg2)
unlet arg
let arg = arg2
unlet arg2
endif
call add(t_args, arg)
let i += 1
endwhile
unlet a:Fn.args
let a:Fn.args = t_args
else " expression to fix
" echo Fn
" echo s:DoBindString(Fn, string(args))
" echo eval(string(s:DoBindString(Fn, string(args))))
let Fn = (s:DoBindEvaluatedString(Fn, args))
endif
let args = a:Fn.args
else
let Fn = a:Fn
endif
let binded_fn = {
\ 'function': Fn,
\ 'args': args,
\ 'execute': function('s:Execute')
\}
return binded_fn
endfunction
" }}1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:
" Vim: let g:UTfiles='tests/lh/function.vim'

View File

@ -0,0 +1,177 @@
"=============================================================================
" $Id: tsort.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: autoload/lh/tsort.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 21st Apr 2008
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $
"------------------------------------------------------------------------
" Description: Library functions for Topological Sort
"
"------------------------------------------------------------------------
" Drop the file into {rtp}/autoload/lh/graph
" History: «history»
" TODO: «missing features»
" }}}1
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
" ## Debug {{{1
function! lh#graph#tsort#verbose(level)
let s:verbose = a:level
endfunction
function! s:Verbose(expr)
if exists('s:verbose') && s:verbose
echomsg a:expr
endif
endfunction
function! lh#graph#tsort#debug(expr)
return eval(a:expr)
endfunction
"------------------------------------------------------------------------
"## Helper functions {{{1
"# s:Successors_fully_defined(node) {{{2
function! s:Successors_fully_defined(node) dict
if has_key(self.table, a:node)
return self.table[a:node]
else
return []
endif
endfunction
"# s:Successors_lazy(node) {{{2
function! s:Successors_lazy(node) dict
if !has_key(self.table, a:node)
let nodes = self.fetch(a:node)
let self.table[a:node] = nodes
" if len(nodes) > 0
" let self.nb += 1
" endif
return nodes
else
return self.table[a:node]
endif
endfunction
"# s:PrepareDAG(dag) {{{2
function! s:PrepareDAG(dag)
if type(a:dag) == type(function('has_key'))
let dag = {
\ 'successors': function('s:Successors_lazy'),
\ 'fetch' : a:dag,
\ 'table' : {}
\}
else
let dag = {
\ 'successors': function('s:Successors_fully_defined'),
\ 'table' : deepcopy(a:dag)
\}
endif
return dag
endfunction
"## Depth-first search (recursive) {{{1
" Do not detect cyclic graphs
"# lh#graph#tsort#depth(dag, start_nodes) {{{2
function! lh#graph#tsort#depth(dag, start_nodes)
let dag = s:PrepareDAG(a:dag)
let results = []
let visited_nodes = { 'Visited':function('s:Visited')}
call s:RecursiveDTSort(dag, a:start_nodes, results, visited_nodes)
call reverse(results)
return results
endfunction
"# The real, recursive, T-Sort {{{2
"see boost.graph for a non recursive implementation
function! s:RecursiveDTSort(dag, start_nodes, results, visited_nodes)
for node in a:start_nodes
let visited = a:visited_nodes.Visited(node)
if visited == 1 | continue " done
elseif visited == 2 | throw "Tsort: cyclic graph detected: ".node
endif
let a:visited_nodes[node] = 2 " visiting
let succs = a:dag.successors(node)
try
call s:RecursiveDTSort(a:dag, succs, a:results, a:visited_nodes)
catch /Tsort:/
throw v:exception.'>'.node
endtry
let a:visited_nodes[node] = 1 " visited
call add(a:results, node)
endfor
endfunction
function! s:Visited(node) dict
return has_key(self, a:node) ? self[a:node] : 0
endfunction
"## Breadth-first search (non recursive) {{{1
"# lh#graph#tsort#breadth(dag, start_nodes) {{{2
" warning: This implementation does not work with lazy dag, but only with fully
" defined ones
function! lh#graph#tsort#breadth(dag, start_nodes)
let result = []
let dag = s:PrepareDAG(a:dag)
let queue = deepcopy(a:start_nodes)
while len(queue) > 0
let node = remove(queue, 0)
" echomsg "result <- ".node
call add(result, node)
let successors = dag.successors(node)
while len(successors) > 0
let m = s:RemoveEdgeFrom(dag, node)
" echomsg "graph loose ".node."->".m
if !s:HasIncomingEgde(dag, m)
" echomsg "queue <- ".m
call add(queue, m)
endif
endwhile
endwhile
if !s:Empty(dag)
throw "Tsort: cyclic graph detected: "
endif
return result
endfunction
function! s:HasIncomingEgde(dag, node)
for node in keys(a:dag.table)
if type(a:dag.table[node]) != type([])
continue
endif
if index(a:dag.table[node], a:node) != -1
return 1
endif
endfor
return 0
endfunction
function! s:RemoveEdgeFrom(dag, node)
let successors = a:dag.successors(a:node)
if len(successors) > 0
let successor = remove(successors, 0)
if len(successors) == 0
" echomsg "finished with ->".a:node
call remove(a:dag.table, a:node)
endif
return successor
endif
throw "No more edges from ".a:node
endfunction
function! s:Empty(dag)
" echomsg "len="len(a:dag.table)
return len(a:dag.table) == 0
endfunction
" }}}1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker

View File

@ -0,0 +1,338 @@
"=============================================================================
" $Id: list.vim 236 2010-06-01 00:43:34Z luc.hermitte $
" File: autoload/lh/list.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 17th Apr 2007
" Last Update: $Date: 2010-05-31 20:43:34 -0400 (Mon, 31 May 2010) $ (17th Apr 2007)
"------------------------------------------------------------------------
" Description:
" Defines functions related to |Lists|
"
"------------------------------------------------------------------------
" Installation:
" Drop it into {rtp}/autoload/lh/
" Vim 7+ required.
" History:
" v2.2.1:
" (*) use :unlet in :for loop to support heterogeneous lists
" (*) binary search algorithms (upper_bound, lower_bound, equal_range)
" v2.2.0:
" (*) new functions: lh#list#accumulate, lh#list#transform,
" lh#list#transform_if, lh#list#find_if, lh#list#copy_if,
" lh#list#subset, lh#list#intersect
" (*) the functions are compatible with lh#function functors
" v2.1.1:
" (*) unique_sort
" v2.0.7:
" (*) Bug fix: lh#list#Match()
" v2.0.6:
" (*) lh#list#Find_if() supports search predicate, and start index
" (*) lh#list#Match() supports start index
" v2.0.0:
" TODO: «missing features»
" }}}1
"=============================================================================
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
" ## Functions {{{1
" # Debug {{{2
function! lh#list#verbose(level)
let s:verbose = a:level
endfunction
function! s:Verbose(expr)
if exists('s:verbose') && s:verbose
echomsg a:expr
endif
endfunction
function! lh#list#debug(expr)
return eval(a:expr)
endfunction
"------------------------------------------------------------------------
" # Public {{{2
" Function: lh#list#Transform(input, output, action) {{{3
" deprecated version
function! lh#list#Transform(input, output, action)
let new = map(copy(a:input), a:action)
let res = extend(a:output,new)
return res
for element in a:input
let action = substitute(a:action, 'v:val','element', 'g')
let res = eval(action)
call add(a:output, res)
unlet element " for heterogeneous lists
endfor
return a:output
endfunction
function! lh#list#transform(input, output, action)
for element in a:input
let res = lh#function#execute(a:action, element)
call add(a:output, res)
unlet element " for heterogeneous lists
endfor
return a:output
endfunction
function! lh#list#transform_if(input, output, action, predicate)
for element in a:input
if lh#function#execute(a:predicate, element)
let res = lh#function#execute(a:action, element)
call add(a:output, res)
endif
unlet element " for heterogeneous lists
endfor
return a:output
endfunction
function! lh#list#copy_if(input, output, predicate)
for element in a:input
if lh#function#execute(a:predicate, element)
call add(a:output, element)
endif
unlet element " for heterogeneous lists
endfor
return a:output
endfunction
function! lh#list#accumulate(input, transformation, accumulator)
let transformed = lh#list#transform(a:input, [], a:transformation)
let res = lh#function#execute(a:accumulator, transformed)
return res
endfunction
" Function: lh#list#match(list, to_be_matched [, idx]) {{{3
function! lh#list#match(list, to_be_matched, ...)
let idx = (a:0>0) ? a:1 : 0
while idx < len(a:list)
if match(a:list[idx], a:to_be_matched) != -1
return idx
endif
let idx += 1
endwhile
return -1
endfunction
function! lh#list#Match(list, to_be_matched, ...)
let idx = (a:0>0) ? a:1 : 0
return lh#list#match(a:list, a:to_be_matched, idx)
endfunction
" Function: lh#list#Find_if(list, predicate [, predicate-arguments] [, start-pos]) {{{3
function! lh#list#Find_if(list, predicate, ...)
" Parameters
let idx = 0
let args = []
if a:0 == 2
let idx = a:2
let args = a:1
elseif a:0 == 1
if type(a:1) == type([])
let args = a:1
elseif type(a:1) == type(42)
let idx = a:1
else
throw "lh#list#Find_if: unexpected argument type"
endif
elseif a:0 != 0
throw "lh#list#Find_if: unexpected number of arguments: lh#list#Find_if(list, predicate [, predicate-arguments] [, start-pos])"
endif
" The search loop
while idx != len(a:list)
let predicate = substitute(a:predicate, 'v:val', 'a:list['.idx.']', 'g')
let predicate = substitute(predicate, 'v:\(\d\+\)_', 'args[\1-1]', 'g')
let res = eval(predicate)
if res | return idx | endif
let idx += 1
endwhile
return -1
endfunction
" Function: lh#list#find_if(list, predicate [, predicate-arguments] [, start-pos]) {{{3
function! lh#list#find_if(list, predicate, ...)
" Parameters
let idx = 0
let args = []
if a:0 == 1
let idx = a:1
elseif a:0 != 0
throw "lh#list#find_if: unexpected number of arguments: lh#list#find_if(list, predicate [, start-pos])"
endif
" The search loop
while idx != len(a:list)
" let predicate = substitute(a:predicate, 'v:val', 'a:list['.idx.']', 'g')
let res = lh#function#execute(a:predicate, a:list[idx])
if res | return idx | endif
let idx += 1
endwhile
return -1
endfunction
" Function: lh#list#lower_bound(sorted_list, value [, first[, last]]) {{{3
function! lh#list#lower_bound(list, val, ...)
let first = 0
let last = len(a:list)
if a:0 >= 1 | let first = a:1
elseif a:0 >= 2 | let last = a:2
elseif a:0 > 2
throw "lh#list#equal_range: unexpected number of arguments: lh#list#equal_range(sorted_list, value [, first[, last]])"
endif
let len = last - first
while len > 0
let half = len / 2
let middle = first + half
if a:list[middle] < a:val
let first = middle + 1
let len -= half + 1
else
let len = half
endif
endwhile
return first
endfunction
" Function: lh#list#upper_bound(sorted_list, value [, first[, last]]) {{{3
function! lh#list#upper_bound(list, val, ...)
let first = 0
let last = len(a:list)
if a:0 >= 1 | let first = a:1
elseif a:0 >= 2 | let last = a:2
elseif a:0 > 2
throw "lh#list#equal_range: unexpected number of arguments: lh#list#equal_range(sorted_list, value [, first[, last]])"
endif
let len = last - first
while len > 0
let half = len / 2
let middle = first + half
if a:val < a:list[middle]
let len = half
else
let first = middle + 1
let len -= half + 1
endif
endwhile
return first
endfunction
" Function: lh#list#equal_range(sorted_list, value [, first[, last]]) {{{3
" @return [f, l], where
" f : First position where {value} could be inserted
" l : Last position where {value} could be inserted
function! lh#list#equal_range(list, val, ...)
let first = 0
let last = len(a:list)
" Parameters
if a:0 >= 1 | let first = a:1
elseif a:0 >= 2 | let last = a:2
elseif a:0 > 2
throw "lh#list#equal_range: unexpected number of arguments: lh#list#equal_range(sorted_list, value [, first[, last]])"
endif
" The search loop ( == STLPort's equal_range)
let len = last - first
while len > 0
let half = len / 2
let middle = first + half
if a:list[middle] < a:val
let first = middle + 1
let len -= half + 1
elseif a:val < a:list[middle]
let len = half
else
let left = lh#list#lower_bound(a:list, a:val, first, middle)
let right = lh#list#upper_bound(a:list, a:val, middle+1, first+len)
return [left, right]
endif
" let predicate = substitute(a:predicate, 'v:val', 'a:list['.idx.']', 'g')
" let res = lh#function#execute(a:predicate, a:list[idx])
endwhile
return [first, first]
endfunction
" Function: lh#list#unique_sort(list [, func]) {{{3
" See also http://vim.wikia.com/wiki/Unique_sorting
"
" Works like sort(), optionally taking in a comparator (just like the
" original), except that duplicate entries will be removed.
" todo: support another argument that act as an equality predicate
function! lh#list#unique_sort(list, ...)
let dictionary = {}
for i in a:list
let dictionary[string(i)] = i
endfor
let result = []
" echo join(values(dictionary),"\n")
if ( exists( 'a:1' ) )
let result = sort( values( dictionary ), a:1 )
else
let result = sort( values( dictionary ) )
endif
return result
endfunction
function! lh#list#unique_sort2(list, ...)
let list = copy(a:list)
if ( exists( 'a:1' ) )
call sort(list, a:1 )
else
call sort(list)
endif
if len(list) <= 1 | return list | endif
let result = [ list[0] ]
let last = list[0]
let i = 1
while i < len(list)
if last != list[i]
let last = list[i]
call add(result, last)
endif
let i += 1
endwhile
return result
endfunction
" Function: lh#list#subset(list, indices) {{{3
function! lh#list#subset(list, indices)
let result=[]
for e in a:indices
call add(result, a:list[e])
endfor
return result
endfunction
" Function: lh#list#intersect(list1, list2) {{{3
function! lh#list#intersect(list1, list2)
let result = copy(a:list1)
call filter(result, 'index(a:list2, v:val) >= 0')
return result
for e in a:list1
if index(a:list2, e) > 0
call result(result, e)
endif
endfor
endfunction
" Functions }}}1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,384 @@
"=============================================================================
" $Id: menu.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: autoload/lh/menu.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 13th Oct 2006
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $ (28th Aug 2007)
"------------------------------------------------------------------------
" Description:
" Defines the global function lh#menu#def_menu
" Aimed at (ft)plugin writers.
"
"------------------------------------------------------------------------
" Installation:
" Drop this file into {rtp}/autoload/lh/
" Requires Vim 7+
" History:
" v2.0.0: Moving to vim7
" v2.0.1: :ToggleXxx echoes the new value
" v2.2.0: Support environment variables
" Only one :Toggle command is defined.
" TODO:
" Should the argument to :Toggle be simplified to use the variable
" name instead ?
" }}}1
"=============================================================================
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
" ## Internal Variables {{{1
let s:k_Toggle_cmd = 'Toggle'
if !exists('s:toggle_commands')
let s:toggle_commands = {}
endif
"------------------------------------------------------------------------
" ## Functions {{{1
" # Debug {{{2
function! lh#menu#verbose(level)
let s:verbose = a:level
endfunction
function! s:Verbose(expr)
if exists('s:verbose') && s:verbose
echomsg a:expr
endif
endfunction
function! lh#menu#debug(expr)
return eval(a:expr)
endfunction
"------------------------------------------------------------------------
" # Common stuff {{{2
" Function: lh#menu#text({text}) {{{3
" @return a text to be used in menus where "\" and spaces have been escaped.
function! lh#menu#text(text)
return escape(a:text, '\ ')
endfunction
" # Toggling menu item {{{2
" Function: s:Fetch({Data},{key}) {{{3
" @param[in] Data Menu-item definition
" @param[in] key Table table from which the result will be fetched
" @return the current value, or text, whose index is Data.idx_crt_value.
function! s:Fetch(Data, key)
let len = len(a:Data[a:key])
if a:Data.idx_crt_value >= len | let a:Data.idx_crt_value = 0 | endif
let value = a:Data[a:key][a:Data.idx_crt_value]
return value
endfunction
" Function: s:Search({Data},{value}) {{{3
" Searches for the index of {value} in {Data.values} list. Return 0 if not
" found.
function! s:Search(Data, value)
let idx = 0
while idx != len(a:Data.values)
if a:value == a:Data.values[idx]
" echo a:Data.variable . "[".idx."] == " . a:value
return idx
endif
let idx = idx + 1
endwhile
" echo a:Data.variable . "[".-1."] == " . a:value
return 0 " default is first element
endfunction
" Function: s:Set({Data}) {{{3
" @param[in,out] Data Menu item definition
"
" Sets the global variable associated to the menu item according to the item's
" current value.
function! s:Set(Data)
let value = a:Data.values[a:Data.idx_crt_value]
let variable = a:Data.variable
if variable[0] == '$' " environment variabmes
exe "let ".variable." = ".string(value)
else
let g:{variable} = value
endif
if has_key(a:Data, "actions")
let l:Action = a:Data.actions[a:Data.idx_crt_value]
if type(l:Action) == type(function('tr'))
call l:Action()
else
exe l:Action
endif
endif
return value
endfunction
" Function: s:MenuKey({Data}) {{{3
" @return the table name from which the current value name (to dsplay in the
" menu) must be fetched.
" Priority is given to the optional "texts" table over the madatory "values" table.
function! s:MenuKey(Data)
if has_key(a:Data, "texts")
let menu_id = "texts"
else
let menu_id = "values"
endif
return menu_id
endfunction
" Function: s:NextValue({Data}) {{{3
" Change the value of the variable to the next in the list of value.
" The menu, and the variable are updated in consequence.
function! s:NextValue(Data)
" Where the texts for values must be fetched
let labels_key = s:MenuKey(a:Data)
" Fetch the old current value
let old = s:Fetch(a:Data, labels_key)
" Remove the entry from the menu
call s:ClearMenu(a:Data.menu, old)
" Cycle/increment the current value
let a:Data.idx_crt_value += 1
" Fetch it
let new = s:Fetch(a:Data,labels_key)
" Add the updated entry in the menu
call s:UpdateMenu(a:Data.menu, new, a:Data.command)
" Update the binded global variable
let value = s:Set(a:Data)
echo a:Data.variable.'='.value
endfunction
" Function: s:ClearMenu({Menu}, {text}) {{{3
" Removes a menu item
"
" @param[in] Menu.priority Priority of the new menu-item
" @param[in] Menu.name Name of the new menu-item
" @param[in] text Text of the previous value of the variable binded
function! s:ClearMenu(Menu, text)
if has('gui_running')
let name = substitute(a:Menu.name, '&', '', 'g')
let cmd = 'unmenu '.lh#menu#text(name.'<tab>('.a:text.')')
silent! exe cmd
endif
endfunction
" Function: s:UpdateMenu({Menu}, {text}, {command}) {{{3
" Adds a new menu item, with the text associated to the current value in
" braces.
"
" @param[in] Menu.priority Priority of the new menu-item
" @param[in] Menu.name Name of the new menu-item
" @param[in] text Text of the current value of the variable binded to
" the menu-item
" @param[in] command Toggle command to execute when the menu-item is selected
function! s:UpdateMenu(Menu, text, command)
if has('gui_running')
let cmd = 'nnoremenu <silent> '.a:Menu.priority.' '.
\ lh#menu#text(a:Menu.name.'<tab>('.a:text.')').
\ ' :silent '.s:k_Toggle_cmd.' '.a:command."\<cr>"
silent! exe cmd
endif
endfunction
" Function: s:SaveData({Data}) {{{3
" @param Data Menu-item definition
" Saves {Data} as s:Data{s:data_id++}. The definition will be used by
" automatically generated commands.
" @return s:data_id
let s:data_id = 0
function! s:SaveData(Data)
let s:Data{s:data_id} = a:Data
let id = s:data_id
let s:data_id += 1
return id
endfunction
" Function: lh#menu#def_toggle_item({Data}) {{{3
" @param Data.idx_crt_value
" @param Data.definitions == [ {value:, menutext: } ]
" @param Data.menu == { name:, position: }
"
" Sets a toggle-able menu-item defined by {Data}.
"
function! lh#menu#def_toggle_item(Data)
" Save the menu data as an internal script variable
let id = s:SaveData(a:Data)
" If the index of the current value hasn't been set, fetch it from the
" associated variable
if !has_key(a:Data, "idx_crt_value")
" Fetch the value of the associated variable
let value = lh#option#get(a:Data.variable, 0, 'g')
" echo a:Data.variable . " <- " . value
" Update the index of the current value
let a:Data.idx_crt_value = s:Search(a:Data, value)
endif
" Name of the auto-matically generated toggle command
let cmdName = substitute(a:Data.menu.name, '[^a-zA-Z_]', '', 'g')
" Lazy definition of the command
if 2 != exists(':'.s:k_Toggle_cmd)
exe 'command! -nargs=1 -complete=custom,lh#menu#_toggle_complete '
\ . s:k_Toggle_cmd . ' :call s:Toggle(<f-args>)'
endif
" silent exe 'command! -nargs=0 '.cmdName.' :call s:NextValue(s:Data'.id.')'
let s:toggle_commands[cmdName] = eval('s:Data'.id)
let a:Data["command"] = cmdName
" Add the menu entry according to the current value
call s:UpdateMenu(a:Data.menu, s:Fetch(a:Data, s:MenuKey(a:Data)), cmdName)
" Update the associated global variable
call s:Set(a:Data)
endfunction
"------------------------------------------------------------------------
function! s:Toggle(cmdName)
if !has_key(s:toggle_commands, a:cmdName)
throw "toggle-menu: unknown toggable variable ".a:cmdName
endif
let data = s:toggle_commands[a:cmdName]
call s:NextValue(data)
endfunction
function! lh#menu#_toggle_complete(ArgLead, CmdLine, CursorPos)
return join(keys(s:toggle_commands),"\n")
endfunction
"------------------------------------------------------------------------
" # IVN Menus {{{2
" Function: s:CTRL_O({cmd}) {{{3
" Build the command (sequence of ':ex commands') to be executed from
" INSERT-mode.
function! s:CTRL_O(cmd)
return substitute(a:cmd, '\(^\|<CR>\):', '\1\<C-O>:', 'g')
endfunction
" Function: lh#menu#is_in_visual_mode() {{{3
function! lh#menu#is_in_visual_mode()
return exists('s:is_in_visual_mode') && s:is_in_visual_mode
endfunction
" Function: lh#menu#_CMD_and_clear_v({cmd}) {{{3
" Internal function that executes the command and then clears the @v buffer
" todo: save and restore @v,
function! lh#menu#_CMD_and_clear_v(cmd)
try
let s:is_in_visual_mode = 1
exe a:cmd
finally
let @v=''
silent! unlet s:is_in_visual_mode
endtry
endfunction
" Function: s:Build_CMD({prefix},{cmd}) {{{3
" build the exact command to execute regarding the mode it is dedicated
function! s:Build_CMD(prefix, cmd)
if a:cmd[0] != ':' | return ' ' . a:cmd
endif
if a:prefix[0] == "i" | return ' ' . <SID>CTRL_O(a:cmd)
elseif a:prefix[0] == "n" | return ' ' . a:cmd
elseif a:prefix[0] == "v"
if match(a:cmd, ":VCall") == 0
return substitute(a:cmd, ':VCall', ' :call', ''). "\<cr>gV"
" gV exit select-mode if we where in it!
else
return
\ " \"vy\<C-C>:call lh#menu#_CMD_and_clear_v('" .
\ substitute(a:cmd, "<CR>$", '', '') ."')\<cr>"
endif
elseif a:prefix[0] == "c" | return " \<C-C>" . a:cmd
else | return ' ' . a:cmd
endif
endfunction
" Function: lh#menu#map_all({map_type}, [{map args}...) {{{3
" map the command to all the modes required
function! lh#menu#map_all(map_type,...)
let nore = (match(a:map_type, '[aincv]*noremap') != -1) ? "nore" : ""
let prefix = matchstr(substitute(a:map_type, nore, '', ''), '[aincv]*')
if a:1 == "<buffer>" | let i = 3 | let binding = a:1 . ' ' . a:2
else | let i = 2 | let binding = a:1
endif
let binding = '<silent> ' . binding
let cmd = a:{i}
let i += 1
while i <= a:0
let cmd .= ' ' . a:{i}
let i += 1
endwhile
let build_cmd = nore . 'map ' . binding
while strlen(prefix)
if prefix[0] == "a" | let prefix = "incv"
else
execute prefix[0] . build_cmd . <SID>Build_CMD(prefix[0],cmd)
let prefix = strpart(prefix, 1)
endif
endwhile
endfunction
" Function: lh#menu#make({prefix},{code},{text},{binding},...) {{{3
" Build the menu and map its associated binding to all the modes required
function! lh#menu#make(prefix, code, text, binding, ...)
let nore = (match(a:prefix, '[aincv]*nore') != -1) ? "nore" : ""
let prefix = matchstr(substitute(a:prefix, nore, '', ''), '[aincv]*')
let b = (a:1 == "<buffer>") ? 1 : 0
let i = b + 1
let cmd = a:{i}
let i += 1
while i <= a:0
let cmd .= ' ' . a:{i}
let i += 1
endwhile
let build_cmd = nore . "menu <silent> " . a:code . ' ' . lh#menu#text(a:text)
if strlen(a:binding) != 0
let build_cmd .= '<tab>' .
\ substitute(lh#menu#text(a:binding), '&', '\0\0', 'g')
if b != 0
call lh#menu#map_all(prefix.nore."map", ' <buffer> '.a:binding, cmd)
else
call lh#menu#map_all(prefix.nore."map", a:binding, cmd)
endif
endif
if has("gui_running")
while strlen(prefix)
execute <SID>BMenu(b).prefix[0].build_cmd.<SID>Build_CMD(prefix[0],cmd)
let prefix = strpart(prefix, 1)
endwhile
endif
endfunction
" Function: s:BMenu({b}) {{{3
" If <buffermenu.vim> is installed and the menu should be local, then the
" apropriate string is returned.
function! s:BMenu(b)
let res = (a:b && exists(':Bmenu')
\ && (1 == lh#option#get("want_buffermenu_or_global_disable", 1, "bg"))
\) ? 'B' : ''
" call confirm("BMenu(".a:b.")=".res, '&Ok', 1)
return res
endfunction
" Function: lh#menu#IVN_make(...) {{{3
function! lh#menu#IVN_make(code, text, binding, i_cmd, v_cmd, n_cmd, ...)
" nore options
let nore_i = (a:0 > 0) ? ((a:1 != 0) ? 'nore' : '') : ''
let nore_v = (a:0 > 1) ? ((a:2 != 0) ? 'nore' : '') : ''
let nore_n = (a:0 > 2) ? ((a:3 != 0) ? 'nore' : '') : ''
"
call lh#menu#make('i'.nore_i,a:code,a:text, a:binding, '<buffer>', a:i_cmd)
call lh#menu#make('v'.nore_v,a:code,a:text, a:binding, '<buffer>', a:v_cmd)
if strlen(a:n_cmd) != 0
call lh#menu#make('n'.nore_n,a:code,a:text, a:binding, '<buffer>', a:n_cmd)
endif
endfunction
"
" Functions }}}1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,107 @@
"=============================================================================
" $Id: option.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: autoload/lh/option.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 24th Jul 2004
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $ (07th Oct 2006)
"------------------------------------------------------------------------
" Description:
" Defines the global function lh#option#get().
" Aimed at (ft)plugin writers.
"
"------------------------------------------------------------------------
" Installation:
" Drop this file into {rtp}/autoload/lh/
" Requires Vim 7+
" History:
" v2.0.5
" (*) lh#option#get_non_empty() manages Lists and Dictionaries
" (*) lh#option#get() doesn't test emptyness anymore
" v2.0.0
" Code moved from {rtp}/macros/
" }}}1
"=============================================================================
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
" ## Functions {{{1
" # Debug {{{2
function! lh#option#verbose(level)
let s:verbose = a:level
endfunction
function! s:Verbose(expr)
if exists('s:verbose') && s:verbose
echomsg a:expr
endif
endfunction
function! lh#option#debug(expr)
return eval(a:expr)
endfunction
" # Public {{{2
" Function: lh#option#get(name, default [, scope]) {{{3
" @return b:{name} if it exists, or g:{name} if it exists, or {default}
" otherwise
" The order of the variables checked can be specified through the optional
" argument {scope}
function! lh#option#get(name,default,...)
let scope = (a:0 == 1) ? a:1 : 'bg'
let name = a:name
let i = 0
while i != strlen(scope)
if exists(scope[i].':'.name)
" \ && (0 != strlen({scope[i]}:{name}))
return {scope[i]}:{name}
endif
let i += 1
endwhile
return a:default
endfunction
function! lh#option#Get(name,default,...)
let scope = (a:0 == 1) ? a:1 : 'bg'
return lh#option#get(a:name, a:default, scope)
endfunction
function! s:IsEmpty(variable)
if type(a:variable) == type('string') | return 0 == strlen(a:variable)
elseif type(a:variable) == type(42) | return 0 == a:variable
elseif type(a:variable) == type([]) | return 0 == len(a:variable)
elseif type(a:variable) == type({}) | return 0 == len(a:variable)
else | return false
endif
endfunction
" Function: lh#option#get_non_empty(name, default [, scope]) {{{3
" @return of b:{name}, g:{name}, or {default} the first which exists and is not empty
" The order of the variables checked can be specified through the optional
" argument {scope}
function! lh#option#get_non_empty(name,default,...)
let scope = (a:0 == 1) ? a:1 : 'bg'
let name = a:name
let i = 0
while i != strlen(scope)
if exists(scope[i].':'.name) && !s:IsEmpty({scope[i]}:{name})
return {scope[i]}:{name}
endif
let i += 1
endwhile
return a:default
endfunction
function! lh#option#GetNonEmpty(name,default,...)
let scope = (a:0 == 1) ? a:1 : 'bg'
return lh#option#get_non_empty(a:name, a:default, scope)
endfunction
" Functions }}}1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,308 @@
"=============================================================================
" $Id: path.vim 237 2010-06-01 00:44:35Z luc.hermitte $
" File: autoload/lh/path.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 23rd Jan 2007
" Last Update: 11th Feb 2008
"------------------------------------------------------------------------
" Description:
" Functions related to the handling of pathnames
"
"------------------------------------------------------------------------
" Installation:
" Drop this file into {rtp}/autoload/lh
" Requires Vim7+
" History:
" v 1.0.0 First Version
" (*) Functions moved from searchInRuntimeTime
" v 2.0.1
" (*) lh#path#Simplify() becomes like |simplify()| except for trailing
" v 2.0.2
" (*) lh#path#SelectOne()
" (*) lh#path#ToRelative()
" v 2.0.3
" (*) lh#path#GlobAsList()
" v 2.0.4
" (*) lh#path#StripStart()
" v 2.0.5
" (*) lh#path#StripStart() interprets '.' as getcwd()
" v 2.2.0
" (*) new functions: lh#path#common(), lh#path#to_dirname(),
" lh#path#depth(), lh#path#relative_to(), lh#path#to_regex(),
" lh#path#find()
" (*) lh#path#simplify() fixed
" (*) lh#path#to_relative() use simplify()
" TODO:
" (*) Decide what #depth('../../bar') shall return
" (*) Fix #simplify('../../bar')
" }}}1
"=============================================================================
"=============================================================================
" Avoid global reinclusion {{{1
let s:cpo_save=&cpo
set cpo&vim
"=============================================================================
" ## Functions {{{1
" # Debug {{{2
let s:verbose = 0
function! lh#path#verbose(...)
if a:0 > 0 | let s:verbose = a:1 | endif
return s:verbose
endfunction
function! s:Verbose(expr)
if s:verbose
echomsg a:expr
endif
endfunction
function! lh#path#debug(expr)
return eval(a:expr)
endfunction
"=============================================================================
" # Public {{{2
" Function: lh#path#simplify({pathname}) {{{3
" Like |simplify()|, but also strip the leading './'
" It seems unable to simplify '..\' when compiled without +shellslash
function! lh#path#simplify(pathname)
let pathname = simplify(a:pathname)
let pathname = substitute(pathname, '^\%(\.[/\\]\)\+', '', '')
let pathname = substitute(pathname, '\([/\\]\)\%(\.[/\\]\)\+', '\1', 'g')
let pwd = getcwd().'/'
let pathname = substitute(pathname, '^'.lh#path#to_regex(pwd), '', 'g')
return pathname
endfunction
function! lh#path#Simplify(pathname)
return lh#path#simplify(a:pathname)
endfunction
" Function: lh#path#common({pathnames}) {{{3
" Find the common leading path between all pathnames
function! lh#path#common(pathnames)
" assert(len(pathnames)) > 1
let common = a:pathnames[0]
let i = 1
while i < len(a:pathnames)
let fcrt = a:pathnames[i]
" pathnames should not contain @
let common = matchstr(common.'@@'.fcrt, '^\zs\(.*[/\\]\)\ze.\{-}@@\1.*$')
if strlen(common) == 0
" No need to further checks
break
endif
let i += 1
endwhile
return common
endfunction
" Function: lh#path#strip_common({pathnames}) {{{3
" Find the common leading path between all pathnames, and strip it
function! lh#path#strip_common(pathnames)
" assert(len(pathnames)) > 1
let common = lh#path#common(a:pathnames)
let l = strlen(common)
if l == 0
return a:pathnames
else
let pathnames = a:pathnames
call map(pathnames, 'strpart(v:val, '.l.')' )
return pathnames
endif
endfunction
function! lh#path#StripCommon(pathnames)
return lh#path#strip_common(a:pathnames)
endfunction
" Function: lh#path#is_absolute_path({path}) {{{3
function! lh#path#is_absolute_path(path)
return a:path =~ '^/'
\ . '\|^[a-zA-Z]:[/\\]'
\ . '\|^[/\\]\{2}'
" Unix absolute path
" or Windows absolute path
" or UNC path
endfunction
function! lh#path#IsAbsolutePath(path)
return lh#path#is_absolute_path(a:path)
endfunction
" Function: lh#path#is_url({path}) {{{3
function! lh#path#is_url(path)
" todo: support UNC paths and other urls
return a:path =~ '^\%(https\=\|s\=ftp\|dav\|fetch\|file\|rcp\|rsynch\|scp\)://'
endfunction
function! lh#path#IsURL(path)
return lh#path#is_url(a:path)
endfunction
" Function: lh#path#select_one({pathnames},{prompt}) {{{3
function! lh#path#select_one(pathnames, prompt)
if len(a:pathnames) > 1
let simpl_pathnames = deepcopy(a:pathnames)
let simpl_pathnames = lh#path#strip_common(simpl_pathnames)
let simpl_pathnames = [ '&Cancel' ] + simpl_pathnames
" Consider guioptions+=c is case of difficulties with the gui
let selection = confirm(a:prompt, join(simpl_pathnames,"\n"), 1, 'Question')
let file = (selection == 1) ? '' : a:pathnames[selection-2]
return file
elseif len(a:pathnames) == 0
return ''
else
return a:pathnames[0]
endif
endfunction
function! lh#path#SelectOne(pathnames, prompt)
return lh#path#select_one(a:pathnames, a:prompt)
endfunction
" Function: lh#path#to_relative({pathname}) {{{3
function! lh#path#to_relative(pathname)
let newpath = fnamemodify(a:pathname, ':p:.')
let newpath = simplify(newpath)
return newpath
endfunction
function! lh#path#ToRelative(pathname)
return lh#path#to_relative(a:pathname)
endfunction
" Function: lh#path#to_dirname({dirname}) {{{3
" todo: use &shellslash
function! lh#path#to_dirname(dirname)
let dirname = a:dirname . (a:dirname[-1:] =~ '[/\\]' ? '' : '/')
return dirname
endfunction
" Function: lh#path#depth({dirname}) {{{3
" todo: make a choice about "negative" paths like "../../foo"
function! lh#path#depth(dirname)
if empty(a:dirname) | return 0 | endif
let dirname = lh#path#to_dirname(a:dirname)
let dirname = lh#path#simplify(dirname)
if lh#path#is_absolute_path(dirname)
let dirname = matchstr(dirname, '.\{-}[/\\]\zs.*')
endif
let depth = len(substitute(dirname, '[^/\\]\+[/\\]', '§', 'g'))
return depth
endfunction
" Function: lh#path#relative_to({from}, {to}) {{{3
" @param two directories
" @return a directories delta that ends with a '/' (may depends on
" &shellslash)
function! lh#path#relative_to(from, to)
" let from = fnamemodify(a:from, ':p')
" let to = fnamemodify(a:to , ':p')
let from = lh#path#to_dirname(a:from)
let to = lh#path#to_dirname(a:to )
let [from, to] = lh#path#strip_common([from, to])
let nb_up = lh#path#depth(from)
return repeat('../', nb_up).to
" cannot rely on :cd (as it alters things, and doesn't work with
" non-existant paths)
let pwd = getcwd()
exe 'cd '.a:to
let res = lh#path#to_relative(a:from)
exe 'cd '.pwd
return res
endfunction
" Function: lh#path#glob_as_list({pathslist}, {expr}) {{{3
function! s:GlobAsList(pathslist, expr)
let sResult = globpath(a:pathslist, a:expr)
let lResult = split(sResult, '\n')
" workaround a non feature of wildignore: it does not ignore directories
for ignored_pattern in split(&wildignore,',')
if stridx(ignored_pattern,'/') != -1
call filter(lResult, 'v:val !~ '.string(ignored_pattern))
endif
endfor
return lResult
endfunction
function! lh#path#glob_as_list(pathslist, expr)
if type(a:expr) == type('string')
return s:GlobAsList(a:pathslist, a:expr)
elseif type(a:expr) == type([])
let res = []
for expr in a:expr
call extend(res, s:GlobAsList(a:pathslist, expr))
endfor
return res
else
throw "Unexpected type for a:expression"
endif
endfunction
function! lh#path#GlobAsList(pathslist, expr)
return lh#path#glob_as_list(a:pathslist, a:expr)
endfunction
" Function: lh#path#strip_start({pathname}, {pathslist}) {{{3
" Strip occurrence of paths from {pathslist} in {pathname}
" @param[in] {pathname} name to simplify
" @param[in] {pathslist} list of pathname (can be a |string| of pathnames
" separated by ",", of a |List|).
function! lh#path#strip_start(pathname, pathslist)
if type(a:pathslist) == type('string')
" let strip_re = escape(a:pathslist, '\\.')
" let strip_re = '^' . substitute(strip_re, ',', '\\|^', 'g')
let pathslist = split(a:pathslist, ',')
elseif type(a:pathslist) == type([])
let pathslist = deepcopy(a:pathslist)
else
throw "Unexpected type for a:pathname"
endif
" apply a realpath like operation
let nb_paths = len(pathslist) " set before the loop
let i = 0
while i != nb_paths
if pathslist[i] =~ '^\.\%(/\|$\)'
let path2 = getcwd().pathslist[i][1:]
call add(pathslist, path2)
endif
let i += 1
endwhile
" replace path separators by a regex that can match them
call map(pathslist, 'substitute(v:val, "[\\\\/]", "[\\\\/]", "g")')
" echomsg string(pathslist)
" escape .
call map(pathslist, '"^".escape(v:val, ".")')
" build the strip regex
let strip_re = join(pathslist, '\|')
" echomsg strip_re
let res = substitute(a:pathname, '\%('.strip_re.'\)[/\\]\=', '', '')
return res
endfunction
function! lh#path#StripStart(pathname, pathslist)
return lh#path#strip_start(a:pathname, a:pathslist)
endfunction
" Function: lh#path#to_regex({pathname}) {{{3
function! lh#path#to_regex(path)
let regex = substitute(a:path, '[/\\]', '[/\\\\]', 'g')
return regex
endfunction
" Function: lh#path#find({pathname}, {regex}) {{{3
function! lh#path#find(paths, regex)
let paths = (type(a:paths) == type([]))
\ ? (a:paths)
\ : split(a:paths,',')
for path in paths
if match(path ,a:regex) != -1
return path
endif
endfor
return ''
endfunction
"=============================================================================
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,93 @@
"=============================================================================
" $Id: position.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: autoload/lh/position.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 05th Sep 2007
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $ (05th Sep 2007)
"------------------------------------------------------------------------
" Description: «description»
"
"------------------------------------------------------------------------
" Installation:
" Drop it into {rtp}/autoload/lh/
" Vim 7+ required.
" History: «history»
" v1.0.0:
" Creation
" TODO:
" }}}1
"=============================================================================
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
" ## Functions {{{1
" # Debug {{{2
function! lh#position#verbose(level)
let s:verbose = a:level
endfunction
function! s:Verbose(expr)
if exists('s:verbose') && s:verbose
echomsg a:expr
endif
endfunction
function! lh#position#debug(expr)
return eval(a:expr)
endfunction
"------------------------------------------------------------------------
" # Public {{{2
" Function: lh#position#is_before {{{3
" @param[in] positions as those returned from |getpos()|
" @return whether lhs_pos is before rhs_pos
function! lh#position#is_before(lhs_pos, rhs_pos)
if a:lhs_pos[0] != a:rhs_pos[0]
throw "Positions from incompatible buffers can't be ordered"
endif
"1 test lines
"2 test cols
let before
\ = (a:lhs_pos[1] == a:rhs_pos[1])
\ ? (a:lhs_pos[2] < a:rhs_pos[2])
\ : (a:lhs_pos[1] < a:rhs_pos[1])
return before
endfunction
function! lh#position#IsBefore(lhs_pos, rhs_pos)
return lh#position#is_before(a:lhs_pos, a:rhs_pos)
endfunction
" Function: lh#position#char_at_mark {{{3
" @return the character at a given mark (|mark|)
function! lh#position#char_at_mark(mark)
let c = getline(a:mark)[col(a:mark)-1]
return c
endfunction
function! lh#position#CharAtMark(mark)
return lh#position#char_at_mark(a:mark)
endfunction
" Function: lh#position#char_at_pos {{{3
" @return the character at a given position (|getpos()|)
function! lh#position#char_at_pos(pos)
let c = getline(a:pos[1])[col(a:pos[2])-1]
return c
endfunction
function! lh#position#CharAtPos(pos)
return lh#position#char_at_pos(a:pos)
endfunction
" Functions }}}1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,138 @@
"=============================================================================
" $Id: syntax.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: autoload/lh/syntax.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 05th Sep 2007
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $ (05th Sep 2007)
"------------------------------------------------------------------------
" Description: «description»
"
"------------------------------------------------------------------------
" Installation:
" Drop it into {rtp}/autoload/lh/
" Vim 7+ required.
" History: «history»
" v1.0.0:
" Creation ;
" Functions moved from lhVimSpell
" TODO:
" function, to inject "contained", see lhVimSpell approach
" }}}1
"=============================================================================
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
" ## Functions {{{1
" # Debug {{{2
function! lh#syntax#verbose(level)
let s:verbose = a:level
endfunction
function! s:Verbose(expr)
if exists('s:verbose') && s:verbose
echomsg a:expr
endif
endfunction
function! lh#syntax#debug(expr)
return eval(a:expr)
endfunction
" # Public {{{2
" Functions: Show name of the syntax kind of a character {{{3
function! lh#syntax#name_at(l,c, ...)
let what = a:0 > 0 ? a:1 : 0
return synIDattr(synID(a:l, a:c, what),'name')
endfunction
function! lh#syntax#NameAt(l,c, ...)
let what = a:0 > 0 ? a:1 : 0
return lh#syntax#name_at(a:l, a:c, what)
endfunction
function! lh#syntax#name_at_mark(mark, ...)
let what = a:0 > 0 ? a:1 : 0
return lh#syntax#name_at(line(a:mark), col(a:mark), what)
endfunction
function! lh#syntax#NameAtMark(mark, ...)
let what = a:0 > 0 ? a:1 : 0
return lh#syntax#name_at_mark(a:mark, what)
endfunction
" Functions: skip string, comment, character, doxygen {{{3
func! lh#syntax#skip_at(l,c)
return lh#syntax#name_at(a:l,a:c) =~? 'string\|comment\|character\|doxygen'
endfun
func! lh#syntax#SkipAt(l,c)
return lh#syntax#skip_at(a:l,a:c)
endfun
func! lh#syntax#skip()
return lh#syntax#skip_at(line('.'), col('.'))
endfun
func! lh#syntax#Skip()
return lh#syntax#skip()
endfun
func! lh#syntax#skip_at_mark(mark)
return lh#syntax#skip_at(line(a:mark), col(a:mark))
endfun
func! lh#syntax#SkipAtMark(mark)
return lh#syntax#skip_at_mark(a:mark)
endfun
" Function: Show current syntax kind {{{3
command! SynShow echo 'hi<'.lh#syntax#name_at_mark('.',1).'> trans<'
\ lh#syntax#name_at_mark('.',0).'> lo<'.
\ synIDattr(synIDtrans(synID(line('.'), col('.'), 1)), 'name').'>'
" Function: lh#syntax#list_raw(name) : string {{{3
function! lh#syntax#list_raw(name)
let a_save = @a
try
redir @a
exe 'silent! syn list '.a:name
redir END
let res = @a
finally
let @a = a_save
endtry
return res
endfunction
" Function: lh#syntax#list(name) : List {{{3
function! lh#syntax#list(name)
let raw = lh#syntax#list_raw(a:name)
let res = []
let lines = split(raw, '\n')
let started = 0
for l in lines
if started
let li = (l =~ 'links to') ? '' : l
elseif l =~ 'xxx'
let li = matchstr(l, 'xxx\s*\zs.*')
let started = 1
else
let li = ''
endif
if strlen(li) != 0
let li = substitute(li, 'contained\S*\|transparent\|nextgroup\|skipwhite\|skipnl\|skipempty', '', 'g')
let kinds = split(li, '\s\+')
call extend(res, kinds)
endif
endfor
return res
endfunction
" Functions }}}1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,42 @@
"=============================================================================
" $Id$
" File: autoload/lh/visual.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 08th Sep 2008
" Last Update: $Date$
"------------------------------------------------------------------------
" Helpers functions releated to the visual mode
"
"------------------------------------------------------------------------
" Drop it into {rtp}/autoload/lh/
" Vim 7+ required.
" History:
" v2.0.6: First appearance
" TODO: «missing features»
" }}}1
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
" Functions {{{1
" Function: lh#visual#selection() {{{3
" @return the text currently selected
function! lh#visual#selection()
try
let a_save = @a
normal! gv"ay
return @a
finally
let @a = a_save
endtry
endfunction
" Functions }}}1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,17 @@
------------------
lh-vim-lib 2.2.1
------------------
lh-vim-lib is a library plugin for vim v7+. It is just a collection of
functions that are meant to be used by script writers.
Audience : Vim script writers
Requirements : Vim 7.1
Required by : Just a few other plugins for the moment
Author : Luc Hermitte
License : GPL2
More Help At : http://code.google.com/p/lh-vim/wiki/lhVimLib
Vim script#214: http://www.vim.org/scripts/script.php?script_id=214
Repository :
svn checkout http://lh-vim.googlecode.com/svn/vim-lib/trunk lh-vim-lib

View File

@ -0,0 +1,83 @@
"===========================================================================
" $Id: menu-map.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: macros/menu-map.vim
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
"
" Purpose: Define functions to build mappings and menus at the same time
"
" Version: 2.2.1
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $ (02nd Dec 2006)
"
" Last Changes: {{{
" Version 2.0.0:
" Moved to vim7,
" Functions moved to {rtp}/autoload/
" Version 1.6.2:
" (*) Silent mappings and menus
" Version 1.6. :
" (*) Uses has('gui_running') instead of has('gui') to check if
" we can generate the menu.
" Version 1.5. :
" (*) visual mappings launched from select-mode don't end with
" text still selected -- applied to :VCalls
" Version 1.4. :
" (*) address obfuscated for spammers
" (*) support the local option
" b:want_buffermenu_or_global_disable if we don't want
" buffermenu to be used systematically.
" 0 -> buffer menu not used
" 1 -> buffer menu used
" 2 -> the VimL developper will use a global disable.
" cf.: tex-maps.vim:: s:SimpleMenu()
" and texmenus.vim
" Version 1.3. :
" (*) add continuation lines support ; cf 'cpoptions'
" Version 1.2. :
" (*) Code folded.
" (*) Take advantage of buffermenu.vim if present for local
" menus.
" (*) If non gui is available, the menus won't be defined
" Version 1.1. :
" (*) Bug corrected :
" vnore(map\|menu) does not imply v+n(map\|menu) any more
" }}}
"
" Inspired By: A function from Benji Fisher
"
" TODO: (*) no menu if no gui.
"
"===========================================================================
if exists("g:loaded_menu_map") | finish | endif
let g:loaded_menu_map = 1
"" line continuation used here ??
let s:cpo_save = &cpo
set cpo&vim
"=========================================================================
" Commands {{{
command! -nargs=+ -bang MAP map<bang> <args>
command! -nargs=+ IMAP imap <args>
command! -nargs=+ NMAP nmap <args>
command! -nargs=+ CMAP cmap <args>
command! -nargs=+ VMAP vmap <args>
command! -nargs=+ AMAP
\ call lh#menu#map_all('amap', <f-args>)
command! -nargs=+ -bang NOREMAP noremap<bang> <args>
command! -nargs=+ INOREMAP inoremap <args>
command! -nargs=+ NNOREMAP nnoremap <args>
command! -nargs=+ CNOREMAP cnoremap <args>
command! -nargs=+ VNOREMAP vnoremap <args>
command! -nargs=+ ANOREMAP
\ call lh#menu#map_all('anoremap', <f-args>)
" }}}
" End !
let &cpo = s:cpo_save
finish
"=========================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,53 @@
"=============================================================================
" $Id: mk-lh-vim-lib.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: mk-lh-lib.vim
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
let s:version = '2.2.1'
" Created: 06th Nov 2007
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $
"------------------------------------------------------------------------
cd <sfile>:p:h
try
let save_rtp = &rtp
let &rtp = expand('<sfile>:p:h:h').','.&rtp
exe '22,$MkVimball! lh-vim-lib-'.s:version
set modifiable
set buftype=
finally
let &rtp = save_rtp
endtry
finish
autoload/lh/askvim.vim
autoload/lh/buffer.vim
autoload/lh/buffer/dialog.vim
autoload/lh/command.vim
autoload/lh/common.vim
autoload/lh/encoding.vim
autoload/lh/env.vim
autoload/lh/event.vim
autoload/lh/graph/tsort.vim
autoload/lh/list.vim
autoload/lh/menu.vim
autoload/lh/option.vim
autoload/lh/path.vim
autoload/lh/position.vim
autoload/lh/syntax.vim
autoload/lh/visual.vim
doc/lh-vim-lib.txt
macros/menu-map.vim
mkVba/mk-lh-vim-lib.vim
plugin/let.vim
plugin/lhvl.vim
plugin/ui-functions.vim
plugin/words_tools.vim
tests/lh/function.vim
tests/lh/list.vim
tests/lh/path.vim
tests/lh/test-Fargs2String.vim
tests/lh/test-askmenu.vim
tests/lh/test-command.vim
tests/lh/test-menu-map.vim
tests/lh/test-toggle-menu.vim
tests/lh/topological-sort.vim

View File

@ -0,0 +1,54 @@
"=============================================================================
" $Id: let.vim 239 2010-06-01 00:48:43Z luc.hermitte $
" File: plugin/let.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 31st May 2010
" Last Update: $Date: 2010-05-31 20:48:43 -0400 (Mon, 31 May 2010) $
"------------------------------------------------------------------------
" Description:
" Defines a command :LetIfUndef that sets a variable if undefined
"
"------------------------------------------------------------------------
" Installation:
" Drop this file into {rtp}/plugin
" Requires Vim7+
" History:
" v2.2.1: first version of this command into lh-vim-lib
" TODO:
" }}}1
"=============================================================================
" Avoid global reinclusion {{{1
let s:k_version = 221
if &cp || (exists("g:loaded_let")
\ && (g:loaded_let >= s:k_version)
\ && !exists('g:force_reload_let'))
finish
endif
let g:loaded_let = s:k_version
let s:cpo_save=&cpo
set cpo&vim
" Avoid global reinclusion }}}1
"------------------------------------------------------------------------
" Commands and Mappings {{{1
command! -nargs=+ LetIfUndef call s:LetIfUndef(<f-args>)
" Commands and Mappings }}}1
"------------------------------------------------------------------------
" Functions {{{1
" Note: most functions are best placed into
" autoload/«your-initials»/«let».vim
" Keep here only the functions are are required when the plugin is loaded,
" like functions that help building a vim-menu for this plugin.
function! s:LetIfUndef(var, value)
if !exists(a:var)
let {a:var} = eval(a:value)
endif
endfunction
" Functions }}}1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,45 @@
"=============================================================================
" $Id: lhvl.vim 245 2010-09-19 22:40:10Z luc.hermitte $
" File: plugin/lhvl.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 27th Apr 2010
" Last Update: $Date: 2010-09-19 18:40:10 -0400 (Sun, 19 Sep 2010) $
"------------------------------------------------------------------------
" Description:
" Non-function resources from lh-vim-lib
"
"------------------------------------------------------------------------
" Installation:
" Drop the file into {rtp}/plugin
" History:
" v2.2.1 first version
" TODO: «missing features»
" }}}1
"=============================================================================
" Avoid global reinclusion {{{1
let s:k_version = 221
if &cp || (exists("g:loaded_lhvl")
\ && (g:loaded_lhvl >= s:k_version)
\ && !exists('g:force_reload_lhvl'))
finish
endif
let g:loaded_lhvl = s:k_version
let s:cpo_save=&cpo
set cpo&vim
" Avoid global reinclusion }}}1
"------------------------------------------------------------------------
" Commands and Mappings {{{1
" Moved from lh-cpp
command! PopSearch :call histdel('search', -1)| let @/=histget('search',-1)
" Commands and Mappings }}}1
"------------------------------------------------------------------------
" Functions {{{1
" Functions }}}1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,480 @@
"=============================================================================
" File: plugin/ui-functions.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" URL: http://hermitte.free.fr/vim/ressources/vimfiles/plugin/ui-functions.vim
"
" Version: 2.2.1
" Created: 18th nov 2002
" Last Update: 28th Nov 2007
"------------------------------------------------------------------------
" Description: Functions for the interaction with a User Interface.
" The UI can be graphical or textual.
" At first, this was designed to ease the syntax of
" mu-template's templates.
"
" Option: {{{2
" {[bg]:ui_type}
" = "g\%[ui]",
" = "t\%[ext]" ; the call must not be |:silent|
" = "f\%[te]"
" }}}2
"------------------------------------------------------------------------
" Installation: Drop this into one of your {rtp}/plugin/ directories.
" History: {{{2
" v0.01 Initial Version
" v0.02
" (*) Code "factorisations"
" (*) Help on <F1> enhanced.
" (*) Small changes regarding the parameter accepted
" (*) Function SWITCH
" v0.03
" (*) Small bug fix with INPUT()
" v0.04
" (*) New function: WHICH()
" v0.05
" (*) In vim7e, inputdialog() returns a trailing '\n'. INPUT() strips the
" NL character.
" v0.06
" (*) :s/echoerr/throw/ => vim7 only
" v2.2.0
" (*) menu to switch the ui_type
"
" TODO: {{{2
" (*) Save the hl-User1..9 before using them
" (*) Possibility other than &statusline:
" echohl User1 |echon "bla"|echohl User2|echon "bli"|echohl None
" (*) Wraps too long choices-line (length > term-width)
" (*) Add to the documentation: "don't use CTRL-C to abort !!"
" (*) Look if I need to support 'wildmode'
" (*) 3rd mode: return string for FTE
" (*) 4th mode: interaction in a scratch buffer
"
" }}}1
"=============================================================================
" Avoid reinclusion {{{1
"
if exists("g:loaded_ui_functions") && !exists('g:force_reload_ui_functions')
finish
endif
let g:loaded_ui_functions = 1
let s:cpo_save=&cpo
set cpo&vim
" }}}1
"------------------------------------------------------------------------
" External functions {{{1
" Function: IF(var, then, else) {{{2
function! IF(var,then, else)
let o = s:Opt_type() " {{{3
if o =~ 'g\%[ui]\|t\%[ext]' " {{{4
return a:var ? a:then : a:else
elseif o =~ 'f\%[te]' " {{{4
return s:if_fte(a:var, a:then, a:else)
else " {{{4
throw "UI-Fns::IF(): Unkonwn user-interface style (".o.")"
endif
" }}}3
endfunction
" Function: SWITCH(var, case, action [, case, action] [default_action]) {{{2
function! SWITCH(var, ...)
let o = s:Opt_type() " {{{3
if o =~ 'g\%[ui]\|t\%[ext]' " {{{4
let explicit_def = ((a:0 % 2) == 1)
let default = explicit_def ? a:{a:0} : ''
let i = a:0 - 1 - explicit_def
while i > 0
if a:var == a:{i}
return a:{i+1}
endif
let i = i - 2
endwhile
return default
elseif o =~ 'f\%[te]' " {{{4
return s:if_fte(a:var, a:then, a:else)
else " {{{4
throw "UI-Fns::SWITCH(): Unkonwn user-interface style (".o.")"
endif
" }}}3
endfunction
" Function: CONFIRM(text [, choices [, default [, type]]]) {{{2
function! CONFIRM(text, ...)
" 1- Check parameters {{{3
if a:0 > 4 " {{{4
throw "UI-Fns::CONFIRM(): too many parameters"
return 0
endif
" build the parameters string {{{4
let i = 1
while i <= a:0
if i == 1 | let params = 'a:{1}'
else | let params = params. ',a:{'.i.'}'
endif
let i = i + 1
endwhile
" 2- Choose the correct way to execute according to the option {{{3
let o = s:Opt_type()
if o =~ 'g\%[ui]' " {{{4
exe 'return confirm(a:text,'.params.')'
elseif o =~ 't\%[ext]' " {{{4
if !has('gui_running') && has('dialog_con')
exe 'return confirm(a:text,'.params.')'
else
exe 'return s:confirm_text("none", a:text,'.params.')'
endif
elseif o =~ 'f\%[te]' " {{{4
exe 'return s:confirm_fte(a:text,'.params.')'
else " {{{4
throw "UI-Fns::CONFIRM(): Unkonwn user-interface style (".o.")"
endif
" }}}3
endfunction
" Function: INPUT(prompt [, default ]) {{{2
function! INPUT(prompt, ...)
" 1- Check parameters {{{3
if a:0 > 4 " {{{4
throw "UI-Fns::INPUT(): too many parameters"
return 0
endif
" build the parameters string {{{4
let i = 1 | let params = ''
while i <= a:0
if i == 1 | let params = 'a:{1}'
else | let params = params. ',a:{'.i.'}'
endif
let i = i + 1
endwhile
" 2- Choose the correct way to execute according to the option {{{3
let o = s:Opt_type()
if o =~ 'g\%[ui]' " {{{4
exe 'return matchstr(inputdialog(a:prompt,'.params.'), ".\\{-}\\ze\\n\\=$")'
elseif o =~ 't\%[ext]' " {{{4
exe 'return input(a:prompt,'.params.')'
elseif o =~ 'f\%[te]' " {{{4
exe 'return s:input_fte(a:prompt,'.params.')'
else " {{{4
throw "UI-Fns::INPUT(): Unkonwn user-interface style (".o.")"
endif
" }}}3
endfunction
" Function: COMBO(prompt, choice [, ... ]) {{{2
function! COMBO(prompt, ...)
" 1- Check parameters {{{3
if a:0 > 4 " {{{4
throw "UI-Fns::COMBO(): too many parameters"
return 0
endif
" build the parameters string {{{4
let i = 1
while i <= a:0
if i == 1 | let params = 'a:{1}'
else | let params = params. ',a:{'.i.'}'
endif
let i = i + 1
endwhile
" 2- Choose the correct way to execute according to the option {{{3
let o = s:Opt_type()
if o =~ 'g\%[ui]' " {{{4
exe 'return confirm(a:prompt,'.params.')'
elseif o =~ 't\%[ext]' " {{{4
exe 'return s:confirm_text("combo", a:prompt,'.params.')'
elseif o =~ 'f\%[te]' " {{{4
exe 'return s:combo_fte(a:prompt,'.params.')'
else " {{{4
throw "UI-Fns::COMBO(): Unkonwn user-interface style (".o.")"
endif
" }}}3
endfunction
" Function: WHICH(function, prompt, choice [, ... ]) {{{2
function! WHICH(fn, prompt, ...)
" 1- Check parameters {{{3
" build the parameters string {{{4
let i = 1
while i <= a:0
if i == 1 | let params = 'a:{1}'
else | let params = params. ',a:{'.i.'}'
endif
let i = i + 1
endwhile
" 2- Execute the function {{{3
exe 'let which = '.a:fn.'(a:prompt,'.params.')'
if 0 >= which | return ''
elseif 1 == which
return substitute(matchstr(a:{1}, '^.\{-}\ze\%(\n\|$\)'), '&', '', 'g')
else
return substitute(
\ matchstr(a:{1}, '^\%(.\{-}\n\)\{'.(which-1).'}\zs.\{-}\ze\%(\n\|$\)')
\ , '&', '', 'g')
endif
" }}}3
endfunction
" Function: CHECK(prompt, choice [, ... ]) {{{2
function! CHECK(prompt, ...)
" 1- Check parameters {{{3
if a:0 > 4 " {{{4
throw "UI-Fns::CHECK(): too many parameters"
return 0
endif
" build the parameters string {{{4
let i = 1
while i <= a:0
if i == 1 | let params = 'a:{1}'
else | let params = params. ',a:{'.i.'}'
endif
let i = i + 1
endwhile
" 2- Choose the correct way to execute according to the option {{{3
let o = s:Opt_type()
if o =~ 'g\%[ui]' " {{{4
exe 'return s:confirm_text("check", a:prompt,'.params.')'
elseif o =~ 't\%[ext]' " {{{4
exe 'return s:confirm_text("check", a:prompt,'.params.')'
elseif o =~ 'f\%[te]' " {{{4
exe 'return s:check_fte(a:prompt,'.params.')'
else " {{{4
throw "UI-Fns::CHECK(): Unkonwn user-interface style (".o.")"
endif
" }}}3
endfunction
" }}}1
"------------------------------------------------------------------------
" Options setting {{{1
let s:OptionData = {
\ "variable": "ui_type",
\ "idx_crt_value": 1,
\ "values": ['gui', 'text', 'fte'],
\ "menu": { "priority": '500.2700', "name": '&Plugin.&LH.&UI type'}
\}
call lh#menu#def_toggle_item(s:OptionData)
" }}}1
"------------------------------------------------------------------------
" Internal functions {{{1
function! s:Option(name, default) " {{{2
if exists('b:ui_'.a:name) | return b:ui_{a:name}
elseif exists('g:ui_'.a:name) | return g:ui_{a:name}
else | return a:default
endif
endfunction
function! s:Opt_type() " {{{2
return s:Option('type', 'gui')
endfunction
"
" Function: s:status_line(current, hl [, choices] ) {{{2
" a:current: current item
" a:hl : Generic, Warning, Error
function! s:status_line(current, hl, ...)
" Highlightning {{{3
if a:hl == "Generic" | let hl = '%1*'
elseif a:hl == "Warning" | let hl = '%2*'
elseif a:hl == "Error" | let hl = '%3*'
elseif a:hl == "Info" | let hl = '%4*'
elseif a:hl == "Question" | let hl = '%5*'
else | let hl = '%1*'
endif
" Build the string {{{3
let sl_choices = '' | let i = 1
while i <= a:0
if i == a:current
let sl_choices = sl_choices . ' '. hl .
\ substitute(a:{i}, '&\(.\)', '%6*\1'.hl, '') . '%* '
else
let sl_choices = sl_choices . ' ' .
\ substitute(a:{i}, '&\(.\)', '%6*\1%*', '') . ' '
endif
let i = i + 1
endwhile
" }}}3
return sl_choices
endfunction
" Function: s:confirm_text(box, text [, choices [, default [, type]]]) {{{2
function! s:confirm_text(box, text, ...)
let help = "/<esc>/<s-tab>/<tab>/<left>/<right>/<cr>/<F1>"
" 1- Retrieve the parameters {{{3
let choices = ((a:0>=1) ? a:1 : '&Ok')
let default = ((a:0>=2) ? a:2 : (('check' == a:box) ? 0 : 1))
let type = ((a:0>=3) ? a:3 : 'Generic')
if 'none' == a:box | let prefix = ''
elseif 'combo' == a:box | let prefix = '( )_'
elseif 'check' == a:box | let prefix = '[ ]_'
let help = '/ '.help
else | let prefix = ''
endif
" 2- Retrieve the proposed choices {{{3
" Prepare the hot keys
let i = 0
while i != 26
let hotkey_{nr2char(i+65)} = 0
let i += 1
endwhile
let hotkeys = '' | let help_k = '/'
" Parse the choices
let i = 0
while choices != ""
let i = i + 1
let item = matchstr(choices, "^.\\{-}\\ze\\(\n\\|$\\)")
let choices = matchstr(choices, "\n\\zs.*$")
" exe 'anoremenu ]'.a:text.'.'.item.' :let s:choice ='.i.'<cr>'
if ('check' == a:box) && (strlen(default)>=i) && (1 == default[i-1])
" let choice_{i} = '[X]' . substitute(item, '&', '', '')
let choice_{i} = '[X]_' . item
else
" let choice_{i} = prefix . substitute(item, '&', '', '')
let choice_{i} = prefix . item
endif
if i == 1
let list_choices = 'choice_{1}'
else
let list_choices = list_choices . ',choice_{'.i.'}'
endif
" Update the hotkey.
let key = toupper(matchstr(choice_{i}, '&\zs.\ze'))
let hotkey_{key} = i
let hotkeys = hotkeys . tolower(key) . toupper(key)
let help_k = help_k . tolower(key)
endwhile
let nb_choices = i
if default > nb_choices | let default = nb_choices | endif
" 3- Run an interactive text menu {{{3
" Note: emenu can not be used through ":exe" {{{4
" let wcm = &wcm
" set wcm=<tab>
" exe ':emenu ]'.a:text.'.'."<tab>"
" let &wcm = wcm
" 3.1- Preparations for the statusline {{{4
" save the statusline
let sl = &l:statusline
" Color schemes for selected item {{{5
:hi User1 term=inverse,bold cterm=inverse,bold ctermfg=Yellow
\ guifg=Black guibg=Yellow
:hi User2 term=inverse,bold cterm=inverse,bold ctermfg=LightRed
\ guifg=Black guibg=LightRed
:hi User3 term=inverse,bold cterm=inverse,bold ctermfg=Red
\ guifg=Black guibg=Red
:hi User4 term=inverse,bold cterm=inverse,bold ctermfg=Cyan
\ guifg=Black guibg=Cyan
:hi User5 term=inverse,bold cterm=inverse,bold ctermfg=LightYellow
\ guifg=Black guibg=LightYellow
:hi User6 term=inverse,bold cterm=inverse,bold ctermfg=LightGray
\ guifg=DarkRed guibg=LightGray
" }}}5
" 3.2- Interactive loop {{{4
let help = "\r-- Keys available (".help_k.help.")"
" item selected at the start
let i = ('check' != a:box) ? default : 1
let direction = 0 | let toggle = 0
while 1
if 'combo' == a:box
let choice_{i} = substitute(choice_{i}, '^( )', '(*)', '')
endif
" Colored statusline
" Note: unfortunately the 'statusline' is a global option, {{{
" not a local one. I the hope that may change, as it does not provokes any
" error, I use '&l:statusline'. }}}
exe 'let &l:statusline=s:status_line(i, type,'. list_choices .')'
if has(':redrawstatus')
redrawstatus!
else
redraw!
endif
" Echo the current selection
echo "\r". a:text.' '.substitute(choice_{i}, '&', '', '')
" Wait the user to hit a key
let key=getchar()
let complType=nr2char(key)
" If the key hit matched awaited keys ...
if -1 != stridx(" \<tab>\<esc>\<enter>".hotkeys,complType) ||
\ (key =~ "\<F1>\\|\<right>\\|\<left>\\|\<s-tab>")
if key == "\<F1>" " Help {{{5
redraw!
echohl StatusLineNC
echo help
echohl None
let key=getchar()
let complType=nr2char(key)
endif
" TODO: support CTRL-D
if complType == "\<enter>" " Validate {{{5
break
elseif complType == " " " check box {{{5
let toggle = 1
elseif complType == "\<esc>" " Abort {{{5
let i = -1 | break
elseif complType == "\<tab>" || key == "\<right>" " Next {{{5
let direction = 1
elseif key =~ "\<left>\\|\<s-tab>" " Previous {{{5
let direction = -1
elseif -1 != stridx(hotkeys, complType ) " Hotkeys {{{5
if '' == complType | continue | endif
let direction = hotkey_{toupper(complType)} - i
let toggle = 1
" else
endif
" }}}5
endif
if direction != 0 " {{{5
if 'combo' == a:box
let choice_{i} = substitute(choice_{i}, '^(\*)', '( )', '')
endif
let i = i + direction
if i > nb_choices | let i = 1
elseif i == 0 | let i = nb_choices
endif
let direction = 0
endif
if toggle == 1 " {{{5
if 'check' == a:box
let choice_{i} = ((choice_{i}[1] == ' ')? '[X]' : '[ ]')
\ . strpart(choice_{i}, 3)
endif
let toggle = 0
endif
endwhile " }}}4
" 4- Terminate {{{3
" Clear screen
redraw!
" Restore statusline
let &l:statusline=sl
" Return
if (i == -1) || ('check' != a:box)
return i
else
let r = '' | let i = 1
while i <= nb_choices
let r = r . ((choice_{i}[1] == 'X') ? '1' : '0')
let i = i + 1
endwhile
return r
endif
endfunction
" }}}1
"------------------------------------------------------------------------
" Functions that insert fte statements {{{1
" Function: s:if_fte(var, then, else) {{{2
" Function: s:confirm_fte(text, [, choices [, default [, type]]]) {{{2
" Function: s:input_fte(prompt [, default]) {{{2
" Function: s:combo_fte(prompt, choice [, ...]) {{{2
" Function: s:check_fte(prompt, choice [, ...]) {{{2
" }}}1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,104 @@
" File: plugin/words_tools.vim
" Author: Luc Hermitte <hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" URL: http://hermitte.free.fr/vim/ressources/vim_dollar/plugin/words_tools.vim
"
" Last Update: 14th nov 2002
" Purpose: Define functions better than expand("<cword>")
"
" Note: They are expected to be used in insert mode (thanks to <c-r>
" or <c-o>)
"
"===========================================================================
" Return the current keyword, uses spaces to delimitate {{{1
function! GetNearestKeyword()
let c = col ('.')-1
let ll = getline('.')
let ll1 = strpart(ll,0,c)
let ll1 = matchstr(ll1,'\k*$')
let ll2 = strpart(ll,c,strlen(ll)-c+1)
let ll2 = matchstr(ll2,'^\k*')
" let ll2 = strpart(ll2,0,match(ll2,'$\|\s'))
return ll1.ll2
endfunction
" Return the current word, uses spaces to delimitate {{{1
function! GetNearestWord()
let c = col ('.')-1
let l = line('.')
let ll = getline(l)
let ll1 = strpart(ll,0,c)
let ll1 = matchstr(ll1,'\S*$')
let ll2 = strpart(ll,c,strlen(ll)-c+1)
let ll2 = strpart(ll2,0,match(ll2,'$\|\s'))
""echo ll1.ll2
return ll1.ll2
endfunction
" Return the word before the cursor, uses spaces to delimitate {{{1
" Rem : <cword> is the word under or after the cursor
function! GetCurrentWord()
let c = col ('.')-1
let l = line('.')
let ll = getline(l)
let ll1 = strpart(ll,0,c)
let ll1 = matchstr(ll1,'\S*$')
if strlen(ll1) == 0
return ll1
else
let ll2 = strpart(ll,c,strlen(ll)-c+1)
let ll2 = strpart(ll2,0,match(ll2,'$\|\s'))
return ll1.ll2
endif
endfunction
" Return the keyword before the cursor, uses \k to delimitate {{{1
" Rem : <cword> is the word under or after the cursor
function! GetCurrentKeyword()
let c = col ('.')-1
let l = line('.')
let ll = getline(l)
let ll1 = strpart(ll,0,c)
let ll1 = matchstr(ll1,'\k*$')
if strlen(ll1) == 0
return ll1
else
let ll2 = strpart(ll,c,strlen(ll)-c+1)
let ll2 = matchstr(ll2,'^\k*')
" let ll2 = strpart(ll2,0,match(ll2,'$\|\s'))
return ll1.ll2
endif
endfunction
" Extract the word before the cursor, {{{1
" use keyword definitions, skip latter spaces (see "bla word_accepted ")
function! GetPreviousWord()
let lig = getline(line('.'))
let lig = strpart(lig,0,col('.')-1)
return matchstr(lig, '\<\k*\>\s*$')
endfunction
" GetLikeCTRL_W() retrieves the characters that i_CTRL-W deletes. {{{1
" Initial need by Hari Krishna Dara <hari_vim@yahoo.com>
" Last ver:
" Pb: "if strlen(w) == " --> ") == " instead of just "== ".
" There still exists a bug regarding the last char of a line. VIM bug ?
function! GetLikeCTRL_W()
let lig = getline(line('.'))
let lig = strpart(lig,0,col('.')-1)
" treat ending spaces apart.
let s = matchstr(lig, '\s*$')
let lig = strpart(lig, 0, strlen(lig)-strlen(s))
" First case : last characters belong to a "word"
let w = matchstr(lig, '\<\k\+\>$')
if strlen(w) == 0
" otherwise, they belong to a "non word" (without any space)
let w = substitute(lig, '.*\(\k\|\s\)', '', 'g')
endif
return w . s
endfunction
" }}}1
"========================================================================
" vim60: set fdm=marker:

View File

@ -0,0 +1,284 @@
"=============================================================================
" $Id: function.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: tests/lh/function.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 03rd Nov 2008
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $
"------------------------------------------------------------------------
" Description:
" Tests for autoload/lh/function.vim
"
"------------------------------------------------------------------------
" Installation: «install details»
" History: «history»
" TODO: «missing features»
" }}}1
"=============================================================================
UTSuite [lh-vim-lib] Testing lh#function plugin
runtime autoload/lh/function.vim
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
function! Test(...)
let nb = len(a:000)
" echo "test(".nb.':' .join(a:000, ' -- ')')'
let i =0
while i!= len(a:000)
echo "Test: type(".i.")=".type(a:000[i]).' --> '. string(a:000[i])
let i += 1
endwhile
endfunction
function! Print(...)
let res = lh#list#accumulate([1,2,'foo'], 'string', 'join(v:1_, " ## ")')
return res
endfunction
function! Id(...)
return copy(a:000)
endfunction
function! s:TestId()
let r = Id(1, 'string', [0], [[1]], {'ffo':42}, function('exists'), 1.2)
Assert! len(r) == 7
Assert! should#be#number (r[0])
Assert! should#be#string (r[1])
Assert! should#be#list (r[2])
Assert! should#be#list (r[3])
Assert! should#be#dict (r[4])
Assert! should#be#funcref(r[5])
Assert! should#be#float (r[6])
Assert r[0] == 1
Assert r[1] == 'string'
Assert r[2] == [0]
Assert r[3] == [[1]]
Assert r[4].ffo == 42
Assert r[5] == function('exists')
Assert r[6] == 1.2
endfunction
function! s:Test_bind()
" lh#function#bind + lh#function#execute
let rev4 = lh#function#bind(function('Id'), 'v:4_', 42, 'v:3_', 'v:2_', 'v:1_')
let r = lh#function#execute(rev4, 1,'two','three', [4,5])
Assert! len(r) == 5
Assert! should#be#list (r[0])
Assert! should#be#number (r[1])
Assert! should#be#string (r[2])
Assert! should#be#string (r[3])
Assert! should#be#number (r[4])
Assert r[0] == [4,5]
Assert r[1] == 42
Assert r[2] == 'three'
Assert r[3] == 'two'
Assert r[4] == 1
endfunction
function! s:Test_bind_compound_vars()
" lh#function#bind + lh#function#execute
let rev4 = lh#function#bind(function('Id'), 'v:4_', 'v:1_ . v:2_', 'v:3_', 'v:2_', 'v:1_')
let r = lh#function#execute(rev4, 1,'two','three', [4,5])
Assert! len(r) == 5
Assert! should#be#list (r[0])
Assert! should#be#string (r[1])
Assert! should#be#string (r[2])
Assert! should#be#string (r[3])
Assert! should#be#number (r[4])
Assert r[0] == [4,5]
Assert r[1] == '1two'
Assert r[2] == 'three'
Assert r[3] == 'two'
Assert r[4] == 1
endfunction
function! s:Test_execute_func_string_name()
" function name as string
let r = lh#function#execute('Id', 1,'two',3)
Assert! len(r) == 3
Assert! should#be#number (r[0])
Assert! should#be#string (r[1])
Assert! should#be#number (r[2])
Assert r[0] == 1
Assert r[1] == 'two'
Assert r[2] == 3
endfunction
function! s:Test_execute_string_expr()
" exp as binded-string
let r = lh#function#execute('Id(12,len(v:2_).v:2_, 42, v:3_, v:1_)', 1,'two',3)
Assert! len(r) == 5
Assert! should#be#number (r[0])
Assert! should#be#string (r[1])
Assert! should#be#number (r[2])
Assert! should#be#number (r[3])
Assert! should#be#number (r[4])
Assert r[0] == 12
Assert r[1] == len('two').'two'
Assert r[2] == 42
Assert r[3] == 3
Assert r[4] == 1
endfunction
function! s:Test_execute_func()
" calling a function() + bind
let r = lh#function#execute(function('Id'), 1,'two','v:1_',['a',42])
Assert! len(r) == 4
Assert! should#be#number (r[0])
Assert! should#be#string (r[1])
Assert! should#be#string (r[2])
Assert! should#be#list (r[3])
Assert r[0] == 1
Assert r[1] == 'two'
Assert r[2] == 'v:1_'
Assert r[3] == ['a', 42]
endfunction
"------------------------------------------------------------------------
function! s:Test_bind_func_string_name_AND_execute()
" function name as string
let rev3 = lh#function#bind('Id', 'v:3_', 12, 'v:2_', 'v:1_')
let r = lh#function#execute(rev3, 1,'two',3)
Assert! len(r) == 4
Assert! should#be#number (r[0])
Assert! should#be#number (r[1])
Assert! should#be#string (r[2])
Assert! should#be#number (r[3])
Assert r[0] == 3
Assert r[1] == 12
Assert r[2] == 'two'
Assert r[3] == 1
endfunction
function! s:Test_bind_string_expr_AND_execute()
" expressions as string
let rev3 = lh#function#bind('Id(12,len(v:2_).v:2_, 42, v:3_, v:1_)')
let r = lh#function#execute(rev3, 1,'two',3)
Assert! len(r) == 5
Assert! should#be#number (r[0])
Assert! should#be#string (r[1])
Assert! should#be#number (r[2])
Assert! should#be#number (r[3])
Assert! should#be#number (r[4])
Assert r[0] == 12
Assert r[1] == len('two').'two'
Assert r[2] == 42
Assert r[3] == 3
Assert r[4] == 1
endfunction
function! s:Test_double_bind_func_name()
let f1 = lh#function#bind('Id', 1, 2, 'v:1_', 4, 'v:2_')
" Comment "f1=".string(f1)
let r = lh#function#execute(f1, 3, 5)
Assert! len(r) == 5
let i = 0
while i != len(r)
Assert! should#be#number (r[i])
Assert r[i] == i+1
let i += 1
endwhile
" f2
let f2 = lh#function#bind(f1, 'v:1_', 5)
" Comment "f2=f1(v:1_, 5)=".string(f2)
let r = lh#function#execute(f2, 3)
Assert! len(r) == 5
let i = 0
while i != len(r)
Assert! should#be#number (r[i])
" echo "?? ".(r[i])."==".(i+1)
Assert r[i] == i+1
let i += 1
endwhile
endfunction
function! s:Test_double_bind_func()
let f1 = lh#function#bind(function('Id'), 1, 2, 'v:1_', 4, 'v:2_')
" Comment "f1=".string(f1)
let r = lh#function#execute(f1, 3, 5)
Assert! len(r) == 5
let i = 0
while i != len(r)
Assert! should#be#number (r[i])
Assert r[i] == i+1
let i += 1
endwhile
" f2
let f2 = lh#function#bind(f1, 'v:1_', 5)
" Comment "f2=f1(v:1_, 5)=".string(f2)
let r = lh#function#execute(f2, 3)
Assert! len(r) == 5
let i = 0
while i != len(r)
Assert! should#be#number (r[i])
Assert r[i] == i+1
let i += 1
endwhile
endfunction
function! s:Test_double_bind_func_cplx()
let s:bar = "bar"
let f1 = lh#function#bind(function('Id'), 1, 2, 'v:1_', 4, 'v:2_', 'v:3_', 'v:4_', 'v:5_', 'v:6_', 'v:7_')
" Comment "f1=".string(f1)
let f2 = lh#function#bind(f1, 'v:1_', 5, 'foo', s:bar, 'len(s:bar.v:1_)+v:1_', [1,2], '[v:1_, v:2_]')
" Comment "f2=f1(v:1_, 5)=".string(f2)
let r = lh#function#execute(f2, 42, "foo")
Assert! 0 && "not ready"
Comment "2bcpl# ".string(r)
endfunction
function! s:Test_double_bind_expr()
let f1 = lh#function#bind('Id(1, 2, v:1_, v:3_, v:2_)')
Comment "2be# f1=".string(f1)
let r = lh#function#execute(f1, 3, 5, 4)
Comment "2be# ".string(r)
Assert! len(r) == 5
let i = 0
while i != len(r)
Assert! should#be#number (r[i])
Assert r[i] == i+1
let i += 1
endwhile
" f2
let f2 = lh#function#bind(f1, 'v:1_', '"foo"', [])
Comment "2be# f2=f1(v:1_, 5)=".string(f2)
let r = lh#function#execute(f2, 3)
Comment "2be# ".string(r)
Assert! len(r) == 5
let i = 0
while i != len(r)-2
Assert! should#be#number (r[i])
Assert r[i] == i+1
let i += 1
endwhile
Assert! should#be#list (r[-2])
Assert r[-2] == []
Assert! should#be#string (r[-1])
Assert r[-1] == 'foo'
endfunction
"todo: write double-binded tests for all kind of binded parameters:
" 'len(g:bar)'
" 42
" []
" v:1_ + len(v:2_.v:3_)
" '"foo"'
" v:1_
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,165 @@
"=============================================================================
" $Id: list.vim 238 2010-06-01 00:47:16Z luc.hermitte $
" File: tests/lh/list.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 19th Nov 2008
" Last Update: $Date: 2010-05-31 20:47:16 -0400 (Mon, 31 May 2010) $
"------------------------------------------------------------------------
" Description:
" Tests for autoload/lh/list.vim
"
"------------------------------------------------------------------------
" Installation: «install details»
" History: «history»
" TODO: «missing features»
" }}}1
"=============================================================================
UTSuite [lh-vim-lib] Testing lh#list functions
runtime autoload/lh/function.vim
runtime autoload/lh/list.vim
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
" Find_if
function! s:Test_Find_If_string_predicate()
:let b = { 'min': 12, 'max': 42 }
:let l = [ 1, 5, 48, 25, 5, 28, 6]
:let i = lh#list#Find_if(l, 'v:val>v:1_.min && v:val<v:1_.max && v:val%v:2_==0', [b, 2] )
" echo i . '/' . len(l)
Assert i == 5
Assert l[i] == 28
" :echo l[i]
endfunction
function! s:Test_Find_If_functor_predicate()
:let l = [ 1, 5, 48, 25, 5, 28, 6]
:let i = lh#list#find_if(l, 'v:1_>12 && v:1_<42 && v:1_%2==0')
" echo i . '/' . len(l)
Assert i == 5
Assert l[i] == 28
" :echo l[i]
endfunction
function! s:Test_find_if_double_bind()
:let b = { 'min': 12, 'max': 42 }
:let l = [ 1, 5, 48, 25, 5, 28, 6]
:let f = lh#function#bind( 'v:3_>v:1_.min && v:3_<v:1_.max && v:3_%v:2_==0')
:let p = lh#function#bind(f, b,2,'v:1_')
:let i = lh#list#find_if(l, p)
:echo l[i]
endfunction
" double bind is not yet operational
UTIgnore Test_find_if_double_bind
"------------------------------------------------------------------------
" Unique Sorting
function! CmpNumbers(lhs, rhs)
if a:lhs < a:rhs | return -1
elseif a:lhs == a:rhs | return 0
else | return +1
endif
endfunction
function! s:Test_sort()
:let l = [ 1, 5, 48, 25, 5, 28, 6]
:let expected = [ 1, 5, 6, 25, 28, 48]
:let s = lh#list#unique_sort(l, "CmpNumbers")
" Comment string(s)
Assert s == expected
endfunction
function! s:Test_sort2()
:let l = [ 1, 5, 48, 25, 5, 28, 6]
:let expected = [ 1, 5, 6, 25, 28, 48]
:let s = lh#list#unique_sort2(l, "CmpNumbers")
" Comment string(s)
Assert s == expected
endfunction
"------------------------------------------------------------------------
" Searchs
function! s:TestBinarySearches()
let v1 = [ -3, -2, -1, -1, 0, 0, 1, 2, 3, 4, 6 ]
let i = lh#list#lower_bound(v1, 3)
Assert v1[i] == 3
let i = lh#list#upper_bound(v1, 3)
Assert v1[i] == 4
let r = lh#list#equal_range(v1, 3)
Assert v1[r[0]:r[1]-1] == [3]
let i = lh#list#lower_bound(v1, -1)
Assert v1[i] == -1
let i = lh#list#upper_bound(v1, -1)
Assert v1[i] == 0
let r = lh#list#equal_range(v1, -1)
Assert v1[r[0]:r[1]-1] == [-1, -1]
let i = lh#list#lower_bound(v1, 5)
Assert v1[i] == 6
let i = lh#list#upper_bound(v1, 5)
Assert v1[i] == 6
let r = lh#list#equal_range(v1, 5)
Assert v1[r[0]:r[1]-1] == []
Assert len(v1) == lh#list#lower_bound(v1, 10)
Assert len(v1) == lh#list#upper_bound(v1, 10)
Assert [len(v1), len(v1)] == lh#list#equal_range(v1, 10)
endfunction
"------------------------------------------------------------------------
" accumulate
function! s:Test_accumulate_len_strings()
let strings = [ 'foo', 'bar', 'toto' ]
let len = eval(lh#list#accumulate(strings, 'strlen', 'join(v:1_, "+")'))
Assert len == 3+3+4
endfunction
function! s:Test_accumulate_join()
let ll = [ 1, 2, 'foo', ['bar'] ]
let res = lh#list#accumulate(ll, 'string', 'join(v:1_, " ## ")')
Assert res == "1 ## 2 ## 'foo' ## ['bar']"
" This test will fail because it seems :for each loop cannot iterate on
" heterogeneous containers
endfunction
"------------------------------------------------------------------------
" Copy_if
function! s:Test_copy_if()
:let l = [ 1, 25, 5, 48, 25, 5, 28, 6]
:let expected = [ 25, 48, 25, 28, 6]
:let s = lh#list#copy_if(l, [], "v:1_ > 5")
" Comment string(s)
Assert s == expected
endfunction
"------------------------------------------------------------------------
" subset
function! s:Test_subset()
:let l = [ 1, 25, 5, 48, 25, 5, 28, 6]
:let indices = [ 0, 5, 7, 3 ]
:let expected = [ 1, 5, 6, 48 ]
:let s = lh#list#subset(l, indices)
" Comment string(s)
Assert s == expected
endfunction
"------------------------------------------------------------------------
" intersect
function! s:Test_intersect()
:let l1 = [ 1, 25, 7, 48, 26, 5, 28, 6]
:let l2 = [ 3, 8, 7, 25, 6 ]
:let expected = [ 25, 7, 6 ]
:let s = lh#list#intersect(l1, l2)
" Comment string(s)
Assert s == expected
endfunction
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,173 @@
"=============================================================================
" $Id: path.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: tests/lh/path.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 28th May 2009
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $
"------------------------------------------------------------------------
" Description:
" Tests for autoload/lh/path.vim
"
"------------------------------------------------------------------------
" Installation: «install details»
" History: «history»
" TODO: «missing features»
" }}}1
"=============================================================================
UTSuite [lh-vim-lib] Testing lh#path functions
runtime autoload/lh/path.vim
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
function! s:Test_simplify()
Assert lh#path#simplify('a/b/c') == 'a/b/c'
Assert lh#path#simplify('a/b/./c') == 'a/b/c'
Assert lh#path#simplify('./a/b/./c') == 'a/b/c'
Assert lh#path#simplify('./a/../b/./c') == 'b/c'
Assert lh#path#simplify('../a/../b/./c') == '../b/c'
Assert lh#path#simplify('a\b\c') == 'a\b\c'
Assert lh#path#simplify('a\b\.\c') == 'a\b\c'
Assert lh#path#simplify('.\a\b\.\c') == 'a\b\c'
if exists('+shellslash')
Assert lh#path#simplify('.\a\..\b\.\c') == 'b\c'
Assert lh#path#simplify('..\a\..\b\.\c') == '..\b\c'
endif
endfunction
function! s:Test_strip_common()
let paths = ['foo/bar/file', 'foo/file', 'foo/foo/file']
let expected = [ 'bar/file', 'file', 'foo/file']
Assert lh#path#strip_common(paths) == expected
endfunction
function! s:Test_common()
Assert 'foo/' == lh#path#common(['foo/bar/dir', 'foo'])
Assert 'foo/bar/' == lh#path#common(['foo/bar/dir', 'foo/bar'])
Assert 'foo/' == lh#path#common(['foo/bar/dir', 'foo/bar2'])
endfunction
function! s:Test_strip_start()
let expected = 'template/bar.template'
Assert lh#path#strip_start($HOME.'/.vim/template/bar.template',
\ [ $HOME.'/.vim', $HOME.'/vimfiles', '/usr/local/share/vim' ])
\ == expected
Assert lh#path#strip_start($HOME.'/vimfiles/template/bar.template',
\ [ $HOME.'/.vim', $HOME.'/vimfiles', '/usr/local/share/vim' ])
\ == expected
Assert lh#path#strip_start('/usr/local/share/vim/template/bar.template',
\ [ $HOME.'/.vim', $HOME.'/vimfiles', '/usr/local/share/vim' ])
\ == expected
endfunction
function! s:Test_IsAbsolutePath()
" nix paths
Assert lh#path#is_absolute_path('/usr/local')
Assert lh#path#is_absolute_path($HOME)
Assert ! lh#path#is_absolute_path('./usr/local')
Assert ! lh#path#is_absolute_path('.usr/local')
" windows paths
Assert lh#path#is_absolute_path('e:\usr\local')
Assert ! lh#path#is_absolute_path('.\usr\local')
Assert ! lh#path#is_absolute_path('.usr\local')
" UNC paths
Assert lh#path#is_absolute_path('\\usr\local')
Assert lh#path#is_absolute_path('//usr/local')
endfunction
function! s:Test_IsURL()
" nix paths
Assert ! lh#path#is_url('/usr/local')
Assert ! lh#path#is_url($HOME)
Assert ! lh#path#is_url('./usr/local')
Assert ! lh#path#is_url('.usr/local')
" windows paths
Assert ! lh#path#is_url('e:\usr\local')
Assert ! lh#path#is_url('.\usr\local')
Assert ! lh#path#is_url('.usr\local')
" UNC paths
Assert ! lh#path#is_url('\\usr\local')
Assert ! lh#path#is_url('//usr/local')
" URLs
Assert lh#path#is_url('http://www.usr/local')
Assert lh#path#is_url('https://www.usr/local')
Assert lh#path#is_url('ftp://www.usr/local')
Assert lh#path#is_url('sftp://www.usr/local')
Assert lh#path#is_url('dav://www.usr/local')
Assert lh#path#is_url('fetch://www.usr/local')
Assert lh#path#is_url('file://www.usr/local')
Assert lh#path#is_url('rcp://www.usr/local')
Assert lh#path#is_url('rsynch://www.usr/local')
Assert lh#path#is_url('scp://www.usr/local')
endfunction
function! s:Test_ToRelative()
let pwd = getcwd()
Assert lh#path#to_relative(pwd.'/foo/bar') == 'foo/bar'
Assert lh#path#to_relative(pwd.'/./foo') == 'foo'
Assert lh#path#to_relative(pwd.'/foo/../bar') == 'bar'
" Does not work yet as it returns an absolute path it that case
Assert lh#path#to_relative(pwd.'/../bar') == '../bar'
endfunction
function! s:Test_relative_path()
Assert lh#path#relative_to('foo/bar/dir', 'foo') == '../../'
Assert lh#path#relative_to('foo', 'foo/bar/dir') == 'bar/dir/'
Assert lh#path#relative_to('foo/bar', 'foo/bar2/dir') == '../bar2/dir/'
let pwd = getcwd()
Assert lh#path#relative_to(pwd ,pwd.'/../bar') == '../bar/'
endfunction
function! s:Test_search_vimfiles()
let expected_win = $HOME . '/vimfiles'
let expected_nix = $HOME . '/.vim'
let what = lh#path#to_regex($HOME.'/').'\(vimfiles\|.vim\)'
" Comment what
let z = lh#path#find(&rtp,what)
if has('win16')||has('win32')||has('win64')
Assert z == expected_win
else
Assert z == expected_nix
endif
endfunction
function! s:Test_path_depth()
Assert 0 == lh#path#depth('.')
Assert 0 == lh#path#depth('./')
Assert 0 == lh#path#depth('.\')
Assert 1 == lh#path#depth('toto')
Assert 1 == lh#path#depth('toto/')
Assert 1 == lh#path#depth('toto\')
Assert 1 == lh#path#depth('toto/.')
Assert 1 == lh#path#depth('toto\.')
Assert 1 == lh#path#depth('toto/./.')
Assert 1 == lh#path#depth('toto\.\.')
Assert 0 == lh#path#depth('toto/..')
if exists('+shellslash')
Assert 0 == lh#path#depth('toto\..')
endif
Assert 2 == lh#path#depth('toto/titi/')
Assert 2 == lh#path#depth('toto\titi\')
Assert 2 == lh#path#depth('/toto/titi/')
Assert 2 == lh#path#depth('c:/toto/titi/')
Assert 2 == lh#path#depth('c:\toto/titi/')
" todo: make a choice about "negative" paths like "../../foo"
Assert -1 == lh#path#depth('../../foo')
endfunction
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,83 @@
"=============================================================================
" $Id: test-Fargs2String.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: tests/lh/test-Fargs2String.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 16th Apr 2007
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $
"------------------------------------------------------------------------
" Description: Tests for lh-vim-lib . lh#command#Fargs2String
"
"------------------------------------------------------------------------
" Installation:
" Relies on the version «patched by myself|1?» of vim_units
" History: «history»
" TODO: «missing features»
" }}}1
"=============================================================================
function! s:TestEmpty()
let empty = []
let res = lh#command#Fargs2String(empty)
call VUAssertEquals(len(empty), 0, 'Expected empty', 22)
call VUAssertEquals(res, '', 'Expected empty result', 23)
endfunction
function! s:TestSimpleText1()
let expected = 'text'
let one = [ expected ]
let res = lh#command#Fargs2String(one)
call VUAssertEquals(len(one), 0, 'Expected empty', 27)
call VUAssertEquals(res, expected, 'Expected a simple result', 28)
endfunction
function! s:TestSimpleTextN()
let expected = 'text'
let list = [ expected , 'stuff1', 'stuff2']
let res = lh#command#Fargs2String(list)
call VUAssertEquals(len(list), 2, 'Expected not empty', 38)
call VUAssertEquals(res, expected, 'Expected a simple result', 39)
endfunction
function! s:TestComposedN()
let expected = '"a several tokens string"'
let list = [ '"a', 'several', 'tokens', 'string"', 'stuff1', 'stuff2']
let res = lh#command#Fargs2String(list)
call VUAssertEquals(len(list), 2, 'Expected not empty', 46)
call VUAssertEquals(res, expected, 'Expected a composed string', 47)
call VUAssertEquals(list, ['stuff1', 'stuff2'], 'Expected a list', 48)
call VUAssertNotSame(list, ['stuff1', 'stuff2'], 'Expected different lists', 49)
endfunction
function! s:TestComposed1()
let expected = '"string"'
let list = [ '"string"', 'stuff1', 'stuff2']
let res = lh#command#Fargs2String(list)
call VUAssertEquals(len(list), 2, 'Expected not empty', 56)
call VUAssertEquals(res, expected, 'Expected a string', 57)
call VUAssertEquals(list, ['stuff1', 'stuff2'], 'Expected a list', 58)
call VUAssertNotSame(list, ['stuff1', 'stuff2'], 'Expected different lists', 59)
endfunction
function! s:TestInvalidString()
let expected = '"a string'
let list = [ '"a', 'string']
let res = lh#command#Fargs2String(list)
call VUAssertEquals(len(list), 0, 'Expected empty', 66)
call VUAssertEquals(res, expected, 'Expected an invalid string', 67)
endfunction
function! AllTests()
call s:TestEmpty()
call s:TestSimpleText1()
call s:TestSimpleTextN()
call s:TestComposed1()
call s:TestComposedN()
endfunction
" call VURunnerRunTest('AllTests')
VURun % AllTests
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,65 @@
"=============================================================================
" $Id: test-askmenu.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: test-buffer-menu.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 18th Apr 2007
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $
"------------------------------------------------------------------------
" Description:
" Test units for buffermenu.vim
"
"------------------------------------------------------------------------
" Installation: Requires:
" (*) Vim 7.0+
" (*) vim_units.vim v0.2/1.0?
" Vimscript # «???»
" (*) lh-vim-lib (lh#ask#menu)
"
" User Manual:
" Source this file.
"
" History:
" (*) 17th Apr 2007: First version
" TODO: «missing features»
" }}}1
"=============================================================================
"=============================================================================
let s:cpo_save=&cpo
"------------------------------------------------------------------------
" Functions {{{1
function! TestAskMenu()
imenu 42.40.10 &LH-Tests.&Menu.&ask.i iask
inoremenu 42.40.10 &LH-Tests.&Menu.&ask.inore inoreask
nmenu 42.40.10 &LH-Tests.&Menu.&ask.n nask
nnoremenu 42.40.10 &LH-Tests.&Menu.&ask.nnore nnoreask
nmenu <script> 42.40.10 &LH-Tests.&Menu.&ask.nscript nscriptask
nnoremenu <script> 42.40.10 &LH-Tests.&Menu.&ask.nnnscript nnscriptask
vmenu 42.40.10 &LH-Tests.&Menu.&ask.v vask
vnoremenu 42.40.10 &LH-Tests.&Menu.&ask.vnore vnoreask
call s:CheckInMode('i', 'i')
endfunction
function! s:CheckInMode(mode, name)
let g:menu = lh#askvim#menu('LH-Tests.Menu.ask.'.a:name, a:mode)
let g:name = a:name
" VUAssert 55 Equals g:menu.name g:name "Name mismatch"
" VUAssert 56 Equals g:menu.priority '42.40.10' "Priority mismatch"
" VUAssert 57 Fail "parce qu'il le faut bien"
echomsg "name= ".g:menu.name
echomsg "prio= ".g:menu.priority
endfunction
" Functions }}}1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,69 @@
" $Id: test-command.vim 156 2010-05-07 00:54:36Z luc.hermitte $
" Tests for lh-vim-lib . lh#command
" FindFilter(filter): Helper {{{3
function! s:FindFilter(filter)
let filter = a:filter . '.vim'
let result =globpath(&rtp, "compiler/BTW-".filter) . "\n" .
\ globpath(&rtp, "compiler/BTW_".filter). "\n" .
\ globpath(&rtp, "compiler/BTW/".filter)
let result = substitute(result, '\n\n', '\n', 'g')
let result = substitute(result, '^\n', '', 'g')
return result
endfunction
function! s:ComplFilter(filter)
let files = s:FindFilter('*')
let files = substitute(files,
\ '\(^\|\n\).\{-}compiler[\\/]BTW[-_\\/]\(.\{-}\)\.vim\>\ze\%(\n\|$\)',
\ '\1\2', 'g')
return files
endfunction
function! s:Add()
endfunction
let s:v1 = 'v1'
let s:v2 = 2
function! s:Foo(i)
return a:i*a:i
endfunction
function! s:echo(params)
echo s:{join(a:params, '')}
endfunction
function! Echo(params)
" echo "Echo(".string(a:params).')'
let expr = 's:'.join(a:params, '')
" echo expr
exe 'echo '.expr
endfunction
let TBTWcommand = {
\ "name" : "TBT",
\ "arg_type" : "sub_commands",
\ "arguments" :
\ [
\ { "name" : "echo",
\ "arg_type" : "function",
\ "arguments" : "v1,v2",
\ "action": function("\<sid>echo") },
\ { "name" : "Echo",
\ "arg_type" : "function",
\ "arguments" : "v1,v2",
\ "action": function("Echo") },
\ { "name" : "help" },
\ { "name" : "add",
\ "arguments": function("s:ComplFilter"),
\ "action" : function("s:Add") }
\ ]
\ }
call lh#command#new(TBTWcommand)
nnoremap µ :call lh#command#new(TBTWcommand)<cr>
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,54 @@
"=============================================================================
" $Id: test-menu-map.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: tests/lh/test-menu-map.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 05th Dec 2006
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $
"------------------------------------------------------------------------
" Description: Tests for lh-vim-lib . lh#menu#
"
"------------------------------------------------------------------------
" Installation: «install details»
" History: «history»
" TODO: «missing features»
" }}}1
"=============================================================================
" let g:want_buffermenu_or_global_disable = 1
" let b:want_buffermenu_or_global_disable = 1
" echo lh#option#get("want_buffermenu_or_global_disable", 1, "bg")
" Call a command (':Command')
call lh#menu#make("nic", '42.50.340',
\ '&LH-Tests.&Menu-Make.Build Ta&gs', "<C-L>g",
\ '<buffer>',
\ ":echo 'TeXtags'<CR>")
" With '{' expanding to '{}××', or '{}' regarding the mode
call lh#menu#IVN_make('42.50.360.200',
\ '&LH-Tests.&Menu-Make.&Insert.\toto{}', ']toto',
\ '\\toto{',
\ '{%i\\toto<ESC>%l',
\ "viw]toto")
" Noremap for the visual maps
call lh#menu#IVN_make('42.50.360.200',
\ '&LH-Tests.&Menu-Make.&Insert.\titi{}', ']titi',
\ '\\titi{',
\ '<ESC>`>a}<ESC>`<i\\titi{<ESC>%l',
\ "viw]titi",
\ 0, 1, 0)
" Noremap for the insert and visual maps
call lh#menu#IVN_make('42.50.360.200',
\ '&LH-Tests.&Menu-Make.&Insert.<tata></tata>', ']tata',
\ '<tata></tata><esc>?<<CR>i',
\ '<ESC>`>a</tata><ESC>`<i<tata><ESC>/<\\/tata>/e1<CR>',
\ "viw]tata",
\ 1, 1, 0)
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,84 @@
"=============================================================================
" $Id: test-toggle-menu.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: tests/lh/topological-sort.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 17th Apr 2007
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $
"------------------------------------------------------------------------
" Description:
" Tests for lh-vim-lib . lh#menu#def_toggle_item()
"
"------------------------------------------------------------------------
" Installation: «install details»
" History: «history»
" TODO: «missing features»
" }}}1
"=============================================================================
source autoload/lh/menu.vim
let Data = {
\ "variable": "bar",
\ "idx_crt_value": 1,
\ "values": [ 'a', 'b', 'c', 'd' ],
\ "menu": { "priority": '42.50.10', "name": '&LH-Tests.&TogMenu.&bar'}
\}
call lh#menu#def_toggle_item(Data)
let Data2 = {
\ "variable": "foo",
\ "idx_crt_value": 3,
\ "texts": [ 'un', 'deux', 'trois', 'quatre' ],
\ "values": [ 1, 2, 3, 4 ],
\ "menu": { "priority": '42.50.11', "name": '&LH-Tests.&TogMenu.&foo'}
\}
call lh#menu#def_toggle_item(Data2)
" No default
let Data3 = {
\ "variable": "nodef",
\ "texts": [ 'one', 'two', 'three', 'four' ],
\ "values": [ 1, 2, 3, 4 ],
\ "menu": { "priority": '42.50.12', "name": '&LH-Tests.&TogMenu.&nodef'}
\}
call lh#menu#def_toggle_item(Data3)
" No default
let g:def = 2
let Data4 = {
\ "variable": "def",
\ "values": [ 1, 2, 3, 4 ],
\ "menu": { "priority": '42.50.13', "name": '&LH-Tests.&TogMenu.&def'}
\}
call lh#menu#def_toggle_item(Data4)
" What follows does not work because we can't build an exportable FuncRef on top
" of a script local function
" finish
function! s:getSNR()
if !exists("s:SNR")
let s:SNR=matchstr(expand("<sfile>"), "<SNR>\\d\\+_\\zegetSNR$")
endif
return s:SNR
endfunction
function! s:Yes()
echomsg "Yes"
endfunction
function! s:No()
echomsg "No"
endfunction
let Data4 = {
\ "variable": "yesno",
\ "values": [ 1, 2 ],
\ "text": [ "No", "Yes" ],
\ "actions": [ function(s:getSNR()."No"), function(s:getSNR()."Yes") ],
\ "menu": { "priority": '42.50.20', "name": '&LH-Tests.&TogMenu.&yesno'}
\}
call lh#menu#def_toggle_item(Data4)

View File

@ -0,0 +1,120 @@
"=============================================================================
" $Id: topological-sort.vim 246 2010-09-19 22:40:58Z luc.hermitte $
" File: tests/lh/topological-sort.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 2.2.1
" Created: 17th Apr 2008
" Last Update: $Date: 2010-09-19 18:40:58 -0400 (Sun, 19 Sep 2010) $
"------------------------------------------------------------------------
" Description: «description»
"
"------------------------------------------------------------------------
" Installation: «install details»
" History: «history»
" TODO: «missing features»
" }}}1
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
UTSuite [lh-vim-lib] topological sort
" Fully defineds DAGs {{{1
" A Direct Acyclic Graph {{{2
let s:dag1 = {}
let s:dag1[7] = [11, 8]
let s:dag1[5] = [11]
let s:dag1[3] = [8, 10]
let s:dag1[11] = [2, 9, 10]
let s:dag1[8] = [9]
" A Direct Cyclic Graph {{{2
let s:dcg1 = deepcopy(s:dag1)
let s:dcg1[9] = [11]
" Check routine: are the elements correctly sorted? {{{2
function! s:DoTestOrder(elements)
Assert! len(a:elements) == 8
Assert index(a:elements, 7) < index(a:elements, 11)
Assert index(a:elements, 7) < index(a:elements, 8)
Assert index(a:elements, 5) < index(a:elements, 11)
Assert index(a:elements, 3) < index(a:elements, 8)
Assert index(a:elements, 3) < index(a:elements, 10)
Assert index(a:elements, 11) < index(a:elements, 2)
Assert index(a:elements, 11) < index(a:elements, 9)
Assert index(a:elements, 11) < index(a:elements, 10)
Assert index(a:elements, 8) < index(a:elements, 9)
endfunction
" Test DAG1 {{{2
function! s:TestDAG_depth()
let res = lh#graph#tsort#depth(s:dag1, [3, 5,7])
call s:DoTestOrder(res)
echo "D(s:dag1)=".string(res)
endfunction
function! s:TestDAG_breadth()
let res = lh#graph#tsort#breadth(s:dag1, [3, 5,7])
call s:DoTestOrder(res)
echo "B(s:dag1)=".string(res)
endfunction
" Test DCG1 {{{2
function! s:TestDCG_depth()
let expr = 'lh#graph#tsort#depth('.string(s:dcg1).', [3, 5,7])'
Assert should#throw(expr, 'Tsort: cyclic graph detected')
endfunction
function! s:TestDCG_breadth()
let expr = 'lh#graph#tsort#breadth('.string(s:dcg1).', [3, 5,7])'
Assert should#throw(expr, 'Tsort: cyclic graph detected')
endfunction
" Lazzy Evaluated DAGs {{{1
" Emulated lazzyness {{{2
" The time-consumings evaluation function
let s:called = 0
function! Fetch(node)
let s:called += 1
return has_key(s:dag1, a:node) ? (s:dag1[a:node]) : []
endfunction
" Test Fetch on a DAG {{{2
function! s:TestDAG_fetch()
let s:called = 0
let res = lh#graph#tsort#depth(function('Fetch'), [3,5,7])
call s:DoTestOrder(res)
echo "D(fetch)=".string(res)
echo "Fetch has been evaluated ".s:called." times / ".len(res)
Assert s:called == len(res)
endfunction
" Setup/Teardown functions {{{1
" display the test name before each assertion
function! s:Setup()
if exists('g:UT_print_test')
let s:old_print_test = g:UT_print_test
endif
let g:UT_print_test = 1
endfunction
function! s:Teardown()
if exists('s:old_print_test')
let g:UT_print_test = s:old_print_test
unlet s:old_print_test
else
unlet g:UT_print_test
endif
endfunction
" }}}1
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,16 @@
--------------------
UT v0.0.3
--------------------
UT is a Unit Testing Framework for Vim
Audience : Vim script maintainers
Requirements : Vim 7, lh-vim-lib v2.2.0 ;
takes advantage of BuildtoolsWrappers if installed.
Required by : Only lh-vim
Maintainer : Luc Hermitte
License : GPL 2 (see http://www.gnu.org/licenses/gpl.txt)
More Help At : http://code.google.com/p/lh-vim/wiki/UT
Vim script#???: http://www.vim.org/scripts/script.php?script_id=???
Repository :
svn checkout http://lh-vim.googlecode.com/svn/UT/trunk UT

View File

@ -0,0 +1,442 @@
"=============================================================================
" $Id: UT.vim 193 2010-05-17 23:10:03Z luc.hermitte $
" File: autoload/lh/UT.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
" Version: 0.0.3
" Created: 11th Feb 2009
" Last Update: $Date: 2010-05-17 19:10:03 -0400 (Mon, 17 May 2010) $
"------------------------------------------------------------------------
" Description: Yet Another Unit Testing Framework for Vim
"
"------------------------------------------------------------------------
" Installation:
" Drop this file into {rtp}/autoload/lh/
" History:
" Strongly inspired by Tom Link's tAssert plugin: all its functions are
" compatible with this framework.
"
" Features:
" - Assertion failures are reported in the quickfix window
" - Assertion syntax is simple, check Tom Link's suite, it's the same
" - Supports banged :Assert! to stop processing a given test on failed
" assertions
" - All the s:Test* functions of a suite are executed (almost) independently
" (i.e., a critical :Assert! failure will stop the Test of the function, and
" lh#UT will proceed to the next s:Test function
" - Lightweight and simple to use: there is only one command defined, all the
" other definitions are kept in an autoload plugin.
" - A suite == a file
" - Several s:TestXxx() per suite
" - +optional s:Setup(), s:Teardown()
" - Supports :Comment's ; :Comment takes an expression to evaluate
" - s:LocalFunctions(), s:variables, and l:variables are supported
" - Takes advantage of BuildToolsWrapper's :Copen command if installed
" - Count successful tests (and not successful assertions)
" - Short-cuts to run the Unit Tests associated to a given vim script
" Relies on: Let-Modeline/local_vimrc/Project to set g:UTfiles (space
" separated list of glob-able paths), and on lh-vim-lib#path
" - Command to exclude, or specify the tests to play => UTPlay, UTIgnore
" - Option g:UT_print_test to display, on assertion failure, the current test
" name with the assertion failed.
"
" TODO:
" - Always execute s:Teardown() -- move its call to a :finally bloc
" - Test in UTF-8 (because of <SNR>_ injection)
" - test under windows (where paths have spaces, etc)
" - What about s:/SNR pollution ? The tmpfile is reused, and there is no
" guaranty a script will clean its own place
" - add &efm for viml errors like the one produced by :Assert 0 + [0]
" and take into account the offset introduced by lines injected at the top of
" the file
" - simplify s:errors functions
" - merge with Tom Link tAssert plugin? (the UI is quite different)
" - :AssertEquals that shows the name of both expressions and their values as
" well -- a correct distinction of both parameters will be tricky with
" regexes ; using functions will loose either the name, or the value in case
" of local/script variables use ; we need macros /à la C/...
" - Support Embedded comments like for instance:
" Assert 1 == 1 " 1 must value 1
" - Ways to test buffers produced
" }}}1
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
" ## Functions {{{1
"------------------------------------------------------------------------
" # Debug {{{2
function! lh#UT#verbose(level)
let s:verbose = a:level
endfunction
function! s:Verbose(expr, ...)
let lvl = a:0>0 ? a:1 : 1
if exists('s:verbose') && s:verbose >= lvl
echomsg a:expr
endif
endfunction
function! lh#UT#debug(expr)
return eval(a:expr)
endfunction
"------------------------------------------------------------------------
" # Internal functions {{{2
"------------------------------------------------------------------------
" Sourcing a script doesn't imply a new entry with its name in :scriptnames
" As a consequence, the easiest thing to do is to reuse the same file over and
" over in a given vim session.
" This approach should be fine as long as there are less than 26 VimL testing vim
" sessions opened simultaneously.
let s:tempfile = tempname()
"------------------------------------------------------------------------
" s:errors
let s:errors = {
\ 'qf' : [],
\ 'crt_suite' : {},
\ 'nb_asserts' : 0,
\ 'nb_successful_asserts' : 0,
\ 'nb_success' : 0,
\ 'suites' : []
\ }
function! s:errors.clear() dict
let self.qf = []
let self.nb_asserts = 0
let self.nb_successful_asserts = 0
let self.nb_success = 0
let self.nb_tests = 0
let self.suites = []
let self.crt_suite = {}
endfunction
function! s:errors.display() dict
let g:errors = self.qf
cexpr self.qf
" Open the quickfix window
if exists(':Copen')
" Defined in lh-BTW, make the windows as big as the number of errors, not
" opened if there is no error
Copen
else
copen
endif
endfunction
function! s:errors.set_current_SNR(SNR)
let self.crt_suite.snr = a:SNR
endfunction
function! s:errors.get_current_SNR()
return self.crt_suite.snr
endfunction
function! s:errors.add(FILE, LINE, message) dict
let msg = a:FILE.':'.a:LINE.':'
if lh#option#get('UT_print_test', 0, 'g') && has_key(s:errors, 'crt_test')
let msg .= '['. s:errors.crt_test.name .'] '
endif
let msg.= a:message
call add(self.qf, msg)
endfunction
function! s:errors.add_test(test_name) dict
call self.add_test(a:test_name)
endfunction
function! s:errors.set_test_failed() dict
if has_key(self, 'crt_test')
let self.crt_test.failed = 1
endif
endfunction
"------------------------------------------------------------------------
" Tests wrapper functions
function! s:RunOneTest(file) dict
try
let s:errors.crt_test = self
if has_key(s:errors.crt_suite, 'setup')
let F = function(s:errors.get_current_SNR().'Setup')
call F()
endif
let F = function(s:errors.get_current_SNR(). self.name)
call F()
if has_key(s:errors.crt_suite, 'teardown')
let F = function(s:errors.get_current_SNR().'Teardown')
call F()
endif
catch /Assert: abort/
call s:errors.add(a:file,
\ matchstr(v:exception, '.*(\zs\d\+\ze)'),
\ 'Test <'. self.name .'> execution aborted on critical assertion failure')
catch /.*/
let throwpoint = substitute(v:throwpoint, escape(s:tempfile, '.\'), a:file, 'g')
let msg = throwpoint . ': '.v:exception
call s:errors.add(a:file, 0, msg)
finally
unlet s:errors.crt_test
endtry
endfunction
function! s:AddTest(test_name) dict
let test = {
\ 'name' : a:test_name,
\ 'run' : function('s:RunOneTest'),
\ 'failed' : 0
\ }
call add(self.tests, test)
endfunction
"------------------------------------------------------------------------
" Suites wrapper functions
function! s:ConcludeSuite() dict
call s:errors.add(self.file,0, 'SUITE<'. self.name.'> '. s:errors.nb_success .'/'. s:errors.nb_tests . ' tests successfully executed.')
" call add(s:errors.qf, 'SUITE<'. self.name.'> '. s:rrors.nb_success .'/'. s:errors.nb_tests . ' tests successfully executed.')
endfunction
function! s:PlayTests(...) dict
call s:Verbose('Execute tests: '.join(a:000, ', '))
call filter(self.tests, 'index(a:000, v:val.name) >= 0')
call s:Verbose('Keeping tests: '.join(self.tests, ', '))
endfunction
function! s:IgnoreTests(...) dict
call s:Verbose('Ignoring tests: '.join(a:000, ', '))
call filter(self.tests, 'index(a:000, v:val.name) < 0')
call s:Verbose('Keeping tests: '.join(self.tests, ', '))
endfunction
function! s:errors.new_suite(file) dict
let suite = {
\ 'scriptname' : s:tempfile,
\ 'file' : a:file,
\ 'tests' : [],
\ 'snr' : '',
\ 'add_test' : function('s:AddTest'),
\ 'conclude' : function('s:ConcludeSuite'),
\ 'play' : function('s:PlayTests'),
\ 'ignore' : function('s:IgnoreTests'),
\ 'nb_tests_failed' : 0
\ }
call add(self.suites, suite)
let self.crt_suite = suite
return suite
endfunction
function! s:errors.set_suite(suite_name) dict
let a = s:Decode(a:suite_name)
call s:Verbose('SUITE <- '. a.expr, 1)
call s:Verbose('SUITE NAME: '. a:suite_name, 2)
" call self.add(a.file, a.line, 'SUITE <'. a.expr .'>')
call self.add(a.file,0, 'SUITE <'. a.expr .'>')
let self.crt_suite.name = a.expr
" let self.crt_suite.file = a.file
endfunction
"------------------------------------------------------------------------
function! s:Decode(expression)
let filename = s:errors.crt_suite.file
let expr = a:expression
let line = matchstr(expr, '^\d\+')
" echo filename.':'.line
let expr = strpart(expr, strlen(line)+1)
let res = { 'file':filename, 'line':line, 'expr':expr}
call s:Verbose('decode:'. (res.file) .':'. (res.line) .':'. (res.expr), 2)
return res
endfunction
function! lh#UT#callback_decode(expression)
return s:Decode(a:expression)
endfunction
"------------------------------------------------------------------------
let s:k_commands = '\%(Assert\|UTSuite\|Comment\)'
let s:k_local_evaluate = [
\ 'command! -bang -nargs=1 Assert '.
\ 'let s:a = lh#UT#callback_decode(<q-args>) |'.
\ 'let s:ok = !empty(eval(s:a.expr)) |'.
\ 'exe "UTAssert<bang> ".s:ok." ".(<f-args>)|'
\]
let s:k_getSNR = [
\ 'function! s:getSNR()',
\ ' if !exists("s:SNR")',
\ ' let s:SNR=matchstr(expand("<sfile>"), "<SNR>\\d\\+_\\zegetSNR$")',
\ ' endif',
\ ' return s:SNR',
\ 'endfunction',
\ 'call lh#UT#callback_set_SNR(s:getSNR())',
\ ''
\ ]
function! s:PrepareFile(file)
if !filereadable(a:file)
call s:errors.add('-', 0, a:file . " can not be read")
return
endif
let file = escape(a:file, ' \')
let lines = readfile(a:file)
let need_to_know_SNR = 0
let suite = s:errors.new_suite(a:file)
let no = 0
let last_line = len(lines)
while no < last_line
if lines[no] =~ '^\s*'.s:k_commands.'\>'
let lines[no] = substitute(lines[no], '^\s*'.s:k_commands.'!\= \zs', (no+1).' ', '')
elseif lines[no] =~ '^\s*function!\=\s\+s:Test'
let test_name = matchstr(lines[no], '^\s*function!\=\s\+s:\zsTest\S\{-}\ze(')
call suite.add_test(test_name)
elseif lines[no] =~ '^\s*function!\=\s\+s:Teardown'
let suite.teardown = 1
elseif lines[no] =~ '^\s*function!\=\s\+s:Setup'
let suite.setup = 1
endif
if lines[no] =~ '^\s*function!\=\s\+s:'
let need_to_know_SNR = 1
endif
let no += 1
endwhile
" Inject s:getSNR() in the script if there is a s:Function in the Test script
if need_to_know_SNR
call extend(lines, s:k_getSNR, 0)
let last_line += len(s:k_getSNR)
endif
" Inject local evualation of expressions in the script
" => takes care of s:variables, s:Functions(), and l:variables
call extend(lines, s:k_local_evaluate, 0)
call writefile(lines, suite.scriptname)
let g:lines=lines
endfunction
function! s:RunOneFile(file)
try
call s:PrepareFile(a:file)
exe 'source '.s:tempfile
let s:errors.nb_tests = len(s:errors.crt_suite.tests)
if !empty(s:errors.crt_suite.tests)
call s:Verbose('Executing tests: '.join(s:errors.crt_suite.tests, ', '))
for test in s:errors.crt_suite.tests
call test.run(a:file)
let s:errors.nb_success += 1 - test.failed
endfor
endif
catch /Assert: abort/
call s:errors.add(a:file,
\ matchstr(v:exception, '.*(\zs\d\+\ze)'),
\ 'Suite <'. s:errors.crt_suite .'> execution aborted on critical assertion failure')
catch /.*/
let throwpoint = substitute(v:throwpoint, escape(s:tempfile, '.\'), a:file, 'g')
let msg = throwpoint . ': '.v:exception
call s:errors.add(a:file, 0, msg)
finally
call s:errors.crt_suite.conclude()
" Never! the name must not be used by other Vim sessions
" call delete(s:tempfile)
endtry
endfunction
"------------------------------------------------------------------------
function! s:StripResultAndDecode(expr)
" Function needed because of an odd degenerescence of vim: commands
" eventually loose their '\'
return s:Decode(matchstr(a:expr, '^\d\+\s\+\zs.*'))
endfunction
function! s:GetResult(expr)
" Function needed because of an odd degenerescence of vim: commands
" eventually loose their '\'
return matchstr(a:expr, '^\d\+\ze\s\+.*')
endfunction
function! s:DefineCommands()
" NB: variables are already interpreted, make it a function
" command! -nargs=1 Assert call s:Assert(<q-args>)
command! -bang -nargs=1 UTAssert
\ let s:a = s:StripResultAndDecode(<q-args>) |
\ let s:ok = s:GetResult(<q-args>) |
\ let s:errors.nb_asserts += 1 |
\ if ! s:ok |
\ call s:errors.set_test_failed() |
\ call s:errors.add(s:a.file, s:a.line, 'assertion failed: '.s:a.expr) |
\ if '<bang>' == '!' |
\ throw "Assert: abort (".s:a.line.")" |
\ endif |
\ else |
\ let s:errors.nb_successful_asserts += 1 |
\ endif
command! -nargs=1 Comment
\ let s:a = s:Decode(<q-args>) |
\ call s:errors.add(s:a.file, s:a.line, eval(s:a.expr))
command! -nargs=1 UTSuite call s:errors.set_suite(<q-args>)
command! -nargs=+ UTPlay call s:errors.crt_suite.play(<f-args>)
command! -nargs=+ UTIgnore call s:errors.crt_suite.ignore(<f-args>)
endfunction
function! s:UnDefineCommands()
silent! delcommand Assert
silent! delcommand UTAssert
silent! command! -nargs=* UTSuite :echoerr "Use :UTRun and not :source on this script"<bar>finish
silent! delcommand UTPlay
silent! delcommand UTIgnore
endfunction
"------------------------------------------------------------------------
" # callbacks {{{2
function! lh#UT#callback_set_SNR(SNR)
call s:errors.set_current_SNR(a:SNR)
endfunction
" # Main function {{{2
function! lh#UT#run(bang,...)
" 1- clear the errors table
let must_keep = a:bang == "!"
if ! must_keep
call s:errors.clear()
endif
try
" 2- define commands
call s:DefineCommands()
" 3- run every test
let rtp = '.,'.&rtp
let files = []
for file in a:000
let lFile = lh#path#glob_as_list(rtp, file)
if len(lFile) > 0
call add(files, lFile[0])
endif
endfor
for file in files
call s:RunOneFile(file)
endfor
finally
call s:UnDefineCommands()
call s:errors.display()
endtry
" 3- Open the quickfix
endfunction
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:
" VIM: let g:UTfiles='tests/lh/UT*.vim'

View File

@ -0,0 +1,68 @@
"=============================================================================
" $Id: be.vim 193 2010-05-17 23:10:03Z luc.hermitte $
" File: autoload/should/be.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://hermitte.free.fr/vim/>
" Version: 0.0.3
" Created: 23rd Feb 2009
" Last Update: $Date: 2010-05-17 19:10:03 -0400 (Mon, 17 May 2010) $
"------------------------------------------------------------------------
" Description:
" UT & tAssert API
"
"------------------------------------------------------------------------
" Installation:
" Drop this file into {rtp}/autoload/should
" History:
"
" TODO: «missing features»
" }}}1
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
" ## Functions {{{1
" # Debug {{{2
function! should#be#verbose(level)
let s:verbose = a:level
endfunction
function! s:Verbose(expr)
if exists('s:verbose') && s:verbose
echomsg a:expr
endif
endfunction
function! should#be#debug(expr)
return eval(a:expr)
endfunction
" # Convinience functions for tAssert/UT {{{2
function! should#be#list(var)
return type(a:var) == type([])
endfunction
function! should#be#number(var)
return type(a:var) == type(42)
endfunction
function! should#be#string(var)
return type(a:var) == type('')
endfunction
function! should#be#dict(var)
return type(a:var) == type({})
endfunction
function! should#be#float(var)
return type(a:var) == type(0.1)
endfunction
function! should#be#funcref(var)
return type(a:var) == type(function('exists'))
endfunction
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

165
tests/bundled/ut/doc/UT.txt Normal file
View File

@ -0,0 +1,165 @@
*UT.txt* Unit Testing Framework for Vim (v0.0.3)
For Vim version 7+. Last change: $Date: 2010-05-17 19:10:03 -0400 (Mon, 17 May 2010) $
By Luc Hermitte
hermitte {at} free {dot} fr
------------------------------------------------------------------------------
CONTENTS *UT-contents* {{{1
|UT-presentation| Presentation
|UT-usage| Usage
|UT-API| UT API
|UT-examples| Examples
|UT-todo| Bugs to fix and futur enhancements to come
|UT-design| Design choices
|UT-others| Other tests related plugins for vim
|add-local-help| Instructions on installing this file
------------------------------------------------------------------------------
PRESENTATION *UT-presentation* {{{1
UT is another Test Unit Framework for Vim, which main particularity is to fill
the |quickfix| window with the assertion failures.
Features~
- Assertion failures are reported in the |quickfix| window
- Assertion syntax is simple, check Tom Link's suite, it's the same
- Supports banged ":Assert!" to stop processing a given test on failed
assertions
- All the |s:Test()| functions of a suite are executed (almost)
independently (i.e., a critical ":Assert!" failure will stop the Test of
the function, and |lh#UT| will proceed to the next |s:Test()| function
- Lightweight and simple to use: there is only one command defined, all the
other definitions are kept in an autoload plugin.
- A suite == a file
- Several |s:Test()| functions per suite
- +optional |s:Setup()|, |s:Teardown()|
- Supports |:Comments|
- |local-function|s, |script-variable|s, and |local-variable|s are supported
- Takes advantage of |BuildToolsWrapper|'s |:Copen| command if installed
- Counts successful tests and not successful assertions
- Short-cuts to run the Unit Tests associated to a given vim script; Relies
on: |Let-Modeline|, |local_vimrc|/|project.vim| to set |g:UTfiles| (space
separated list of glob-able paths), and on |lhvl#path|.
- Command to exclude, or specify the tests to play => |:UTPlay|, |UTIgnore|
Requirements~
This suite requires Vim 7.1 and |lh-vim-lib| v2.2.0+.
------------------------------------------------------------------------------
USAGE *UT-usage* {{{1
First, create a new vim script, it will be a Unit Testing Suite.
*:UTSuite*
One of the first lines must contain >
UTSuite Some intelligible name for the suite
<
*:Assert*
Then you are free to directly assert anything you wish as long as it is a
valid vim |expression|, e.g. >
Assert 1 > 2
Assert 1 > 0
Assert s:foo > s:Bar(g:var + 28) / strlen("foobar")
or to define as many independent tests as you wish.
*:Comment*
Comments may be added to the |quickfix| report thanks to the |:Comment|
fake command.
*s:Test()*
A test is a function with a name starting with |s:Test|. Even if a test
critically fails, the next test will be executed, e.g. >
function s:Test1()
let var = SomeFucntion()
Assert! type(var) == type(0)
Assert var < 42
Assert! var > 0
" Some other code that won't be executed if the previous assertion failed
let i = var / 42.0
Comment This comment may never be displayed if {var} is negative or not a number
endfunction
function s:Test2()
Assert s:what != Ever()
endfunction
<
*s:Setup()* *s:Teardown()*
If you wish to see a set-up function executed before each test, define the
|s:Setup()| function.
If you wish to see a clean-up function executed after each test, define the
|s:Teardown()| function.
*:UTRun*
Finally run |:UTRun| on your test script (filename), and ... debug your failed
assertions from the |quickfix| window.
------------------------------------------------------------------------------
UT API *UT-API* {{{1
*should#be#dict()* returns whether the parameter is a |Dictionary|
*should#be#float()* returns whether the parameter is a |float|
*should#be#funcref()* returns whether the parameter is a |Funcref|
*should#be#list()* returns whether the parameter is a |List|
*should#be#number()* returns whether the parameter is a |expr-number|
*should#be#string()* returns whether the parameter is a |expr-string|
------------------------------------------------------------------------------
EXAMPLES *UT-examples* {{{1
See:
- {rtp}/tests/lh/UT.vim tests/lh/UT.vim for a classical test,
- {rtp}/tests/lh/UT-fixtures.vim tests/lh/UT-fixtures.vim for a test with
fixtures.
------------------------------------------------------------------------------
TO DO *UT-todo* {{{1
- Add |'efm'| for VimL errors like the one produced by >
:Assert 0 + [0]
- Check UT works fine under windows (where paths have spaces, etc), and on
UTF-8 files
- Simplify "s:errors" functions
- Merge with Tom Link's tAssert plugin? (the UI is quite different)
- |:AssertEquals| that shows the name of both expressions and their values as
well -- a correct distinction of both parameters will be tricky with regexes
; using functions will loose either the name, or the value in case of
local/script variables use ; we need macros /à la C/...
- Support Embedded comments like for instance: >
Assert 1 == 1 " 1 must value 1
- Ways to test buffers produced
- Always execute |s:Teardown()| -- move its call to a |:finally| bloc
- Find a way to prevent the potential script scope pollution
------------------------------------------------------------------------------
DESIGN CHOICES *UT-design* {{{1
The assertions supported by this plugin are expected to be made in a Unit
Testing file, they are not to be used in regular VimL scripts as a /Design by
Contract/ tool. Check Thomas Link's plugin, it is much more suited for that
kind of assertions.
In order to be able to produce the |quickfix| entries, the plugin first parses
the Unit Test file to complete all |:Assert| occurrences with extra
information about the line number where the assertion is made.
------------------------------------------------------------------------------
OTHER TESTS RELATED PLUGINS FOR VIM *UT-others* {{{1
You may also want to have a look at:
- Tom Link's |tAssert| plugin
http://www.vim.org/scripts/script.php?script_id=1730
- Staale Flock's |vimUnit| plugin
http://www.vim.org/scripts/script.php?script_id=1125
- Meikel Brandmeyer's |vimTAP| plugin
http://www.vim.org/scripts/script.php?script_id=2213
------------------------------------------------------------------------------
© Luc Hermitte, 2010, http://code.google.com/p/lh-vim/
$Id: UT.txt 193 2010-05-17 23:10:03Z luc.hermitte $
VIM: let b:VS_language = 'american'
vim:ts=8:sw=4:tw=80:fo=tcq2:isk=!-~,^*,^\|,^\":ft=help:fdm=marker:

View File

@ -0,0 +1,67 @@
"=============================================================================
" $Id: vim_UT.vim 193 2010-05-17 23:10:03Z luc.hermitte $
" File: ftplugin/vim/vim_UT.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
let s:k_version = 003
" Version: 0.0.3
" Created: 20th Feb 2009
" Last Update: $Date: 2010-05-17 19:10:03 -0400 (Mon, 17 May 2010) $
"------------------------------------------------------------------------
" Description: Yet Another Unit Testing Framework for Vim
" - Defines <F7> as :UTRun {targets=g:UTfiles}
"
"------------------------------------------------------------------------
" Installation: «install details»
" History: «history»
" TODO: «missing features»
" }}}1
"=============================================================================
" Buffer-local Definitions {{{1
" Avoid local reinclusion {{{2
if &cp || (exists("b:loaded_ftplug_vim_UT") && !exists('g:force_reload_ftplug_vim_UT'))
finish
endif
let b:loaded_ftplug_vim_UT = s:k_version
let s:cpo_save=&cpo
set cpo&vim
" Avoid local reinclusion }}}2
"------------------------------------------------------------------------
" Local mappings {{{2
nnoremap <buffer> <silent> <Plug>UTMake :call <sid>UTMake()<cr>
let s:key = lh#option#get('UTMake_key', '<F7>')
exe 'imap <buffer> '.s:key.' <c-\><c-n><Plug>UTMake'
exe 'vmap <buffer> '.s:key.' <c-\><c-n><Plug>UTMake'
exe 'nmap <buffer> '.s:key.' <Plug>UTMake'
"=============================================================================
" Global Definitions {{{1
" Avoid global reinclusion {{{2
if &cp || (exists("g:loaded_ftplug_vim_UT") && !exists('g:force_reload_ftplug_vim_UT'))
let &cpo=s:cpo_save
finish
endif
let g:loaded_ftplug_vim_UT = s:k_version
" Avoid global reinclusion }}}2
"------------------------------------------------------------------------
" Functions {{{2
function! s:UTMake()
let files = lh#option#get('UTfiles', '%')
echo 'update|source '.expand('%').'|UTRun '.files
update
so%
exe 'UTRun '.files
endfunction
" Functions }}}2
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:
" VIM: let g:UTfiles='tests/lh/UT*.vim'

View File

@ -0,0 +1,32 @@
"=============================================================================
" $Id: mk-UT.vim 194 2010-05-17 23:26:14Z luc.hermitte $
" File: mk-UT.vim
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://hermitte.free.fr/vim/>
" Version: 0.0.3
let s:version = '0.0.3'
" Created: 19th Feb 2009
" Last Update: $Date: 2010-05-17 19:26:14 -0400 (Mon, 17 May 2010) $
"------------------------------------------------------------------------
cd <sfile>:p:h
try
let save_rtp = &rtp
let &rtp = expand('<sfile>:p:h:h').','.&rtp
exe '22,$MkVimball! UT-'.s:version
set modifiable
set buftype=
finally
let &rtp = save_rtp
endtry
finish
UT.README
autoload/lh/UT.vim
autoload/should.vim
autoload/should/be.vim
doc/UT.txt
ftplugin/vim/vim_UT.vim
mkVba/mk-UT.vim
plugin/UT.vim
tests/lh/UT-fixtures.vim
tests/lh/UT.vim
tests/lh/assert.vim

View File

@ -0,0 +1,48 @@
"=============================================================================
" $Id: UT.vim 193 2010-05-17 23:10:03Z luc.hermitte $
" File: plugin/UT.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://code.google.com/p/lh-vim/>
let s:k_version = 003
" Version: 0.0.3
" Created: 11th Feb 2009
" Last Update: $Date: 2010-05-17 19:10:03 -0400 (Mon, 17 May 2010) $
"------------------------------------------------------------------------
" Description: Yet Another Unit Testing Framework for Vim
"
"------------------------------------------------------------------------
" Installation:
" Drop the file into {rtp}/plugin/lh/
" History:
" Strongly inspired by Tom Link's tAssert
" TODO: «missing features»
" }}}1
"=============================================================================
" Avoid global reinclusion {{{1
if &cp || (exists("g:loaded_UT") && !exists('g:force_reload_UT'))
finish
endif
let g:loaded_UT = s:k_version
let s:cpo_save=&cpo
set cpo&vim
" Avoid global reinclusion }}}1
"------------------------------------------------------------------------
" Commands and Mappings {{{1
" Real commands (used to call UT files)
"command! UTRun {filenames}
command! -bang -nargs=+ -complete=file UTRun :call lh#UT#run("<bang>",<f-args>)
" Fake commands (used in UT files)
"command UTSuite {expression} [#{comments}]
command! -nargs=* UTSuite :echoerr "Use :UTRun and not :source on this script"<bar>finish
"command Assert {expression} [#{comments}]
" Commands and Mappings }}}1
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:
" VIM: let g:UTfiles='tests/lh/UT*.vim'

View File

@ -0,0 +1,58 @@
"=============================================================================
" $Id: UT-fixtures.vim 193 2010-05-17 23:10:03Z luc.hermitte $
" File: tests/lh/UT-fixtures.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://hermitte.free.fr/vim/>
" Version: 0.0.1
" Created: 11th Feb 2009
" Last Update: $Date: 2010-05-17 19:10:03 -0400 (Mon, 17 May 2010) $
"------------------------------------------------------------------------
" Description: UnitTests for the UT plugin.
" - Test fixtures
"
"------------------------------------------------------------------------
" Installation: «install details»
" History: «history»
" TODO: «missing features»
" }}}1
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
UTSuite [lh#UT] Testing fixtures
let s:v1 = 0
let s:v2 = 0
function! s:Setup()
Assert! exists('s:v1')
Assert! exists('s:v2')
let s:v1 += 1
let s:v2 += 1
endfunction
function! s:Teardown()
let s:v1 = 0
endfunction
function! s:TestSetup()
Comment "First test weither s:v1 and g:v2 are set to 1"
" Assert0 s:v1 == 1
Assert s:v1 == 1
Assert s:v2 == 1
endfunction
function! s:TestTeardown()
Comment "Second test weither only s:v1 is incremented, while g:v2 is set to 1"
Assert s:v1 == 1
Assert s:v2 == 2
endfunction
" UTPlay TestTeardown
UTIgnore TestTeardown
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

View File

@ -0,0 +1,73 @@
"=============================================================================
" $Id: UT.vim 193 2010-05-17 23:10:03Z luc.hermitte $
" File: tests/lh/UT.vim {{{1
" Author: Luc Hermitte <EMAIL:hermitte {at} free {dot} fr>
" <URL:http://hermitte.free.fr/vim/>
" Version: 0.0.1
" Created: 11th Feb 2009
" Last Update: $Date: 2010-05-17 19:10:03 -0400 (Mon, 17 May 2010) $
"------------------------------------------------------------------------
" Description: UnitTests for the UT plugin.
" - Tests global assertions
" - Tests assertions definied in tests (functions s:Test)
"
"------------------------------------------------------------------------
" Installation: «install details»
" History: «history»
" TODO: «missing features»
" }}}1
"=============================================================================
let s:cpo_save=&cpo
set cpo&vim
"------------------------------------------------------------------------
UTSuite [lh#UT] Testing global and local assertions
Assert 1 == 1
Assert 1 != 42
Assert 1 < 20
Assert 1 > 20
let st = "string"
Assert st =~ 'str'
Assert st !~ 'str'
Assert st == 'str'
Assert st != 'str'
Assert st == 0
" Assert 0 + [0]
function! s:One()
return 1
endfunction
Assert s:One() == 1
"------------------------------------------------------------------------
function! s:TestOK()
Comment "TestOK"
Assert! 1 == 1
Assert 1 == 1
Assert repeat('1', 5) == '11111'
Assert! repeat('1', 5) == '11111'
endfunction
"------------------------------------------------------------------------
function! s:TestCriticalNOK()
Comment "TestCriticalNOK"
Assert! 1 == 0
Assert repeat('1', 5) == '1111'
endfunction
"------------------------------------------------------------------------
function! s:TestNOK()
Comment "TestNOK"
Assert 0 == 1
Assert repeat('1', 5) == '1111'
endfunction
function! s:Foo()
endfunction
"------------------------------------------------------------------------
"------------------------------------------------------------------------
let &cpo=s:cpo_save
"=============================================================================
" vim600: set fdm=marker:

5
tests/run-tests.sh Executable file
View File

@ -0,0 +1,5 @@
#!/usr/bin/env bash
set -e
vim -u vimrc_test -c ":UTRun $1"

131
tests/test-toggle.vim Normal file
View File

@ -0,0 +1,131 @@
let s:cpo_save=&cpo
set cpo&vim
UTSuite [Gundo] Testing Toggling
function! s:Setup()"{{{
exec 'edit test'
exec bufwinnr(bufnr('test')) . 'wincmd w'
endfunction"}}}
function! s:Teardown()"{{{
if bufwinnr(bufnr('__Gundo__')) != -1
exec bufwinnr(bufnr('__Gundo__')) . 'wincmd w'
quit
endif
if bufwinnr(bufnr('__Gundo_Preview__')) != -1
exec bufwinnr(bufnr('__Gundo_Preview__')) . 'wincmd w'
quit
endif
if bufnr('__Gundo__') != -1
exec 'bwipeout ' . bufnr('__Gundo__')
endif
if bufnr('__Gundo_Preview__') != -1
exec 'bwipeout ' . bufnr('__Gundo_Preview__')
endif
if bufnr('test') != -1
exec 'bwipeout ' . bufnr('test')
endif
if bufnr('test2') != -1
exec 'bwipeout ' . bufnr('test2')
endif
endfunction"}}}
function! s:Goto(buffername)"{{{
exec bufwinnr(bufnr(a:buffername)) . 'wincmd w'
endfunction"}}}
function! s:TestToggleBasic()"{{{
" Make sure we're starting from scratch.
Assert bufnr('__Gundo__') == -1
Assert bufnr('__Gundo_Preview__') == -1
Assert bufwinnr(bufnr('__Gundo__')) == -1
Assert bufwinnr(bufnr('__Gundo_Preview__')) == -1
" Open Gundo
GundoToggle
" Buffers and windows should exist.
Assert bufnr('__Gundo__') != -1
Assert bufnr('__Gundo_Preview__') != -1
Assert bufwinnr(bufnr('__Gundo__')) != -1
Assert bufwinnr(bufnr('__Gundo_Preview__')) != -1
" We should be in the Gundo pane.
Assert expand('%') == '__Gundo__'
" Close Gundo
GundoToggle
" Windows should have been closed, but buffers should remain.
Assert bufnr('__Gundo__') != -1
Assert bufnr('__Gundo_Preview__') != -1
Assert bufwinnr(bufnr('__Gundo__')) == -1
Assert bufwinnr(bufnr('__Gundo_Preview__')) == -1
endfunction"}}}
function! s:TestToggleWhenMoved()"{{{
" Make sure we're starting from scratch.
Assert bufnr('__Gundo__') == -1
Assert bufnr('__Gundo_Preview__') == -1
Assert bufwinnr(bufnr('__Gundo__')) == -1
Assert bufwinnr(bufnr('__Gundo_Preview__')) == -1
" Open Gundo
GundoToggle
call s:Goto('test')
Assert expand('%') == 'test'
" Close Gundo
GundoToggle
" Windows should have been closed, but buffers should remain.
Assert bufnr('__Gundo__') != -1
Assert bufnr('__Gundo_Preview__') != -1
Assert bufwinnr(bufnr('__Gundo__')) == -1
Assert bufwinnr(bufnr('__Gundo_Preview__')) == -1
" Open Gundo
GundoToggle
call s:Goto('__Gundo_Preview__')
Assert expand('%') == '__Gundo_Preview__'
" Close Gundo
GundoToggle
" Windows should have been closed, but buffers should remain.
Assert bufnr('__Gundo__') != -1
Assert bufnr('__Gundo_Preview__') != -1
Assert bufwinnr(bufnr('__Gundo__')) == -1
Assert bufwinnr(bufnr('__Gundo_Preview__')) == -1
endfunction"}}}
function! s:TestToggleReturnToTarget()"{{{
" Make sure we're starting from scratch.
Assert bufnr('__Gundo__') == -1
Assert bufnr('__Gundo_Preview__') == -1
Assert bufwinnr(bufnr('__Gundo__')) == -1
Assert bufwinnr(bufnr('__Gundo_Preview__')) == -1
exec 'new test2'
call s:Goto('test')
" Toggle Gundo
GundoToggle
GundoToggle
" We should be returned to test
Assert expand('%') == 'test'
" Move to test2
call s:Goto('test2')
" Toggle Gundo
GundoToggle
GundoToggle
" We should be returned to test2
Assert expand('%') == 'test2'
endfunction"}}}
let &cpo=s:cpo_save

1
tests/vim_test/autoload/lh Symbolic link
View File

@ -0,0 +1 @@
/Users/sjl/src/gundo.vim/tests/bundled/lh-vim-lib/autoload/lh

View File

@ -0,0 +1,108 @@
" Vim color file
" Maintainer: Hans Fugal <hans@fugal.net>
" Last Change: $Date: 2004/06/13 19:30:30 $
" Last Change: $Date: 2004/06/13 19:30:30 $
" URL: http://hans.fugal.net/vim/colors/desert.vim
" Version: $Id: desert.vim,v 1.1 2004/06/13 19:30:30 vimboss Exp $
" cool help screens
" :he group-name
" :he highlight-groups
" :he cterm-colors
set background=dark
if version > 580
" no guarantees for version 5.8 and below, but this makes it stop
" complaining
hi clear
if exists("syntax_on")
syntax reset
endif
endif
let g:colors_name="desert"
hi Normal guifg=White guibg=grey20
" highlight groups
hi Cursor guibg=khaki guifg=slategrey
"hi CursorIM
"hi Directory
"hi DiffAdd
"hi DiffChange
"hi DiffDelete
"hi DiffText
"hi ErrorMsg
hi VertSplit guibg=#c2bfa5 guifg=grey50 gui=none
hi Folded guibg=grey30 guifg=gold
hi FoldColumn guibg=grey30 guifg=tan
hi IncSearch guifg=slategrey guibg=khaki
"hi LineNr
hi ModeMsg guifg=goldenrod
hi MoreMsg guifg=SeaGreen
hi NonText guifg=LightBlue guibg=grey30
hi Question guifg=springgreen
hi Search guibg=peru guifg=wheat
hi SpecialKey guifg=yellowgreen
hi StatusLine guibg=#c2bfa5 guifg=black gui=none
hi StatusLineNC guibg=#c2bfa5 guifg=grey50 gui=none
hi Title guifg=indianred
hi Visual gui=none guifg=khaki guibg=olivedrab
"hi VisualNOS
hi WarningMsg guifg=salmon
"hi WildMenu
"hi Menu
"hi Scrollbar
"hi Tooltip
" syntax highlighting groups
hi Comment guifg=SkyBlue
hi Constant guifg=#ffa0a0
hi Identifier guifg=palegreen
hi Statement guifg=khaki
hi PreProc guifg=indianred
hi Type guifg=darkkhaki
hi Special guifg=navajowhite
"hi Underlined
hi Ignore guifg=grey40
"hi Error
hi Todo guifg=orangered guibg=yellow2
" color terminal definitions
hi SpecialKey ctermfg=darkgreen
hi NonText cterm=bold ctermfg=darkblue
hi Directory ctermfg=darkcyan
hi ErrorMsg cterm=bold ctermfg=7 ctermbg=1
hi IncSearch cterm=NONE ctermfg=yellow ctermbg=green
hi Search cterm=NONE ctermfg=grey ctermbg=blue
hi MoreMsg ctermfg=darkgreen
hi ModeMsg cterm=NONE ctermfg=brown
hi LineNr ctermfg=3
hi Question ctermfg=green
hi StatusLine cterm=bold,reverse
hi StatusLineNC cterm=reverse
hi VertSplit cterm=reverse
hi Title ctermfg=5
hi Visual cterm=reverse
hi VisualNOS cterm=bold,underline
hi WarningMsg ctermfg=1
hi WildMenu ctermfg=0 ctermbg=3
hi Folded ctermfg=darkgrey ctermbg=NONE
hi FoldColumn ctermfg=darkgrey ctermbg=NONE
hi DiffAdd ctermbg=4
hi DiffChange ctermbg=5
hi DiffDelete cterm=bold ctermfg=4 ctermbg=6
hi DiffText cterm=bold ctermbg=1
hi Comment ctermfg=darkcyan
hi Constant ctermfg=brown
hi Special ctermfg=5
hi Identifier ctermfg=6
hi Statement ctermfg=3
hi PreProc ctermfg=5
hi Type ctermfg=2
hi Underlined cterm=underline ctermfg=5
hi Ignore cterm=bold ctermfg=7
hi Ignore ctermfg=darkgrey
hi Error cterm=bold ctermfg=7 ctermbg=1
"vim: sw=4

1
tests/vim_test/ftplugin/vim Symbolic link
View File

@ -0,0 +1 @@
/Users/sjl/src/gundo.vim/tests/bundled/ut/ftplugin/vim

View File

@ -0,0 +1 @@
/Users/sjl/src/gundo.vim/tests/bundled/lh-vim-lib/macros/menu-map.vim

View File

@ -0,0 +1 @@
/Users/sjl/src/gundo.vim/tests/bundled/ut/plugin/UT.vim

View File

@ -0,0 +1 @@
/Users/sjl/src/gundo.vim/plugin/gundo.vim

View File

@ -0,0 +1 @@
/Users/sjl/src/gundo.vim/tests/bundled/lh-vim-lib/plugin/let.vim

View File

@ -0,0 +1 @@
/Users/sjl/src/gundo.vim/tests/bundled/lh-vim-lib/plugin/lhvl.vim

View File

@ -0,0 +1 @@
/Users/sjl/src/gundo.vim/tests/bundled/lh-vim-lib/plugin/ui-functions.vim

View File

@ -0,0 +1 @@
/Users/sjl/src/gundo.vim/tests/bundled/lh-vim-lib/plugin/words_tools.vim

5
tests/vimrc_test Normal file
View File

@ -0,0 +1,5 @@
set nocompatible
set runtimepath=vim_test
filetype plugin on
nnoremap q :qa!<cr>
color desert