Commits

Takeshi NISHIDA committed 1158c11

Added g:fuf_dataDir option

Comments (0)

Files changed (10)

   if !empty(lines)
     return lines
   endif
-  try
-    return readfile(expand(a:file))
-  catch /.*/ 
-  endtry
-  return []
+  return l9#readFile(a:file)
 endfunction
 
 "
 
 "
 function fuf#defineKeyMappingInHandler(key, func)
-    " hacks to be able to use feedkeys().
-    execute printf(
-          \ 'inoremap <buffer> <silent> %s <C-r>=fuf#getRunningHandler().%s ? "" : ""<CR>',
-          \ a:key, a:func)
+  " hacks to be able to use feedkeys().
+  execute printf(
+        \ 'inoremap <buffer> <silent> %s <C-r>=fuf#getRunningHandler().%s ? "" : ""<CR>',
+        \ a:key, a:func)
 endfunction
 
 "
     return
   endif
   let s:runningHandler = fuf#{a:modeName}#createHandler(copy(s:handlerBase))
-  let s:runningHandler.info = fuf#loadInfoFile(s:runningHandler.getModeName())
+  let s:runningHandler.stats = fuf#loadStats(s:runningHandler.getModeName())
   let s:runningHandler.partialMatching = a:partialMatching
   let s:runningHandler.bufNrPrev = bufnr('%')
   let s:runningHandler.lastCol = -1
 endfunction
 
 "
-function fuf#loadInfoFile(modeName)
-  try
-    let lines = readfile(expand(g:fuf_infoFile))
-    " compatibility check
-    if count(lines, s:INFO_FILE_VERSION_LINE) == 0
-      call s:warnOldInfoFile()
-      let g:fuf_infoFile = ''
-      throw 1
-    endif
-  catch /.*/ 
-    let lines = []
-  endtry
-  let s:lastInfoMap = s:deserializeInfoMap(lines)
-  if !exists('s:lastInfoMap[a:modeName]')
-    let s:lastInfoMap[a:modeName] = {}
+function fuf#loadDataLines(pathSuffixes)
+  if !s:dataFileAvailable
+    return []
   endif
-  return extend(s:lastInfoMap[a:modeName], { 'data': [], 'stats': [] }, 'keep')
+  return l9#readFile(l9#concatPaths([g:fuf_dataDir] + a:pathSuffixes))
 endfunction
 
-" if a:modeName is empty, a:info is treated as a map of information
-function fuf#saveInfoFile(modeName, info)
-  if empty(a:modeName)
-    let s:lastInfoMap = a:info
-  else
-    let s:lastInfoMap[a:modeName] = a:info
+" 
+function fuf#saveDataLines(pathSuffixes, lines)
+  if !s:dataFileAvailable
+    return
   endif
-  let lines = [ s:INFO_FILE_VERSION_LINE ] + s:serializeInfoMap(s:lastInfoMap)
-  try
-    call writefile(lines, expand(g:fuf_infoFile))
-  catch /.*/ 
-  endtry
+  call l9#writeFile(a:lines, l9#concatPaths([g:fuf_dataDir] + a:pathSuffixes))
+endfunction
+
+"
+function fuf#loadItems(modeName)
+  let lines = fuf#loadDataLines([a:modeName, 'items'])
+  return map(lines, 'eval(v:val)')
+endfunction
+
+" 
+function fuf#saveItems(modeName, items)
+  let lines = map(copy(a:items), 'string(v:val)')
+  call fuf#saveDataLines([a:modeName, 'items'], lines)
+endfunction
+
+"
+function fuf#loadStats(modeName)
+  let lines = fuf#loadDataLines([a:modeName, 'stats'])
+  return map(lines, 'eval(v:val)')
+endfunction
+
+" 
+function fuf#saveStats(modeName, stats)
+  let lines = map(copy(a:stats), 'string(v:val)')
+  call fuf#saveDataLines([a:modeName, 'stats'], lines)
 endfunction
 
 "
 function fuf#editInfoFile()
-  let lines = readfile(expand(g:fuf_infoFile))
-  call l9#tempbuffer#open('[fuf-info]', 'vim', lines, 0, 0, 0, 1,
-        \                 s:infoBufferListener)
+  "TODO
+  throw 'TODO'
+  "let lines = l9#readFile(g:fuf_infoFile)
+  "call l9#tempbuffer#open('[fuf-info]', 'vim', lines, 0, 0, 0, 1,
+  "      \                 s:infoBufferListener)
 endfunction
 
 " 
 "=============================================================================
 " LOCAL FUNCTIONS/VARIABLES {{{1
 
-let s:INFO_FILE_VERSION_LINE = "VERSION\t300"
 let s:TEMP_VARIABLES_GROUP = "FuzzyFinder"
 let s:ABBR_SNIP_MASK = '...'
 let s:OPEN_TYPE_CURRENT = 1
   let pairL = fuf#splitPath(patternL)
   if g:fuf_splitPathMatching
     let matches = [
-        \     ['v:val.wordForPrimaryHead', pairL.head],
-        \     ['v:val.wordForPrimaryTail', pairL.tail],
-        \   ]
+          \     ['v:val.wordForPrimaryHead', pairL.head],
+          \     ['v:val.wordForPrimaryTail', pairL.tail],
+          \   ]
   else
     let matches = [
           \     ['v:val.wordForPrimaryHead . v:val.wordForPrimaryTail', patternL],
 
 "
 function s:toLowerForIgnoringCase(str)
-    return (g:fuf_ignoreCase ? tolower(a:str) : a:str)
+  return (g:fuf_ignoreCase ? tolower(a:str) : a:str)
 endfunction
 
 "
   call l9#tempbuffer#close(s:FUF_BUF_NAME)
 endfunction
 
-"
-function s:warnOldInfoFile()
-  call fuf#echoWarning(printf(
-        \ "=================================================================\n" .
-        \ "  Sorry, but your information file for FuzzyFinder is no longer  \n" .
-        \ "  compatible with this version of FuzzyFinder. Please remove     \n" .
-        \ "  %-63s\n" .
-        \ "=================================================================\n" ,
-        \ '"' . expand(g:fuf_infoFile) . '".'))
-  call l9#inputHl('Question', 'Press Enter')
-endfunction
-
-"
-function s:serializeInfoMap(infoMap)
-  let lines = []
-  for [m, info] in items(a:infoMap)
-    for [key, value] in items(info)
-      let lines += map(copy(value), 'm . "\t" . key . "\t" . string(v:val)')
-    endfor
-  endfor
-  return lines
-endfunction
-
-"
-function s:deserializeInfoMap(lines)
-  let infoMap = {}
-  for e in filter(map(a:lines, 'matchlist(v:val, ''^\v(\S+)\s+(\S+)\s+(.+)$'')'), '!empty(v:val)')
-    if !exists('infoMap[e[1]]')
-      let infoMap[e[1]] = {}
-    endif
-    if !exists('infoMap[e[1]][e[2]]')
-      let infoMap[e[1]][e[2]] = []
-    endif
-    call add(infoMap[e[1]][e[2]], eval(e[3]))
-  endfor
-  return infoMap
-endfunction
-
 " }}}1
 "=============================================================================
 " s:handlerBase {{{1
 "
 function s:handlerBase.addStat(pattern, word)
   let stat = { 'pattern' : a:pattern, 'word' : a:word }
-  call filter(self.info.stats, 'v:val !=# stat')
-  call insert(self.info.stats, stat)
-  let self.info.stats = self.info.stats[0 : g:fuf_learningLimit - 1]
+  call filter(self.stats, 'v:val !=# stat')
+  call insert(self.stats, stat)
+  let self.stats = self.stats[0 : g:fuf_learningLimit - 1]
 endfunction
 
 "
   let patternSet = self.makePatternSet(a:patternBase)
   let exprBoundary = s:makeFuzzyMatchingExpr('a:wordForBoundary', patternSet.primaryForRank)
   let stats = filter(
-        \ copy(self.info.stats), 'v:val.pattern ==# patternSet.primaryForRank')
+        \ copy(self.stats), 'v:val.pattern ==# patternSet.primaryForRank')
   let items = self.getCompleteItems(patternSet.primary)
   " NOTE: In order to know an excess, plus 1 to limit number
   let items = l9#filterWithLimit(
   unlet s:runningHandler
   call l9#tempvariables#swap(s:TEMP_VARIABLES_GROUP)
   call s:deactivateFufBuffer()
