[Assorted-commits] SF.net SVN: assorted:[1481] configs/trunk/src/vim
Brought to you by:
yangzhang
From: <yan...@us...> - 2009-10-12 02:21:46
|
Revision: 1481 http://assorted.svn.sourceforge.net/assorted/?rev=1481&view=rev Author: yangzhang Date: 2009-10-12 02:21:32 +0000 (Mon, 12 Oct 2009) Log Message: ----------- tweaks to make things work again under windows; using new ir_black color scheme Modified Paths: -------------- configs/trunk/src/vim/plugin/_yang.vim configs/trunk/src/vim/plugin/mru.vim Added Paths: ----------- configs/trunk/src/vim/colors/ir_black.vim Added: configs/trunk/src/vim/colors/ir_black.vim =================================================================== --- configs/trunk/src/vim/colors/ir_black.vim (rev 0) +++ configs/trunk/src/vim/colors/ir_black.vim 2009-10-12 02:21:32 UTC (rev 1481) @@ -0,0 +1,212 @@ +" ir_black color scheme +" More at: http://blog.infinitered.com/entries/show/8 + + +" ******************************************************************************** +" Standard colors used in all ir_black themes: +" Note, x:x:x are RGB values +" +" normal: #f6f3e8 +" +" string: #A8FF60 168:255:96 +" string inner (punc, code, etc): #00A0A0 0:160:160 +" number: #FF73FD 255:115:253 +" comments: #7C7C7C 124:124:124 +" keywords: #96CBFE 150:203:254 +" operators: white +" class: #FFFFB6 255:255:182 +" method declaration name: #FFD2A7 255:210:167 +" regular expression: #E9C062 233:192:98 +" regexp alternate: #FF8000 255:128:0 +" regexp alternate 2: #B18A3D 177:138:61 +" variable: #C6C5FE 198:197:254 +" +" Misc colors: +" red color (used for whatever): #FF6C60 255:108:96 +" light red: #FFB6B0 255:182:176 +" +" brown: #E18964 good for special +" +" lightpurpleish: #FFCCFF +" +" Interface colors: +" background color: black +" cursor (where underscore is used): #FFA560 255:165:96 +" cursor (where block is used): white +" visual selection: #1D1E2C +" current line: #151515 21:21:21 +" search selection: #07281C 7:40:28 +" line number: #3D3D3D 61:61:61 + + +" ******************************************************************************** +" The following are the preferred 16 colors for your terminal +" Colors Bright Colors +" Black #4E4E4E #7C7C7C +" Red #FF6C60 #FFB6B0 +" Green #A8FF60 #CEFFAB +" Yellow #FFFFB6 #FFFFCB +" Blue #96CBFE #FFFFCB +" Magenta #FF73FD #FF9CFE +" Cyan #C6C5FE #DFDFFE +" White #EEEEEE #FFFFFF + + +" ******************************************************************************** +set background=dark +hi clear + +if exists("syntax_on") + syntax reset +endif + +let colors_name = "ir_black" + + +"hi Example guifg=NONE guibg=NONE gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE + +" General colors +hi Normal guifg=#f6f3e8 guibg=black gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi NonText guifg=#070707 guibg=black gui=NONE ctermfg=black ctermbg=NONE cterm=NONE + +hi Cursor guifg=black guibg=white gui=NONE ctermfg=black ctermbg=white cterm=reverse +hi LineNr guifg=#3D3D3D guibg=black gui=NONE ctermfg=darkgray ctermbg=NONE cterm=NONE + +hi VertSplit guifg=#202020 guibg=#202020 gui=NONE ctermfg=darkgray ctermbg=darkgray cterm=NONE +hi StatusLine guifg=#CCCCCC guibg=#202020 gui=italic ctermfg=white ctermbg=darkgray cterm=NONE +hi StatusLineNC guifg=black guibg=#202020 gui=NONE ctermfg=blue ctermbg=darkgray cterm=NONE + +hi Folded guifg=#a0a8b0 guibg=#384048 gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE +hi Title guifg=#f6f3e8 guibg=NONE gui=bold ctermfg=NONE ctermbg=NONE cterm=NONE +hi Visual guifg=NONE guibg=#262D51 gui=NONE ctermfg=NONE ctermbg=darkgray cterm=NONE + +hi SpecialKey guifg=#808080 guibg=#343434 gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE + +hi WildMenu guifg=green guibg=yellow gui=NONE ctermfg=black ctermbg=yellow cterm=NONE +hi PmenuSbar guifg=black guibg=white gui=NONE ctermfg=black ctermbg=white cterm=NONE +"hi Ignore guifg=gray guibg=black gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE + +hi Error guifg=NONE guibg=NONE gui=undercurl ctermfg=white ctermbg=red cterm=NONE guisp=#FF6C60 " undercurl color +hi ErrorMsg guifg=white guibg=#FF6C60 gui=BOLD ctermfg=white ctermbg=red cterm=NONE +hi WarningMsg guifg=white guibg=#FF6C60 gui=BOLD ctermfg=white ctermbg=red cterm=NONE + +" Message displayed in lower left, such as --INSERT-- +hi ModeMsg guifg=black guibg=#C6C5FE gui=BOLD ctermfg=black ctermbg=cyan cterm=BOLD + +if version >= 700 " Vim 7.x specific colors + hi CursorLine guifg=NONE guibg=#121212 gui=NONE ctermfg=NONE ctermbg=NONE cterm=BOLD + hi CursorColumn guifg=NONE guibg=#121212 gui=NONE ctermfg=NONE ctermbg=NONE cterm=BOLD + hi MatchParen guifg=#f6f3e8 guibg=#857b6f gui=BOLD ctermfg=white ctermbg=darkgray cterm=NONE + hi Pmenu guifg=#f6f3e8 guibg=#444444 gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE + hi PmenuSel guifg=#000000 guibg=#cae682 gui=NONE ctermfg=NONE ctermbg=NONE cterm=NONE + hi Search guifg=NONE guibg=NONE gui=underline ctermfg=NONE ctermbg=NONE cterm=underline +endif + +" Syntax highlighting +hi Comment guifg=#7C7C7C guibg=NONE gui=NONE ctermfg=darkgray ctermbg=NONE cterm=NONE +hi String guifg=#A8FF60 guibg=NONE gui=NONE ctermfg=green ctermbg=NONE cterm=NONE +hi Number guifg=#FF73FD guibg=NONE gui=NONE ctermfg=magenta ctermbg=NONE cterm=NONE + +hi Keyword guifg=#96CBFE guibg=NONE gui=NONE ctermfg=blue ctermbg=NONE cterm=NONE +hi PreProc guifg=#96CBFE guibg=NONE gui=NONE ctermfg=blue ctermbg=NONE cterm=NONE +hi Conditional guifg=#6699CC guibg=NONE gui=NONE ctermfg=blue ctermbg=NONE cterm=NONE " if else end + +hi Todo guifg=#8f8f8f guibg=NONE gui=NONE ctermfg=red ctermbg=NONE cterm=NONE +hi Constant guifg=#99CC99 guibg=NONE gui=NONE ctermfg=cyan ctermbg=NONE cterm=NONE + +hi Identifier guifg=#C6C5FE guibg=NONE gui=NONE ctermfg=cyan ctermbg=NONE cterm=NONE +hi Function guifg=#FFD2A7 guibg=NONE gui=NONE ctermfg=brown ctermbg=NONE cterm=NONE +hi Type guifg=#FFFFB6 guibg=NONE gui=NONE ctermfg=yellow ctermbg=NONE cterm=NONE +hi Statement guifg=#6699CC guibg=NONE gui=NONE ctermfg=lightblue ctermbg=NONE cterm=NONE + +hi Special guifg=#E18964 guibg=NONE gui=NONE ctermfg=white ctermbg=NONE cterm=NONE +hi Delimiter guifg=#00A0A0 guibg=NONE gui=NONE ctermfg=cyan ctermbg=NONE cterm=NONE +hi Operator guifg=white guibg=NONE gui=NONE ctermfg=white ctermbg=NONE cterm=NONE + +hi link Character Constant +hi link Boolean Constant +hi link Float Number +hi link Repeat Statement +hi link Label Statement +hi link Exception Statement +hi link Include PreProc +hi link Define PreProc +hi link Macro PreProc +hi link PreCondit PreProc +hi link StorageClass Type +hi link Structure Type +hi link Typedef Type +hi link Tag Special +hi link SpecialChar Special +hi link SpecialComment Special +hi link Debug Special + + +" Special for Ruby +hi rubyRegexp guifg=#B18A3D guibg=NONE gui=NONE ctermfg=brown ctermbg=NONE cterm=NONE +hi rubyRegexpDelimiter guifg=#FF8000 guibg=NONE gui=NONE ctermfg=brown ctermbg=NONE cterm=NONE +hi rubyEscape guifg=white guibg=NONE gui=NONE ctermfg=cyan ctermbg=NONE cterm=NONE +hi rubyInterpolationDelimiter guifg=#00A0A0 guibg=NONE gui=NONE ctermfg=blue ctermbg=NONE cterm=NONE +hi rubyControl guifg=#6699CC guibg=NONE gui=NONE ctermfg=blue ctermbg=NONE cterm=NONE "and break, etc +"hi rubyGlobalVariable guifg=#FFCCFF guibg=NONE gui=NONE ctermfg=lightblue ctermbg=NONE cterm=NONE "yield +hi rubyStringDelimiter guifg=#336633 guibg=NONE gui=NONE ctermfg=lightgreen ctermbg=NONE cterm=NONE +"rubyInclude +"rubySharpBang +"rubyAccess +"rubyPredefinedVariable +"rubyBoolean +"rubyClassVariable +"rubyBeginEnd +"rubyRepeatModifier +"hi link rubyArrayDelimiter Special " [ , , ] +"rubyCurlyBlock { , , } + +hi link rubyClass Keyword +hi link rubyModule Keyword +hi link rubyKeyword Keyword +hi link rubyOperator Operator +hi link rubyIdentifier Identifier +hi link rubyInstanceVariable Identifier +hi link rubyGlobalVariable Identifier +hi link rubyClassVariable Identifier +hi link rubyConstant Type + + +" Special for Java +" hi link javaClassDecl Type +hi link javaScopeDecl Identifier +hi link javaCommentTitle javaDocSeeTag +hi link javaDocTags javaDocSeeTag +hi link javaDocParam javaDocSeeTag +hi link javaDocSeeTagParam javaDocSeeTag + +hi javaDocSeeTag guifg=#CCCCCC guibg=NONE gui=NONE ctermfg=darkgray ctermbg=NONE cterm=NONE +hi javaDocSeeTag guifg=#CCCCCC guibg=NONE gui=NONE ctermfg=darkgray ctermbg=NONE cterm=NONE +"hi javaClassDecl guifg=#CCFFCC guibg=NONE gui=NONE ctermfg=white ctermbg=NONE cterm=NONE + + +" Special for XML +hi link xmlTag Keyword +hi link xmlTagName Conditional +hi link xmlEndTag Identifier + + +" Special for HTML +hi link htmlTag Keyword +hi link htmlTagName Conditional +hi link htmlEndTag Identifier + + +" Special for Javascript +hi link javaScriptNumber Number + + +" Special for Python +"hi link pythonEscape Keyword + + +" Special for CSharp +hi link csXmlTag Keyword + + +" Special for PHP Modified: configs/trunk/src/vim/plugin/_yang.vim =================================================================== --- configs/trunk/src/vim/plugin/_yang.vim 2009-10-10 03:37:41 UTC (rev 1480) +++ configs/trunk/src/vim/plugin/_yang.vim 2009-10-12 02:21:32 UTC (rev 1481) @@ -70,7 +70,9 @@ " XXX This doesn't work for setting options on the triggering buffer. " XXX This is highly insecure; should only allow the same things allowed in modelines. -autocmd BufNewFile,BufRead * if glob(ProjectDir() . "/.project.vim") !~ "^$" | execute "source " . ProjectDir() . "/.project.vim" | endif +if system("uname") =~ ".*Linux.*" " TODO fix this so cygwin is also accepted + autocmd BufNewFile,BufRead * if glob(ProjectDir() . "/.project.vim") !~ "^$" | execute "source " . ProjectDir() . "/.project.vim" | endif +endif @@ -108,7 +110,7 @@ set sp=>& " guifont " TODO fix the zoom resulting zoom issue (when specifying backup fonts) - set gfn=Bitstream_Vera_Sans_Mono:h14,Andale_Mono:h11 + set gfn=Consolas "set gfn=Lucida_Console:h8:cANSI " guifont "set gfn=Lucida_Console:h11 " guifont else @@ -138,7 +140,7 @@ hi User4 guibg=#000000 guifg=LightBlue gui=bold hi LineNr guibg=grey30 -colorscheme desert +colorscheme ir_black " desert syntax enable " set number " number lines Modified: configs/trunk/src/vim/plugin/mru.vim =================================================================== --- configs/trunk/src/vim/plugin/mru.vim 2009-10-10 03:37:41 UTC (rev 1480) +++ configs/trunk/src/vim/plugin/mru.vim 2009-10-12 02:21:32 UTC (rev 1481) @@ -1,7 +1,7 @@ " File: mru.vim " Author: Yegappan Lakshmanan (yegappan AT yahoo DOT com) -" Version: 3.1 -" Last Modified: February 17, 2008 +" Version: 3.2 +" Last Modified: September 22, 2008 " " Overview " -------- @@ -47,10 +47,10 @@ " " Usage " ----- -" You can use the ":MRU" command to list all the most recently edited file -" names. The file names will be listed in a temporary Vim window. If the MRU -" window is already opened, then the MRU list displayed in the window will be -" refreshed. +" To list and edit files from the MRU list, you have to use the ":MRU" +" command. The ":MRU" command displays the MRU file list in a temporary Vim +" window. If the MRU window is already opened, then the MRU list displayed in +" the window is refreshed. " " If you are using GUI Vim, then the names of the recently edited files are " added to the "File->Recent Files" menu. You can select the name of a file @@ -99,11 +99,11 @@ " plugin. Set the following variables in your .vimrc file using the 'let' " command. " -" The list of recently edit file names is stored in the file specified by the +" The list of recently edited file names is stored in the file specified by the " MRU_File variable. The default setting for this variable is -" $HOME/.vim_mru_files for Unix systems and $VIM/_vim_mru_files for non-Unix -" systems. You can change this variable to point to a file by adding the -" following line to the .vimrc file: +" $HOME/.vim_mru_files for Unix-like systems and $USERPROFILE/_vim_mru_files +" for MS-Windows systems. You can change this variable to point to a file by +" adding the following line to the .vimrc file: " " let MRU_File = 'd:\myhome\_vim_mru_files' " @@ -126,6 +126,16 @@ " " The specified pattern should be a Vim regular expression pattern. " +" If you want to add only file names matching a set of patterns to the MRU +" list, then you can set the MRU_Include_Files variable. This variable should +" be set to a Vim regular expression pattern. For example, to add only .c and +" .h files to the MRU list, you can set this variable as below: +" +" let MRU_Include_Files = '\.c$\|\.h$' +" +" By default, MRU_Include_Files is set to an empty string and all the edited +" filenames are added to the MRU list. +" " The default height of the MRU window is 8. You can set the MRU_Window_Height " variable to change the window height. " @@ -177,6 +187,11 @@ let MRU_Exclude_Files = '' endif +" Files to include in the MRU list +if !exists('MRU_Include_Files') + let MRU_Include_Files = '' +endif + " Height of the MRU window " Default height is 8 if !exists('MRU_Window_Height') @@ -192,10 +207,16 @@ endif if !exists('MRU_File') - if has('unix') - let MRU_File = $HOME . "/.vim_mru_files" + if has('unix') || has('macunix') + let MRU_File = $HOME . '/.vim_mru_files' else - let MRU_File = $VIM . "/_vim_mru_files" + let MRU_File = $VIM . '/_vim_mru_files' + if has('win32') + " MS-Windows + if $USERPROFILE != '' + let MRU_File = $USERPROFILE . '\_vim_mru_files' + endif + endif endif endif @@ -204,19 +225,26 @@ let MRU_Add_Menu = 1 endif +" Control to temporarily lock the MRU list. Used to prevent files from +" getting added to the MRU list when the ':vimgrep' command is executed. +let s:mru_list_locked = 0 + " MRU_LoadList " Load the latest MRU file list from the MRU file function! s:MRU_LoadList() " Read the list from the MRU file. if filereadable(g:MRU_File) let s:MRU_files = readfile(g:MRU_File) - if s:MRU_files[0] =~# '^" Most recently edited files in Vim' - " Generated by the previous version of the MRU plugin. Ignore the - " list + if s:MRU_files[0] =~# '^\s*" Most recently edited files in Vim' + " Generated by the previous version of the MRU plugin. + " Discard the list. let s:MRU_files = [] elseif s:MRU_files[0] =~# '^#' " Remove the comment line call remove(s:MRU_files, 0) + else + " Unsupported format + let s:MRU_files = [] endif else let s:MRU_files = [] @@ -238,6 +266,11 @@ " MRU_AddFile " Add a file to the MRU file list function! s:MRU_AddFile(acmd_bufnr) + if s:mru_list_locked + " MRU list is currently locked + return + endif + " Get the full path to the filename let fname = fnamemodify(bufname(a:acmd_bufnr + 0), ':p') if fname == '' @@ -249,16 +282,24 @@ return endif + if g:MRU_Include_Files != '' + " If MRU_Include_Files is set, include only files matching the + " specified pattern + if fname !~# g:MRU_Include_Files + return + endif + endif + if g:MRU_Exclude_Files != '' " Do not add files matching the pattern specified in the " MRU_Exclude_Files to the MRU list - if fname =~? g:MRU_Exclude_Files + if fname =~# g:MRU_Exclude_Files return endif endif - " If the filename is already present in the MRU list, then move - " it to the beginning of the list + " If the filename is not already present in the MRU list and is not + " readable then ignore it let idx = index(s:MRU_files, fname) if idx == -1 if !filereadable(fname) @@ -276,7 +317,7 @@ " Add the new file list to the beginning of the updated old file list call insert(s:MRU_files, fname, 0) - " Return the trimmed list + " Trim the list if len(s:MRU_files) > g:MRU_Max_Entries call remove(s:MRU_files, g:MRU_Max_Entries, -1) endif @@ -299,12 +340,23 @@ endif endfunction +" Special characters in file names that should be escaped (for security +" reasons) +let s:esc_filename_chars = ' *?[{`$%#"|!<>();&' . "'\t\n" +function! s:MRU_escape_filename(fname) + return escape(a:fname, s:esc_filename_chars) +endfunction + " MRU_Edit_File " Edit the specified file -function! s:MRU_Edit_File(filename) - let fname = escape(a:filename, ' %#"') +function! s:MRU_Edit_File(filename, sanitized) + if !a:sanitized + let esc_fname = s:MRU_escape_filename(a:filename) + else + let esc_fname = a:filename + endif " If the file is already open in one of the windows, jump to it - let winnum = bufwinnr('^' . fname . '$') + let winnum = bufwinnr('^' . a:filename . '$') if winnum != -1 if winnum != winnr() exe winnum . 'wincmd w' @@ -313,9 +365,9 @@ if &modified || &buftype != '' || &previewwindow " Current buffer has unsaved changes or is a special buffer or is " the preview window. So open the file in a new window - exe 'split ' . fname + exe 'split ' . esc_fname else - exe 'edit ' . fname + exe 'edit ' . esc_fname endif endif endfunction @@ -332,11 +384,11 @@ return endif - let fname = escape(fname, ' %#"') + let esc_fname = s:MRU_escape_filename(fname) if a:win_opt == 'newwin' " Edit the file in a new window - exe 'leftabove new ' . fname + exe 'leftabove new ' . esc_fname if g:MRU_Auto_Close == 1 && g:MRU_Use_Current_Window == 0 " Go back to the MRU window and close it @@ -375,7 +427,7 @@ exe 'tabnext ' . i else " Open a new tab as the last tab page - exe '999tabnew ' . fname + exe '999tabnew ' . esc_fname endif endif @@ -427,9 +479,9 @@ if &modified || &buftype != '' || &previewwindow " Current buffer has unsaved changes or is a special buffer or " is the preview window. So open the file in a new window - exe 'split ' . fname + exe 'split ' . esc_fname else - exe 'edit ' . fname + exe 'edit ' . esc_fname endif endif endif @@ -546,11 +598,17 @@ silent! 0put =s:MRU_files else " Display only the entries matching the specified pattern - silent! 0put =filter(copy(s:MRU_files), 'v:val =~? a:1') + " First try using it as a literal pattern + let m = filter(copy(s:MRU_files), 'stridx(v:val, a:1) != -1') + if len(m) == 0 + " No match. Try using it as a regular expression + let m = filter(copy(s:MRU_files), 'v:val =~# a:1') + endif + silent! 0put =m endif " Move the cursor to the beginning of the file - exe 1 + normal! gg setlocal nomodifiable endfunction @@ -588,8 +646,21 @@ " filenames containing the string. If only one filename is found, " then edit it. let m = filter(copy(s:MRU_files), 'stridx(v:val, a:pat) != -1') - if len(m) == 1 - call s:MRU_Edit_File(m[0]) + if len(m) > 0 + if len(m) == 1 + call s:MRU_Edit_File(m[0], 0) + return + endif + + " More than one file matches. Try find an accurate match + let new_m = filter(m, 'v:val ==# a:pat') + if len(new_m) == 1 + call s:MRU_Edit_File(new_m[0], 0) + return + endif + + " Couldn't find an exact match, open the MRU window + call s:MRU_Open_Window(a:pat) return endif @@ -605,7 +676,7 @@ endif if len(m) == 1 - call s:MRU_Edit_File(m[0]) + call s:MRU_Edit_File(m[0], 0) return endif @@ -615,7 +686,9 @@ function! s:MRU_add_files_to_menu(prefix, file_list) for fname in a:file_list " Escape special characters in the filename - let esc_fname = escape(fnamemodify(fname, ':t'), ". \\|\t%#") + let esc_fname = escape(fnamemodify(fname, ':t'), ".\\" . + \ s:esc_filename_chars) + let esc_fname = substitute(esc_fname, '&', '&&', 'g') " Truncate the directory name if it is long let dir_name = fnamemodify(fname, ':h') @@ -627,11 +700,15 @@ \ '...' . \ strpart(dir_name, len - 20) endif - let esc_dir_name = escape(dir_name, ". \\|\t") + let esc_dir_name = escape(dir_name, ".\\" . s:esc_filename_chars) + let esc_dir_name = substitute(esc_dir_name, '&', '&&', 'g') - exe 'anoremenu <silent> &File.Recent\ Files.' . a:prefix . esc_fname . - \ '\ (' . esc_dir_name . ')' . - \ " :call <SID>MRU_Edit_File('" . fname . "')<CR>" + let menu_path = '&File.Recent\ Files.' . a:prefix . esc_fname . + \ '\ (' . esc_dir_name . ')' + let esc_mfname = s:MRU_escape_filename(fname) + exe 'anoremenu <silent> ' . menu_path . + \ " :call <SID>MRU_Edit_File('" . esc_mfname . "', 1)<CR>" + exe 'tmenu ' . menu_path . ' Edit file ' . esc_mfname endfor endfunction @@ -658,11 +735,14 @@ anoremenu <silent> &File.Recent\ Files.Refresh\ list \ :call <SID>MRU_LoadList()<CR> + exe 'tmenu File.Recent\ Files.Refresh\ list Reload the MRU file list from ' + \ . s:MRU_escape_filename(g:MRU_File) anoremenu File.Recent\ Files.-SEP1- : " Add the filenames in the MRU list to the menu let entry_cnt = len(s:MRU_files) if entry_cnt > 10 + " Split the MRU menu into sub-menus for start_idx in range(0, entry_cnt, 10) let last_idx = start_idx + 9 if last_idx >= entry_cnt @@ -692,6 +772,12 @@ autocmd BufNewFile * call s:MRU_AddFile(expand('<abuf>')) autocmd BufWritePost * call s:MRU_AddFile(expand('<abuf>')) +" The ':vimgrep' command adds all the files searched to the buffer list. +" This also modifies the MRU list, even though the user didn't edit the +" files. Use the following autocmds to prevent this. +autocmd QuickFixCmdPre *vimgrep* let s:mru_list_locked = 1 +autocmd QuickFixCmdPost *vimgrep* let s:mru_list_locked = 0 + " Command to open the MRU window command! -nargs=? -complete=customlist,s:MRU_Complete MRU \ call s:MRU_Cmd(<q-args>) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |