samer@3: " filebrowser.vim: utility file for vim 6.2+ samer@3: " samer@3: " Copyright: Srinath Avadhanula samer@3: " Parts of this file are taken from explorer.vim which is a plugin file samer@3: " distributed with vim under the Vim charityware license. samer@3: " License: distributed under the Vim charityware license. samer@3: " samer@3: " Settings: samer@3: " FB_CallBackFunction: the function name which gets called when the user samer@3: " presses on a file-name in the file browser. samer@3: " FB_AllowRegexp: A filename has to match this regexp to be displayed. samer@3: " FB_RejectRegexp: If a filename matches this regexp, then its not displayed. samer@3: " (Both these regexps are '' by default which means no filtering is samer@3: " done). samer@3: samer@3: " line continuation used here. samer@3: let s:save_cpo = &cpo samer@3: set cpo&vim samer@3: samer@3: "====================================================================== samer@3: " Globally visible functions (API) samer@3: "====================================================================== samer@3: " FB_OpenFileBrowser: opens a new buffer and displays the file list {{{ samer@3: " Description: samer@3: function! FB_OpenFileBrowser(dir) samer@3: if !isdirectory(a:dir) samer@3: return samer@3: endif samer@3: if exists('s:FB_BufferNumber') samer@3: if bufwinnr(s:FB_BufferNumber) != -1 samer@3: execute bufwinnr(s:FB_BufferNumber).' wincmd w' samer@3: return samer@3: endif samer@3: execute 'aboveleft split #'.s:FB_BufferNumber samer@3: else samer@3: aboveleft split __Choose_File__ samer@3: let s:FB_BufferNumber = bufnr('%') samer@3: endif samer@3: call FB_DisplayFiles(a:dir) samer@3: endfunction " }}} samer@3: " FB_DisplayFiles: displays the files in a given directory {{{ samer@3: " Description: samer@3: " Call this function only when the cursor is in a temporary buffer samer@3: function! FB_DisplayFiles(dir) samer@3: if !isdirectory(a:dir) samer@3: return samer@3: endif samer@3: call s:FB_SetSilentSettings() samer@3: " make this a "scratch" buffer samer@3: call s:FB_SetScratchSettings() samer@3: samer@3: let allowRegexp = s:FB_GetVar('FB_AllowRegexp', '') samer@3: let rejectRegexp = s:FB_GetVar('FB_RejectRegexp', '') samer@3: samer@3: " change to the directory to make processing simpler. samer@3: execute "lcd ".a:dir samer@3: " delete everything in the buffer. samer@3: " IMPORTANT: we need to be in a scratch buffer samer@3: 0,$ d_ samer@3: samer@3: let allFilenames = glob('*') samer@3: let dispFiles = "" samer@3: let subDirs = "../\n" samer@3: samer@3: let allFilenames = allFilenames."\n" samer@3: let start = 0 samer@3: while 1 samer@3: let next = stridx(allFilenames, "\n", start) samer@3: let filename = strpart(allFilenames, start, next-start) samer@3: if filename == "" samer@3: break samer@3: endif samer@3: samer@3: if isdirectory(filename) samer@3: let subDirs = subDirs.filename."/\n" samer@3: else samer@3: if allowRegexp != '' && filename !~ allowRegexp samer@3: elseif rejectRegexp != '' && filename =~ rejectRegexp samer@3: else samer@3: let dispFiles = dispFiles.filename."\n" samer@3: endif samer@3: endif samer@3: samer@3: let start = next + 1 samer@3: endwhile samer@3: samer@3: 0put!=dispFiles samer@3: 0put!=subDirs samer@3: " delte the last empty line resulting from the put samer@3: $ d_ samer@3: samer@3: call s:FB_SetHighlighting() samer@3: call s:FB_DisplayHelp() samer@3: call s:FB_SetMaps() samer@3: samer@3: " goto the first file/directory samer@3: 0 samer@3: call search('^"=', 'w') samer@3: normal! j: samer@3: samer@3: set nomodified nomodifiable samer@3: samer@3: call s:FB_ResetSilentSettings() samer@3: endfunction " }}} samer@3: " FB_SetVar: sets script local variables from outside this script {{{ samer@3: " Description: samer@3: function! FB_SetVar(varname, value) samer@3: let s:{a:varname} = a:value samer@3: endfunction " }}} samer@3: samer@3: " ============================================================================== samer@3: " Script local functions below this samer@3: " ============================================================================== samer@3: " FB_SetHighlighting: sets syntax highlighting for the buffer {{{ samer@3: " Description: samer@3: " Origin: from explorer.vim in vim samer@3: function! FB_SetHighlighting() samer@3: " Set up syntax highlighting samer@3: " Something wrong with the evaluation of the conditional though... samer@3: if has("syntax") && exists("g:syntax_on") && !has("syntax_items") samer@3: syn match browseSynopsis "^\"[ -].*" samer@3: syn match browseDirectory "[^\"].*/ " samer@3: syn match browseDirectory "[^\"].*/$" samer@3: syn match browseCurDir "^\"= .*$" samer@3: syn match browseSortBy "^\" Sorted by .*$" contains=browseSuffixInfo samer@3: syn match browseSuffixInfo "(.*)$" contained samer@3: syn match browseFilter "^\" Not Showing:.*$" samer@3: syn match browseFiletime "«\d\+$" samer@3: samer@3: "hi def link browseSynopsis PreProc samer@3: hi def link browseSynopsis Special samer@3: hi def link browseDirectory Directory samer@3: hi def link browseCurDir Statement samer@3: hi def link browseSortBy String samer@3: hi def link browseSuffixInfo Type samer@3: hi def link browseFilter String samer@3: hi def link browseFiletime Ignore samer@3: hi def link browseSuffixes Type samer@3: endif samer@3: endfunction " }}} samer@3: " FB_SetMaps: sets buffer local maps {{{ samer@3: " Description: samer@3: function! FB_SetMaps() samer@3: nnoremap q :bdelete samer@3: nnoremap C :call FB_DisplayFiles(getcwd()) samer@3: nnoremap :bdelete samer@3: nnoremap :call FB_EditEntry() samer@3: nnoremap ? :call FB_ToggleHelp() samer@3: samer@3: " lock the user in this window samer@3: nnoremap samer@3: endfunction " }}} samer@3: " FB_SetSilentSettings: some settings which make things silent {{{ samer@3: " Description: samer@3: " Origin: from explorer.vim distributed with vim. samer@3: function! FB_SetSilentSettings() samer@3: let s:save_report=&report samer@3: let s:save_showcmd = &sc samer@3: set report=10000 noshowcmd samer@3: endfunction samer@3: " FB_ResetSilentSettings: reset settings set by FB_SetSilentSettings samer@3: " Description: samer@3: function! FB_ResetSilentSettings() samer@3: let &report=s:save_report samer@3: let &showcmd = s:save_showcmd samer@3: endfunction " }}} samer@3: " FB_SetScratchSettings: makes the present buffer a scratch buffer {{{ samer@3: " Description: samer@3: function! FB_SetScratchSettings() samer@3: " Turn off the swapfile, set the buffer type so that it won't get samer@3: " written, and so that it will get deleted when it gets hidden. samer@3: setlocal noreadonly modifiable samer@3: setlocal noswapfile samer@3: setlocal buftype=nowrite samer@3: setlocal bufhidden=delete samer@3: " Don't wrap around long lines samer@3: setlocal nowrap samer@3: endfunction samer@3: samer@3: " }}} samer@3: " FB_ToggleHelp: toggles verbosity of help {{{ samer@3: " Description: samer@3: function! FB_ToggleHelp() samer@3: let s:FB_VerboseHelp = 1 - s:FB_GetVar('FB_VerboseHelp', 0) samer@3: samer@3: call FB_DisplayFiles('.') samer@3: endfunction " }}} samer@3: " FB_DisplayHelp: displays a helpful header {{{ samer@3: " Description: samer@3: function! FB_DisplayHelp() samer@3: let verboseHelp = s:FB_GetVar('FB_VerboseHelp', 0) samer@3: if verboseHelp samer@3: let txt = samer@3: \ "\" : on file, choose the file and quit\n" samer@3: \ ."\" on dir, enter directory\n" samer@3: \ ."\" q/: quit without choosing\n" samer@3: \ ."\" C: change directory to getcwd()\n" samer@3: \ ."\" ?: toggle help verbosity\n" samer@3: \ ."\"= ".getcwd() samer@3: else samer@3: let txt = "\" ?: toggle help verbosity\n" samer@3: \ ."\"= ".getcwd() samer@3: endif samer@3: 0put!=txt samer@3: endfunction " }}} samer@3: " FB_EditEntry: handles the user pressing on a line {{{ samer@3: " Description: samer@3: function! FB_EditEntry() samer@3: let line = getline('.') samer@3: samer@3: if isdirectory(line) samer@3: call FB_DisplayFiles(line) samer@3: endif samer@3: samer@3: " If the user has a call back function defined on choosing a file, handle samer@3: " it. samer@3: let cbf = s:FB_GetVar('FB_CallBackFunction', '') samer@3: if cbf != '' && line !~ '^" ' && filereadable(line) samer@3: let fname = fnamemodify(line, ':p') samer@3: bdelete samer@3: samer@3: let arguments = s:FB_GetVar('FB_CallBackFunctionArgs', '') samer@3: if arguments != '' samer@3: let arguments = ','.arguments samer@3: endif samer@3: call Tex_Debug('arguments = '.arguments, 'fb') samer@3: call Tex_Debug("call ".cbf."('".fname."'".arguments.')', 'fb') samer@3: exec "call ".cbf."('".fname."'".arguments.')' samer@3: endif samer@3: endfunction " }}} samer@3: " FB_GetVar: gets the most local value of a variable {{{ samer@3: function! FB_GetVar(name, default) samer@3: if exists('s:'.a:name) samer@3: return s:{a:name} samer@3: elseif exists('w:'.a:name) samer@3: return w:{a:name} samer@3: elseif exists('b:'.a:name) samer@3: return b:{a:name} samer@3: elseif exists('g:'.a:name) samer@3: return g:{a:name} samer@3: else samer@3: return a:default samer@3: endif samer@3: endfunction samer@3: samer@3: " }}} samer@3: samer@3: let &cpo = s:save_cpo samer@3: samer@3: " vim:fdm=marker:ff=unix:noet:ts=4:sw=4:nowrap