annotate .vim/plugin/filebrowser.vim @ 3:19d1235ce229

More stigg.
author samer
date Sun, 18 Jan 2015 18:35:47 +0000
parents
children
rev   line source
samer@3 1 " filebrowser.vim: utility file for vim 6.2+
samer@3 2 "
samer@3 3 " Copyright: Srinath Avadhanula <srinath AT fastmail DOT fm>
samer@3 4 " Parts of this file are taken from explorer.vim which is a plugin file
samer@3 5 " distributed with vim under the Vim charityware license.
samer@3 6 " License: distributed under the Vim charityware license.
samer@3 7 "
samer@3 8 " Settings:
samer@3 9 " FB_CallBackFunction: the function name which gets called when the user
samer@3 10 " presses <cr> on a file-name in the file browser.
samer@3 11 " FB_AllowRegexp: A filename has to match this regexp to be displayed.
samer@3 12 " FB_RejectRegexp: If a filename matches this regexp, then its not displayed.
samer@3 13 " (Both these regexps are '' by default which means no filtering is
samer@3 14 " done).
samer@3 15
samer@3 16 " line continuation used here.
samer@3 17 let s:save_cpo = &cpo
samer@3 18 set cpo&vim
samer@3 19
samer@3 20 "======================================================================
samer@3 21 " Globally visible functions (API)
samer@3 22 "======================================================================
samer@3 23 " FB_OpenFileBrowser: opens a new buffer and displays the file list {{{
samer@3 24 " Description:
samer@3 25 function! FB_OpenFileBrowser(dir)
samer@3 26 if !isdirectory(a:dir)
samer@3 27 return
samer@3 28 endif
samer@3 29 if exists('s:FB_BufferNumber')
samer@3 30 if bufwinnr(s:FB_BufferNumber) != -1
samer@3 31 execute bufwinnr(s:FB_BufferNumber).' wincmd w'
samer@3 32 return
samer@3 33 endif
samer@3 34 execute 'aboveleft split #'.s:FB_BufferNumber
samer@3 35 else
samer@3 36 aboveleft split __Choose_File__
samer@3 37 let s:FB_BufferNumber = bufnr('%')
samer@3 38 endif
samer@3 39 call FB_DisplayFiles(a:dir)
samer@3 40 endfunction " }}}
samer@3 41 " FB_DisplayFiles: displays the files in a given directory {{{
samer@3 42 " Description:
samer@3 43 " Call this function only when the cursor is in a temporary buffer
samer@3 44 function! FB_DisplayFiles(dir)
samer@3 45 if !isdirectory(a:dir)
samer@3 46 return
samer@3 47 endif
samer@3 48 call s:FB_SetSilentSettings()
samer@3 49 " make this a "scratch" buffer
samer@3 50 call s:FB_SetScratchSettings()
samer@3 51
samer@3 52 let allowRegexp = s:FB_GetVar('FB_AllowRegexp', '')
samer@3 53 let rejectRegexp = s:FB_GetVar('FB_RejectRegexp', '')
samer@3 54
samer@3 55 " change to the directory to make processing simpler.
samer@3 56 execute "lcd ".a:dir
samer@3 57 " delete everything in the buffer.
samer@3 58 " IMPORTANT: we need to be in a scratch buffer
samer@3 59 0,$ d_
samer@3 60
samer@3 61 let allFilenames = glob('*')
samer@3 62 let dispFiles = ""
samer@3 63 let subDirs = "../\n"
samer@3 64
samer@3 65 let allFilenames = allFilenames."\n"
samer@3 66 let start = 0
samer@3 67 while 1
samer@3 68 let next = stridx(allFilenames, "\n", start)
samer@3 69 let filename = strpart(allFilenames, start, next-start)
samer@3 70 if filename == ""
samer@3 71 break
samer@3 72 endif
samer@3 73
samer@3 74 if isdirectory(filename)
samer@3 75 let subDirs = subDirs.filename."/\n"
samer@3 76 else
samer@3 77 if allowRegexp != '' && filename !~ allowRegexp
samer@3 78 elseif rejectRegexp != '' && filename =~ rejectRegexp
samer@3 79 else
samer@3 80 let dispFiles = dispFiles.filename."\n"
samer@3 81 endif
samer@3 82 endif
samer@3 83
samer@3 84 let start = next + 1
samer@3 85 endwhile
samer@3 86
samer@3 87 0put!=dispFiles
samer@3 88 0put!=subDirs
samer@3 89 " delte the last empty line resulting from the put
samer@3 90 $ d_
samer@3 91
samer@3 92 call s:FB_SetHighlighting()
samer@3 93 call s:FB_DisplayHelp()
samer@3 94 call s:FB_SetMaps()
samer@3 95
samer@3 96 " goto the first file/directory
samer@3 97 0
samer@3 98 call search('^"=', 'w')
samer@3 99 normal! j:<bs>
samer@3 100
samer@3 101 set nomodified nomodifiable
samer@3 102
samer@3 103 call s:FB_ResetSilentSettings()
samer@3 104 endfunction " }}}
samer@3 105 " FB_SetVar: sets script local variables from outside this script {{{
samer@3 106 " Description:
samer@3 107 function! FB_SetVar(varname, value)
samer@3 108 let s:{a:varname} = a:value
samer@3 109 endfunction " }}}
samer@3 110
samer@3 111 " ==============================================================================
samer@3 112 " Script local functions below this
samer@3 113 " ==============================================================================
samer@3 114 " FB_SetHighlighting: sets syntax highlighting for the buffer {{{
samer@3 115 " Description:
samer@3 116 " Origin: from explorer.vim in vim
samer@3 117 function! <SID>FB_SetHighlighting()
samer@3 118 " Set up syntax highlighting
samer@3 119 " Something wrong with the evaluation of the conditional though...
samer@3 120 if has("syntax") && exists("g:syntax_on") && !has("syntax_items")
samer@3 121 syn match browseSynopsis "^\"[ -].*"
samer@3 122 syn match browseDirectory "[^\"].*/ "
samer@3 123 syn match browseDirectory "[^\"].*/$"
samer@3 124 syn match browseCurDir "^\"= .*$"
samer@3 125 syn match browseSortBy "^\" Sorted by .*$" contains=browseSuffixInfo
samer@3 126 syn match browseSuffixInfo "(.*)$" contained
samer@3 127 syn match browseFilter "^\" Not Showing:.*$"
samer@3 128 syn match browseFiletime "«\d\+$"
samer@3 129
samer@3 130 "hi def link browseSynopsis PreProc
samer@3 131 hi def link browseSynopsis Special
samer@3 132 hi def link browseDirectory Directory
samer@3 133 hi def link browseCurDir Statement
samer@3 134 hi def link browseSortBy String
samer@3 135 hi def link browseSuffixInfo Type
samer@3 136 hi def link browseFilter String
samer@3 137 hi def link browseFiletime Ignore
samer@3 138 hi def link browseSuffixes Type
samer@3 139 endif
samer@3 140 endfunction " }}}
samer@3 141 " FB_SetMaps: sets buffer local maps {{{
samer@3 142 " Description:
samer@3 143 function! <SID>FB_SetMaps()
samer@3 144 nnoremap <buffer> <silent> q :bdelete<cr>
samer@3 145 nnoremap <buffer> <silent> C :call FB_DisplayFiles(getcwd())<CR>
samer@3 146 nnoremap <buffer> <silent> <esc> :bdelete<cr>
samer@3 147 nnoremap <buffer> <silent> <CR> :call <SID>FB_EditEntry()<CR>
samer@3 148 nnoremap <buffer> <silent> ? :call <SID>FB_ToggleHelp()<CR>
samer@3 149
samer@3 150 " lock the user in this window
samer@3 151 nnoremap <buffer> <C-w> <nop>
samer@3 152 endfunction " }}}
samer@3 153 " FB_SetSilentSettings: some settings which make things silent {{{
samer@3 154 " Description:
samer@3 155 " Origin: from explorer.vim distributed with vim.
samer@3 156 function! <SID>FB_SetSilentSettings()
samer@3 157 let s:save_report=&report
samer@3 158 let s:save_showcmd = &sc
samer@3 159 set report=10000 noshowcmd
samer@3 160 endfunction
samer@3 161 " FB_ResetSilentSettings: reset settings set by FB_SetSilentSettings
samer@3 162 " Description:
samer@3 163 function! <SID>FB_ResetSilentSettings()
samer@3 164 let &report=s:save_report
samer@3 165 let &showcmd = s:save_showcmd
samer@3 166 endfunction " }}}
samer@3 167 " FB_SetScratchSettings: makes the present buffer a scratch buffer {{{
samer@3 168 " Description:
samer@3 169 function! <SID>FB_SetScratchSettings()
samer@3 170 " Turn off the swapfile, set the buffer type so that it won't get
samer@3 171 " written, and so that it will get deleted when it gets hidden.
samer@3 172 setlocal noreadonly modifiable
samer@3 173 setlocal noswapfile
samer@3 174 setlocal buftype=nowrite
samer@3 175 setlocal bufhidden=delete
samer@3 176 " Don't wrap around long lines
samer@3 177 setlocal nowrap
samer@3 178 endfunction
samer@3 179
samer@3 180 " }}}
samer@3 181 " FB_ToggleHelp: toggles verbosity of help {{{
samer@3 182 " Description:
samer@3 183 function! <SID>FB_ToggleHelp()
samer@3 184 let s:FB_VerboseHelp = 1 - s:FB_GetVar('FB_VerboseHelp', 0)
samer@3 185
samer@3 186 call FB_DisplayFiles('.')
samer@3 187 endfunction " }}}
samer@3 188 " FB_DisplayHelp: displays a helpful header {{{
samer@3 189 " Description:
samer@3 190 function! <SID>FB_DisplayHelp()
samer@3 191 let verboseHelp = s:FB_GetVar('FB_VerboseHelp', 0)
samer@3 192 if verboseHelp
samer@3 193 let txt =
samer@3 194 \ "\" <cr>: on file, choose the file and quit\n"
samer@3 195 \ ."\" on dir, enter directory\n"
samer@3 196 \ ."\" q/<esc>: quit without choosing\n"
samer@3 197 \ ."\" C: change directory to getcwd()\n"
samer@3 198 \ ."\" ?: toggle help verbosity\n"
samer@3 199 \ ."\"= ".getcwd()
samer@3 200 else
samer@3 201 let txt = "\" ?: toggle help verbosity\n"
samer@3 202 \ ."\"= ".getcwd()
samer@3 203 endif
samer@3 204 0put!=txt
samer@3 205 endfunction " }}}
samer@3 206 " FB_EditEntry: handles the user pressing <enter> on a line {{{
samer@3 207 " Description:
samer@3 208 function! <SID>FB_EditEntry()
samer@3 209 let line = getline('.')
samer@3 210
samer@3 211 if isdirectory(line)
samer@3 212 call FB_DisplayFiles(line)
samer@3 213 endif
samer@3 214
samer@3 215 " If the user has a call back function defined on choosing a file, handle
samer@3 216 " it.
samer@3 217 let cbf = s:FB_GetVar('FB_CallBackFunction', '')
samer@3 218 if cbf != '' && line !~ '^" ' && filereadable(line)
samer@3 219 let fname = fnamemodify(line, ':p')
samer@3 220 bdelete
samer@3 221
samer@3 222 let arguments = s:FB_GetVar('FB_CallBackFunctionArgs', '')
samer@3 223 if arguments != ''
samer@3 224 let arguments = ','.arguments
samer@3 225 endif
samer@3 226 call Tex_Debug('arguments = '.arguments, 'fb')
samer@3 227 call Tex_Debug("call ".cbf."('".fname."'".arguments.')', 'fb')
samer@3 228 exec "call ".cbf."('".fname."'".arguments.')'
samer@3 229 endif
samer@3 230 endfunction " }}}
samer@3 231 " FB_GetVar: gets the most local value of a variable {{{
samer@3 232 function! <SID>FB_GetVar(name, default)
samer@3 233 if exists('s:'.a:name)
samer@3 234 return s:{a:name}
samer@3 235 elseif exists('w:'.a:name)
samer@3 236 return w:{a:name}
samer@3 237 elseif exists('b:'.a:name)
samer@3 238 return b:{a:name}
samer@3 239 elseif exists('g:'.a:name)
samer@3 240 return g:{a:name}
samer@3 241 else
samer@3 242 return a:default
samer@3 243 endif
samer@3 244 endfunction
samer@3 245
samer@3 246 " }}}
samer@3 247
samer@3 248 let &cpo = s:save_cpo
samer@3 249
samer@3 250 " vim:fdm=marker:ff=unix:noet:ts=4:sw=4:nowrap