-  call fuf#saveInfoFile(self.getModeName(), self.info)
+  call fuf#saveStats(self.getModeName(), self.stats)
   execute self.windowRestoringCommand
   let fOpen = exists('s:reservedCommand')
   if fOpen
 
 "
 function s:handlerBase.onRecallPattern(shift)
-  let patterns = map(copy(self.info.stats), 'v:val.pattern')
+  let patterns = map(copy(self.stats), 'v:val.pattern')
   if !exists('self.indexRecall')
     let self.indexRecall = -1
   endif
 
 "
 function s:infoBufferListener.onWrite(lines)
-  call fuf#saveInfoFile('', s:deserializeInfoMap(a:lines))
-  echo "Information file updated"
-  return 1
+  "TODO
+  throw 'TODO'
+  "call fuf#saveInfoFile('', s:deserializeInfoMap(a:lines))
+  "echo "Information file updated"
+  "return 1
 endfunction
 
 
 
 let s:bufferCursorPosMap = {}
 
+"
+let s:DATA_FILE_VERSION = 400
+
+"
+function s:checkDataFileCompatibility()
+  if empty(g:fuf_dataDir)
+    let s:dataFileAvailable = 0
+    return
+  endif
+  let versionPath = l9#concatPaths([g:fuf_dataDir, 'VERSION'])
+  let lines = l9#readFile(versionPath)
+  if empty(lines)
+    call l9#writeFile([s:DATA_FILE_VERSION], versionPath)
+    let s:dataFileAvailable = 1
+  elseif str2nr(lines[0]) == s:DATA_FILE_VERSION
+    let s:dataFileAvailable = 1
+  else
+    call fuf#echoWarning(printf(
+          \ "==============================================================\n" .
+          \ "  Existing data files for FuzzyFinder is no longer            \n" .
+          \ "  compatible with this version of FuzzyFinder. Please remove  \n" .
+          \ "  %-60s\n" .
+          \ "==============================================================\n" ,
+          \ string(g:fuf_dataDir)))
+    call l9#inputHl('Question', 'Press Enter')
+    let s:dataFileAvailable = 0
+  endif
+endfunction
+
+call s:checkDataFileCompatibility()
+
 " }}}1
 "=============================================================================
 " vim: set fdm=marker:

autoload/fuf/aroundmrufile.vim

   if !empty(&buftype) || !filereadable(expand('%'))
     return
   endif
-  let info = fuf#loadInfoFile(s:MODE_NAME)
-  let info.data = fuf#updateMruList(
-        \ info.data, { 'word' : expand('%:p:h') },
+  let items = fuf#loadItems(s:MODE_NAME)
+  let items = fuf#updateMruList(
+        \ items, { 'word' : expand('%:p:h') },
         \ g:fuf_aroundmrufile_maxDir, g:fuf_aroundmrufile_exclude)
-  call fuf#saveInfoFile(s:MODE_NAME, info)
+  call fuf#saveItems(s:MODE_NAME, items)
 endfunction
 
 "
 function s:handler.onModeEnterPost()
   " NOTE: Comparing filenames is faster than bufnr('^' . fname . '$')
   let bufNamePrev = fnamemodify(bufname(self.bufNrPrev), ':p:~')
-  let self.items = copy(self.info.data)
+  let self.items = fuf#loadItems(s:MODE_NAME)
   call map(self.items, 's:listFilesUsingCache(v:val.word)')
   let self.items = l9#concat(self.items)
   call filter(self.items, '!empty(v:val) && v:val.word !=# bufNamePrev')

autoload/fuf/bookmark.vim

     call fuf#echoWarning('Canceled')
     return
   endif
-  let info = fuf#loadInfoFile(s:MODE_NAME)
-  call insert(info.data, item)
-  call fuf#saveInfoFile(s:MODE_NAME, info)
+  let items = fuf#loadItems(s:MODE_NAME)
+  call insert(items, item)
+  call fuf#saveItems(s:MODE_NAME, items)
 endfunction
 
 "
 
 "
 function s:handler.makePreviewLines(word, count)
-  let item = s:findItem(self.info.data, a:word)
+  let item = s:findItem(fuf#loadItems(s:MODE_NAME), a:word)
   let lines = fuf#getFileLines(item.path)
   if empty(lines)
     return []
 "
 function s:handler.onOpen(word, mode)
   if a:mode ==# s:OPEN_TYPE_DELETE
-    call filter(self.info.data, 'v:val.word !=# a:word')
-    call fuf#saveInfoFile(self.getModeName(), self.info)
+    let items = fuf#loadItems(s:MODE_NAME)
+    call filter(items, 'v:val.word !=# a:word')
+    call fuf#saveItems(s:MODE_NAME, items)
     let self.reservedMode = self.getModeName()
     return
   else
-    let item = s:findItem(self.info.data, a:word)
+    let item = s:findItem(fuf#loadItems(s:MODE_NAME), a:word)
     if !empty(item)
         call s:jumpToBookmark(item.path, a:mode, item.pattern, item.lnum)
     endif
 function s:handler.onModeEnterPost()
   call fuf#defineKeyMappingInHandler(g:fuf_bookmark_keyDelete,
         \                            'onCr(' . s:OPEN_TYPE_DELETE . ', 0)')
-  let self.items = copy(self.info.data)
+  let self.items = fuf#loadItems(s:MODE_NAME)
   call map(self.items, 'fuf#makeNonPathItem(v:val.word, strftime(g:fuf_timeFormat, v:val.time))')
   call fuf#mapToSetSerialIndex(self.items, 1)
   call map(self.items, 'fuf#setAbbrWithFormattedWord(v:val, 1)')

autoload/fuf/help.vim

 
 "
 function s:getHelpTagEntries(tagFile)
-  let names = map(readfile(a:tagFile), 's:parseHelpTagEntry(v:val, a:tagFile)')
+  let names = map(l9#readFile(a:tagFile), 's:parseHelpTagEntry(v:val, a:tagFile)')
   return filter(names, '!empty(v:val)')
 endfunction
 
 "
 function s:parseHelpTagFiles(tagFiles, key)
   if !empty(g:fuf_help_cache_dir)
-    if !isdirectory(expand(g:fuf_help_cache_dir))
-      call mkdir(expand(g:fuf_help_cache_dir), 'p')
-    endif
     " NOTE: fnamemodify('a/b', ':p') returns 'a/b/' if the directory exists.
     let cacheFile = fnamemodify(g:fuf_help_cache_dir, ':p') . l9#hash224(a:key)
     if filereadable(cacheFile) && fuf#countModifiedFiles(a:tagFiles, getftime(cacheFile)) == 0
-      return map(readfile(cacheFile), 'eval(v:val)')
+      return map(l9#readFile(cacheFile), 'eval(v:val)')
     endif
   endif
   let items = l9#unique(l9#concat(map(copy(a:tagFiles), 's:getHelpTagEntries(v:val)')))
   call fuf#mapToSetSerialIndex(items, 1)
   let items = map(items, 'fuf#setAbbrWithFormattedWord(v:val, 1)')
   if !empty(g:fuf_help_cache_dir)
-    call writefile(map(copy(items), 'string(v:val)'), cacheFile)
+    call l9#writeFile(map(copy(items), 'string(v:val)'), cacheFile)
   endif
   return items
 endfunction

autoload/fuf/mrucmd.vim

 
 "
 function s:updateInfo(cmd)
-  let info = fuf#loadInfoFile(s:MODE_NAME)
-  let info.data = fuf#updateMruList(
-        \ info.data, { 'word' : a:cmd, 'time' : localtime() },
+  let items = fuf#loadItems(s:MODE_NAME)
+  let items = fuf#updateMruList(
+        \ items, { 'word' : a:cmd, 'time' : localtime() },
         \ g:fuf_mrucmd_maxItem, g:fuf_mrucmd_exclude)
-  call fuf#saveInfoFile(s:MODE_NAME, info)
+  call fuf#saveItems(s:MODE_NAME, items)
 endfunction
 
 " }}}1
 
 "
 function s:handler.onModeEnterPost()
-  let self.items = copy(self.info.data)
+  let self.items = fuf#loadItems(s:MODE_NAME)
   call map(self.items, 'fuf#makeNonPathItem(v:val.word, strftime(g:fuf_timeFormat, v:val.time))')
   call fuf#mapToSetSerialIndex(self.items, 1)
   call map(self.items, 'fuf#setAbbrWithFormattedWord(v:val, 1)')

autoload/fuf/mrufile.vim

   if !empty(&buftype) || !filereadable(expand('%'))
     return
   endif
-  let info = fuf#loadInfoFile(s:MODE_NAME)
-  let info.data = fuf#updateMruList(
-        \ info.data, { 'word' : expand('%:p'), 'time' : localtime() },
+  let items = fuf#loadItems(s:MODE_NAME)
+  let items = fuf#updateMruList(
+        \ items, { 'word' : expand('%:p'), 'time' : localtime() },
         \ g:fuf_mrufile_maxItem, g:fuf_mrufile_exclude)
-  call fuf#saveInfoFile(s:MODE_NAME, info)
+  call fuf#saveItems(s:MODE_NAME, items)
   call s:removeItemFromCache(expand('%:p'))
 endfunction
 
 function s:handler.onModeEnterPost()
   " NOTE: Comparing filenames is faster than bufnr('^' . fname . '$')
   let bufNamePrev = fnamemodify(bufname(self.bufNrPrev), ':p:~')
-  let self.items = copy(self.info.data)
+  let self.items = fuf#loadItems(s:MODE_NAME)
   call map(self.items, 's:formatItemUsingCache(v:val)')
   call filter(self.items, '!empty(v:val) && v:val.word !=# bufNamePrev')
   call fuf#mapToSetSerialIndex(self.items, 1)

autoload/fuf/tag.vim

 
 "
 function s:getTagNames(tagFile)
-  let names = map(readfile(a:tagFile), 'matchstr(v:val, ''^[^!\t][^\t]*'')')
+  let names = map(l9#readFile(a:tagFile), 'matchstr(v:val, ''^[^!\t][^\t]*'')')
   return filter(names, 'v:val =~# ''\S''')
 endfunction
 
 "
 function s:parseTagFiles(tagFiles, key)
   if !empty(g:fuf_tag_cache_dir)
-    if !isdirectory(expand(g:fuf_tag_cache_dir))
-      call mkdir(expand(g:fuf_tag_cache_dir), 'p')
-    endif
     " NOTE: fnamemodify('a/b', ':p') returns 'a/b/' if the directory exists.
     let cacheFile = fnamemodify(g:fuf_tag_cache_dir, ':p') . l9#hash224(a:key)
     if filereadable(cacheFile) && fuf#countModifiedFiles(a:tagFiles, getftime(cacheFile)) == 0
-      return map(readfile(cacheFile), 'eval(v:val)')
+      return map(l9#readFile(cacheFile), 'eval(v:val)')
     endif
   endif
   let items = l9#unique(l9#concat(map(copy(a:tagFiles), 's:getTagNames(v:val)')))
   call fuf#mapToSetSerialIndex(items, 1)
   let items = map(items, 'fuf#setAbbrWithFormattedWord(v:val, 1)')
   if !empty(g:fuf_tag_cache_dir)
-    call writefile(map(copy(items), 'string(v:val)'), cacheFile)
+    call l9#writeFile(map(copy(items), 'string(v:val)'), cacheFile)
   endif
   return items
 endfunction

autoload/fuf/taggedfile.vim

 "
 function s:getTaggedFileList(tagfile)
   execute 'cd ' . fnamemodify(a:tagfile, ':h')
-  let result = map(readfile(a:tagfile), 'matchstr(v:val, ''^[^!\t][^\t]*\t\zs[^\t]\+'')')
-  call map(readfile(a:tagfile), 'fnamemodify(v:val, ":p")')
+  let result = map(l9#readFile(a:tagfile), 'matchstr(v:val, ''^[^!\t][^\t]*\t\zs[^\t]\+'')')
+  call map(l9#readFile(a:tagfile), 'fnamemodify(v:val, ":p")')
   cd -
-  call map(readfile(a:tagfile), 'fnamemodify(v:val, ":~:.")')
+  call map(l9#readFile(a:tagfile), 'fnamemodify(v:val, ":~:.")')
   return filter(result, 'v:val =~# ''[^/\\ ]$''')
 endfunction
 
 "
 function s:parseTagFiles(tagFiles, key)
   if !empty(g:fuf_taggedfile_cache_dir)
-    if !isdirectory(expand(g:fuf_taggedfile_cache_dir))
-      call mkdir(expand(g:fuf_taggedfile_cache_dir), 'p')
-    endif
     " NOTE: fnamemodify('a/b', ':p') returns 'a/b/' if the directory exists.
     let cacheFile = fnamemodify(g:fuf_taggedfile_cache_dir, ':p') . l9#hash224(a:key)
     if filereadable(cacheFile) && fuf#countModifiedFiles(a:tagFiles, getftime(cacheFile)) == 0
-      return map(readfile(cacheFile), 'eval(v:val)')
+      return map(l9#readFile(cacheFile), 'eval(v:val)')
     endif
   endif
   let items = l9#unique(l9#concat(map(copy(a:tagFiles), 's:getTaggedFileList(v:val)')))
   call fuf#mapToSetSerialIndex(items, 1)
   call fuf#mapToSetAbbrWithSnippedWordAsPath(items)
   if !empty(g:fuf_taggedfile_cache_dir)
-    call writefile(map(copy(items), 'string(v:val)'), cacheFile)
+    call l9#writeFile(map(copy(items), 'string(v:val)'), cacheFile)
   endif
   return items
 endfunction
     g:fuf_buffer_keyDelete option.
   - Added new feature which allows to set one-time options/variables with
     fuf#setOneTimeVariables() function.
+  - Added g:fuf_dataDir option and removed g:fuf_infoFile,
+    g:g:fuf_tag_cache_dir, g:fuf_taggedfile_cache_dir, and
+    g:fuf_help_cache_dir options.
   - Fixed a bug that FuzzyFinder caused reseting window layout.
 
 3.5:
   call l9#defineVariableDefault('g:fuf_keyPrevPattern'   , '<C-s>')
   call l9#defineVariableDefault('g:fuf_keyNextPattern'   , '<C-_>')
   call l9#defineVariableDefault('g:fuf_keySwitchMatching', '<C-\><C-\>')
-  call l9#defineVariableDefault('g:fuf_infoFile'         , '~/.vim-fuf')
+  call l9#defineVariableDefault('g:fuf_infoFile'         , '~/.vim-fuf') " TODO
+  call l9#defineVariableDefault('g:fuf_dataDir'          , '~/.vim-fuf-data')
   call l9#defineVariableDefault('g:fuf_abbrevMap'        , {})
   call l9#defineVariableDefault('g:fuf_patternSeparator' , ';')
   call l9#defineVariableDefault('g:fuf_promptHighlight'  , 'Question')
   "---------------------------------------------------------------------------
   call l9#defineVariableDefault('g:fuf_tag_prompt'     , '>Tag[]>')
   call l9#defineVariableDefault('g:fuf_tag_switchOrder', 80)
-  call l9#defineVariableDefault('g:fuf_tag_cache_dir'  , '~/.vim-fuf-cache/tag')
+  call l9#defineVariableDefault('g:fuf_tag_cache_dir'  , '~/.vim-fuf-cache/tag') " TODO
   "---------------------------------------------------------------------------
   call l9#defineVariableDefault('g:fuf_taggedfile_prompt'     , '>Tagged-File[]>')
   call l9#defineVariableDefault('g:fuf_taggedfile_switchOrder', 90)
-  call l9#defineVariableDefault('g:fuf_taggedfile_cache_dir'  , '~/.vim-fuf-cache/taggedfile')
+  call l9#defineVariableDefault('g:fuf_taggedfile_cache_dir'  , '~/.vim-fuf-cache/taggedfile') " TODO
   "---------------------------------------------------------------------------
   call l9#defineVariableDefault('g:fuf_jumplist_prompt'     , '>Jump-List[]>')
   call l9#defineVariableDefault('g:fuf_jumplist_switchOrder', 100)
   "---------------------------------------------------------------------------
   call l9#defineVariableDefault('g:fuf_help_prompt'     , '>Help[]>')
   call l9#defineVariableDefault('g:fuf_help_switchOrder', 140)
-  call l9#defineVariableDefault('g:fuf_help_cache_dir'  , '~/.vim-fuf-cache/help')
+  call l9#defineVariableDefault('g:fuf_help_cache_dir'  , '~/.vim-fuf-cache/help') " TODO
   "---------------------------------------------------------------------------
   call filter(g:fuf_modes, 'count(g:fuf_modesDisable, v:val) == 0')
   for m in g:fuf_modes
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.