From 2f6eca0dc513d474765290f1a5a4c02aed549be0 Mon Sep 17 00:00:00 2001 From: Hugues Hiegel Date: Wed, 7 Nov 2018 10:34:07 +0100 Subject: Plein de trucs en vrac... J’ai honte.. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- autoload/fuf/bookmarkdir.vim | 163 +++++++++++++++++++++++ autoload/fuf/bookmarkfile.vim | 199 ++++++++++++++++++++++++++++ autoload/fuf/buffer.vim | 189 ++++++++++++++++++++++++++ autoload/fuf/buffertag.vim | 300 ++++++++++++++++++++++++++++++++++++++++++ autoload/fuf/callbackfile.vim | 137 +++++++++++++++++++ autoload/fuf/callbackitem.vim | 139 +++++++++++++++++++ autoload/fuf/changelist.vim | 172 ++++++++++++++++++++++++ autoload/fuf/coveragefile.vim | 199 ++++++++++++++++++++++++++++ autoload/fuf/dir.vim | 132 +++++++++++++++++++ autoload/fuf/file.vim | 139 +++++++++++++++++++ autoload/fuf/givencmd.vim | 123 +++++++++++++++++ autoload/fuf/givendir.vim | 123 +++++++++++++++++ autoload/fuf/givenfile.vim | 121 +++++++++++++++++ autoload/fuf/help.vim | 198 ++++++++++++++++++++++++++++ autoload/fuf/jumplist.vim | 182 +++++++++++++++++++++++++ autoload/fuf/line.vim | 135 +++++++++++++++++++ autoload/fuf/mrucmd.vim | 134 +++++++++++++++++++ autoload/fuf/mrufile.vim | 234 ++++++++++++++++++++++++++++++++ autoload/fuf/quickfix.vim | 154 ++++++++++++++++++++++ autoload/fuf/tag.vim | 178 +++++++++++++++++++++++++ autoload/fuf/taggedfile.vim | 159 ++++++++++++++++++++++ 21 files changed, 3510 insertions(+) create mode 100644 autoload/fuf/bookmarkdir.vim create mode 100644 autoload/fuf/bookmarkfile.vim create mode 100644 autoload/fuf/buffer.vim create mode 100644 autoload/fuf/buffertag.vim create mode 100644 autoload/fuf/callbackfile.vim create mode 100644 autoload/fuf/callbackitem.vim create mode 100644 autoload/fuf/changelist.vim create mode 100644 autoload/fuf/coveragefile.vim create mode 100644 autoload/fuf/dir.vim create mode 100644 autoload/fuf/file.vim create mode 100644 autoload/fuf/givencmd.vim create mode 100644 autoload/fuf/givendir.vim create mode 100644 autoload/fuf/givenfile.vim create mode 100644 autoload/fuf/help.vim create mode 100644 autoload/fuf/jumplist.vim create mode 100644 autoload/fuf/line.vim create mode 100644 autoload/fuf/mrucmd.vim create mode 100644 autoload/fuf/mrufile.vim create mode 100644 autoload/fuf/quickfix.vim create mode 100644 autoload/fuf/tag.vim create mode 100644 autoload/fuf/taggedfile.vim (limited to 'autoload/fuf') diff --git a/autoload/fuf/bookmarkdir.vim b/autoload/fuf/bookmarkdir.vim new file mode 100644 index 0000000..01585ff --- /dev/null +++ b/autoload/fuf/bookmarkdir.vim @@ -0,0 +1,163 @@ +"============================================================================= +" Copyright (c) 2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#bookmarkdir#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#bookmarkdir#getSwitchOrder() + return g:fuf_bookmarkdir_switchOrder +endfunction + +" +function fuf#bookmarkdir#getEditableDataNames() + return ['items'] +endfunction + +" +function fuf#bookmarkdir#renewCache() +endfunction + +" +function fuf#bookmarkdir#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#bookmarkdir#onInit() + call fuf#defineLaunchCommand('FufBookmarkDir', s:MODE_NAME, '""', []) + command! -bang -narg=? FufBookmarkDirAdd call s:bookmark() +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') +let s:OPEN_TYPE_DELETE = -1 + +" +function s:bookmark(word) + let item = { + \ 'time' : localtime(), + \ } + + let item.path = l9#inputHl('Question', '[fuf] Directory to bookmark:', + \ fnamemodify(getcwd(), ':p:~'), 'dir') + if item.path !~ '\S' + call fuf#echoWarning('Canceled') + return + endif + let item.word = l9#inputHl('Question', '[fuf] Bookmark as:', + \ fnamemodify(getcwd(), ':p:~')) + if item.word !~ '\S' + call fuf#echoWarning('Canceled') + return + endif + let items = fuf#loadDataFile(s:MODE_NAME, 'items') + call insert(items, item) + call fuf#saveDataFile(s:MODE_NAME, 'items', items) +endfunction + +" +function s:findItem(items, word) + for item in a:items + if item.word ==# a:word + return item + endif + endfor + return {} +endfunction + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(g:fuf_bookmarkdir_prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return 0 +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForNonPath', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + return [] +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return self.items +endfunction + +" +function s:handler.onOpen(word, mode) + if a:mode ==# s:OPEN_TYPE_DELETE + let items = fuf#loadDataFile(s:MODE_NAME, 'items') + call filter(items, 'v:val.word !=# a:word') + call fuf#saveDataFile(s:MODE_NAME, 'items', items) + let self.reservedMode = self.getModeName() + return + else + let item = s:findItem(fuf#loadDataFile(s:MODE_NAME, 'items'), a:word) + if !empty(item) + execute ':cd ' . fnameescape(item.path) + endif + endif +endfunction + +" +function s:handler.onModeEnterPre() +endfunction + +" +function s:handler.onModeEnterPost() + call fuf#defineKeyMappingInHandler(g:fuf_bookmarkdir_keyDelete, + \ 'onCr(' . s:OPEN_TYPE_DELETE . ')') + let self.items = fuf#loadDataFile(s:MODE_NAME, 'items') + 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)') +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/bookmarkfile.vim b/autoload/fuf/bookmarkfile.vim new file mode 100644 index 0000000..12ac80f --- /dev/null +++ b/autoload/fuf/bookmarkfile.vim @@ -0,0 +1,199 @@ +"============================================================================= +" Copyright (c) 2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#bookmarkfile#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#bookmarkfile#getSwitchOrder() + return g:fuf_bookmarkfile_switchOrder +endfunction + +" +function fuf#bookmarkfile#getEditableDataNames() + return ['items'] +endfunction + +" +function fuf#bookmarkfile#renewCache() +endfunction + +" +function fuf#bookmarkfile#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#bookmarkfile#onInit() + call fuf#defineLaunchCommand('FufBookmarkFile', s:MODE_NAME, '""', []) + command! -bang -narg=? FufBookmarkFileAdd call s:bookmarkHere() + command! -bang -narg=0 -range FufBookmarkFileAddAsSelectedText call s:bookmarkHere(l9#getSelectedText()) +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') +let s:OPEN_TYPE_DELETE = -1 + +" opens a:path and jumps to the line matching to a:pattern from a:lnum within +" a:range. if not found, jumps to a:lnum. +function s:jumpToBookmark(path, mode, pattern, lnum) + call fuf#openFile(a:path, a:mode, g:fuf_reuseWindow) + call cursor(s:getMatchingLineNumber(getline(1, '$'), a:pattern, a:lnum), 0) + normal! zvzz +endfunction + +" +function s:getMatchingLineNumber(lines, pattern, lnumBegin) + let l = min([a:lnumBegin, len(a:lines)]) + for [l0, l1] in map(range(0, g:fuf_bookmarkfile_searchRange), + \ '[l + v:val, l - v:val]') + if l0 <= len(a:lines) && a:lines[l0 - 1] =~# a:pattern + return l0 + elseif l1 >= 0 && a:lines[l1 - 1] =~# a:pattern + return l1 + endif + endfor + return l +endfunction + +" +function s:getLinePattern(lnum) + return '\C\V\^' . escape(getline(a:lnum), '\') . '\$' +endfunction + +" +function s:bookmarkHere(word) + if !empty(&buftype) || expand('%') !~ '\S' + call fuf#echoWarning('Can''t bookmark this buffer.') + return + endif + let item = { + \ 'word' : (a:word =~# '\S' ? substitute(a:word, '\n', ' ', 'g') + \ : pathshorten(expand('%:p:~')) . '|' . line('.') . '| ' . getline('.')), + \ 'path' : expand('%:p'), + \ 'lnum' : line('.'), + \ 'pattern' : s:getLinePattern(line('.')), + \ 'time' : localtime(), + \ } + let item.word = l9#inputHl('Question', '[fuf] Bookmark as:', item.word) + if item.word !~ '\S' + call fuf#echoWarning('Canceled') + return + endif + let items = fuf#loadDataFile(s:MODE_NAME, 'items') + call insert(items, item) + call fuf#saveDataFile(s:MODE_NAME, 'items', items) +endfunction + +" +function s:findItem(items, word) + for item in a:items + if item.word ==# a:word + return item + endif + endfor + return {} +endfunction + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(g:fuf_bookmarkfile_prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return g:fuf_previewHeight +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForNonPath', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + let item = s:findItem(fuf#loadDataFile(s:MODE_NAME, 'items'), a:word) + let lines = fuf#getFileLines(item.path) + if empty(lines) + return [] + endif + let index = s:getMatchingLineNumber(lines, item.pattern, item.lnum) - 1 + return fuf#makePreviewLinesAround( + \ lines, [index], a:count, self.getPreviewHeight()) +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return self.items +endfunction + +" +function s:handler.onOpen(word, mode) + if a:mode ==# s:OPEN_TYPE_DELETE + let items = fuf#loadDataFile(s:MODE_NAME, 'items') + call filter(items, 'v:val.word !=# a:word') + call fuf#saveDataFile(s:MODE_NAME, 'items', items) + let self.reservedMode = self.getModeName() + return + else + let item = s:findItem(fuf#loadDataFile(s:MODE_NAME, 'items'), a:word) + if !empty(item) + call s:jumpToBookmark(item.path, a:mode, item.pattern, item.lnum) + endif + endif +endfunction + +" +function s:handler.onModeEnterPre() +endfunction + +" +function s:handler.onModeEnterPost() + call fuf#defineKeyMappingInHandler(g:fuf_bookmarkfile_keyDelete, + \ 'onCr(' . s:OPEN_TYPE_DELETE . ')') + let self.items = fuf#loadDataFile(s:MODE_NAME, 'items') + 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)') +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/buffer.vim b/autoload/fuf/buffer.vim new file mode 100644 index 0000000..08b954a --- /dev/null +++ b/autoload/fuf/buffer.vim @@ -0,0 +1,189 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#buffer#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#buffer#getSwitchOrder() + return g:fuf_buffer_switchOrder +endfunction + +" +function fuf#buffer#getEditableDataNames() + return [] +endfunction + +" +function fuf#buffer#renewCache() +endfunction + +" +function fuf#buffer#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#buffer#onInit() + call fuf#defineLaunchCommand('FufBuffer', s:MODE_NAME, '""', []) + augroup fuf#buffer + autocmd! + autocmd BufEnter * call s:updateBufTimes() + autocmd BufWritePost * call s:updateBufTimes() + augroup END +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') +let s:OPEN_TYPE_DELETE = -1 + +let s:bufTimes = {} + +" +function s:updateBufTimes() + let s:bufTimes[bufnr('%')] = localtime() +endfunction + +" +function s:makeItem(nr) + let fname = (empty(bufname(a:nr)) + \ ? '[No Name]' + \ : fnamemodify(bufname(a:nr), ':p:~:.')) + let time = (exists('s:bufTimes[a:nr]') ? s:bufTimes[a:nr] : 0) + let item = fuf#makePathItem(fname, strftime(g:fuf_timeFormat, time), 0) + let item.index = a:nr + let item.bufNr = a:nr + let item.time = time + let item.abbrPrefix = s:getBufIndicator(a:nr) . ' ' + return item +endfunction + +" +function s:getBufIndicator(bufNr) + if !getbufvar(a:bufNr, '&modifiable') + return '[-]' + elseif getbufvar(a:bufNr, '&modified') + return '[+]' + elseif getbufvar(a:bufNr, '&readonly') + return '[R]' + else + return ' ' + endif +endfunction + +" +function s:compareTimeDescending(i1, i2) + return a:i1.time == a:i2.time ? 0 : a:i1.time > a:i2.time ? -1 : +1 +endfunction + +" +function s:findItem(items, word) + for item in a:items + if item.word ==# a:word + return item + endif + endfor + return {} +endfunction + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(g:fuf_buffer_prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return g:fuf_previewHeight +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForPath', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + let item = s:findItem(self.items, a:word) + if empty(item) + return [] + endif + return fuf#makePreviewLinesForFile(item.bufNr, a:count, self.getPreviewHeight()) +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return self.items +endfunction + +" +function s:handler.onOpen(word, mode) + " not use bufnr(a:word) in order to handle unnamed buffer + let item = s:findItem(self.items, a:word) + if empty(item) + " do nothing + elseif a:mode ==# s:OPEN_TYPE_DELETE + execute item.bufNr . 'bdelete' + let self.reservedMode = self.getModeName() + else + call fuf#openBuffer(item.bufNr, a:mode, g:fuf_reuseWindow) + endif +endfunction + +" +function s:handler.onModeEnterPre() +endfunction + +" +function s:handler.onModeEnterPost() + call fuf#defineKeyMappingInHandler(g:fuf_buffer_keyDelete, + \ 'onCr(' . s:OPEN_TYPE_DELETE . ')') + let self.items = range(1, bufnr('$')) + call filter(self.items, 'buflisted(v:val) && v:val != self.bufNrPrev && v:val != bufnr("%")') + call map(self.items, 's:makeItem(v:val)') + if g:fuf_buffer_mruOrder + call sort(self.items, 's:compareTimeDescending') + call fuf#mapToSetSerialIndex(self.items, 1) + endif + let self.items = fuf#mapToSetAbbrWithSnippedWordAsPath(self.items) +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/buffertag.vim b/autoload/fuf/buffertag.vim new file mode 100644 index 0000000..392b996 --- /dev/null +++ b/autoload/fuf/buffertag.vim @@ -0,0 +1,300 @@ +"============================================================================= +" Copyright (c) 2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#buffertag#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#buffertag#getSwitchOrder() + return g:fuf_buffertag_switchOrder +endfunction + +" +function fuf#buffertag#getEditableDataNames() + return [] +endfunction + +" +function fuf#buffertag#renewCache() + let s:tagItemsCache = {} + let s:tagDataCache = {} +endfunction + +" +function fuf#buffertag#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#buffertag#onInit() + call fuf#defineLaunchCommand('FufBufferTag', s:MODE_NAME, '""', + \ [['g:fuf_buffertag_forAll', 0]]) + call fuf#defineLaunchCommand('FufBufferTagAll', s:MODE_NAME, '""', + \ [['g:fuf_buffertag_forAll', 1]]) + call fuf#defineLaunchCommand('FufBufferTagWithCursorWord', s:MODE_NAME, + \ 'expand('''')', [['g:fuf_buffertag_forAll', 0]]) + call fuf#defineLaunchCommand('FufBufferTagAllWithCursorWord', s:MODE_NAME, + \ 'expand('''')', [['g:fuf_buffertag_forAll', 1]]) + call fuf#defineLaunchCommand('FufBufferTagWithSelectedText', s:MODE_NAME, + \ 'l9#getSelectedText()', [['g:fuf_buffertag_forAll', 0]]) + call fuf#defineLaunchCommand('FufBufferTagAllWithSelectedText', s:MODE_NAME, + \ 'l9#getSelectedText()', [['g:fuf_buffertag_forAll', 1]]) + call l9#defineVariableDefault('g:fuf_buffertag_forAll', 0) " private option + " the following settings originate from taglist.vim + call l9#defineVariableDefault('g:fuf_buffertag__asm' , '--language-force=asm --asm-types=dlmt') + call l9#defineVariableDefault('g:fuf_buffertag__aspperl' , '--language-force=asp --asp-types=fsv') + call l9#defineVariableDefault('g:fuf_buffertag__aspvbs' , '--language-force=asp --asp-types=fsv') + call l9#defineVariableDefault('g:fuf_buffertag__awk' , '--language-force=awk --awk-types=f') + call l9#defineVariableDefault('g:fuf_buffertag__beta' , '--language-force=beta --beta-types=fsv') + call l9#defineVariableDefault('g:fuf_buffertag__c' , '--language-force=c --c-types=dgsutvf') + call l9#defineVariableDefault('g:fuf_buffertag__cpp' , '--language-force=c++ --c++-types=nvdtcgsuf') + call l9#defineVariableDefault('g:fuf_buffertag__cs' , '--language-force=c# --c#-types=dtncEgsipm') + call l9#defineVariableDefault('g:fuf_buffertag__cobol' , '--language-force=cobol --cobol-types=dfgpPs') + call l9#defineVariableDefault('g:fuf_buffertag__eiffel' , '--language-force=eiffel --eiffel-types=cf') + call l9#defineVariableDefault('g:fuf_buffertag__erlang' , '--language-force=erlang --erlang-types=drmf') + call l9#defineVariableDefault('g:fuf_buffertag__expect' , '--language-force=tcl --tcl-types=cfp') + call l9#defineVariableDefault('g:fuf_buffertag__fortran' , '--language-force=fortran --fortran-types=pbceiklmntvfs') + call l9#defineVariableDefault('g:fuf_buffertag__html' , '--language-force=html --html-types=af') + call l9#defineVariableDefault('g:fuf_buffertag__java' , '--language-force=java --java-types=pcifm') + call l9#defineVariableDefault('g:fuf_buffertag__javascript', '--language-force=javascript --javascript-types=f') + call l9#defineVariableDefault('g:fuf_buffertag__lisp' , '--language-force=lisp --lisp-types=f') + call l9#defineVariableDefault('g:fuf_buffertag__lua' , '--language-force=lua --lua-types=f') + call l9#defineVariableDefault('g:fuf_buffertag__make' , '--language-force=make --make-types=m') + call l9#defineVariableDefault('g:fuf_buffertag__pascal' , '--language-force=pascal --pascal-types=fp') + call l9#defineVariableDefault('g:fuf_buffertag__perl' , '--language-force=perl --perl-types=clps') + call l9#defineVariableDefault('g:fuf_buffertag__php' , '--language-force=php --php-types=cdvf') + call l9#defineVariableDefault('g:fuf_buffertag__python' , '--language-force=python --python-types=cmf') + call l9#defineVariableDefault('g:fuf_buffertag__rexx' , '--language-force=rexx --rexx-types=s') + call l9#defineVariableDefault('g:fuf_buffertag__ruby' , '--language-force=ruby --ruby-types=cfFm') + call l9#defineVariableDefault('g:fuf_buffertag__scheme' , '--language-force=scheme --scheme-types=sf') + call l9#defineVariableDefault('g:fuf_buffertag__sh' , '--language-force=sh --sh-types=f') + call l9#defineVariableDefault('g:fuf_buffertag__csh' , '--language-force=sh --sh-types=f') + call l9#defineVariableDefault('g:fuf_buffertag__zsh' , '--language-force=sh --sh-types=f') + call l9#defineVariableDefault('g:fuf_buffertag__slang' , '--language-force=slang --slang-types=nf') + call l9#defineVariableDefault('g:fuf_buffertag__sml' , '--language-force=sml --sml-types=ecsrtvf') + call l9#defineVariableDefault('g:fuf_buffertag__sql' , '--language-force=sql --sql-types=cFPrstTvfp') + call l9#defineVariableDefault('g:fuf_buffertag__tcl' , '--language-force=tcl --tcl-types=cfmp') + call l9#defineVariableDefault('g:fuf_buffertag__vera' , '--language-force=vera --vera-types=cdefgmpPtTvx') + call l9#defineVariableDefault('g:fuf_buffertag__verilog' , '--language-force=verilog --verilog-types=mcPertwpvf') + call l9#defineVariableDefault('g:fuf_buffertag__vim' , '--language-force=vim --vim-types=avf') + call l9#defineVariableDefault('g:fuf_buffertag__yacc' , '--language-force=yacc --yacc-types=l') +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') + +" +function s:parseTagLine(line) + " tag W:\Win32\SRC7\NCSIM\NCVW32\CUBEFACE.H /^#define CUBEFACE_H$/;" macro line:4 + let fields = matchlist(a:line, '\v^([^\t]+)\t(.+)\t\/\^(.+)\$\/\;\"\t(.+)\tline\:(\d+)') + if empty(fields) + return {} + endif + return { + \ 'tag' : fields[1], + \ 'fname' : fields[2], + \ 'pattern': fields[3], + \ 'kind' : fields[4], + \ 'lnum' : str2nr(fields[5]), + \ } +endfunction + +" +let s:TEMP_VARIABLES_GROUP = expand(':p') + +" +function s:getFileType(bufNr) + let ft = getbufvar(a:bufNr, '&filetype') + if !empty(ft) || bufloaded(a:bufNr) + return ft + endif + let ft = getbufvar(a:bufNr, 'fuf_buffertag_filetype') + if !empty(ft) + return ft + endif + call l9#tempvariables#set(s:TEMP_VARIABLES_GROUP, '&eventignore', 'FileType') + call l9#tempvariables#set(s:TEMP_VARIABLES_GROUP, '&filetype', &filetype) + " from taglist.vim + execute 'doautocmd filetypedetect BufRead ' . bufname(a:bufNr) + let ft = &filetype + call l9#tempvariables#end(s:TEMP_VARIABLES_GROUP) + call setbufvar(a:bufNr, 'fuf_buffertag_filetype', ft) + return ft +endfunction + +" +function s:makeCtagsCmd(bufNr) + let ft = s:getFileType(a:bufNr) + if !exists('g:fuf_buffertag__{ft}') + return '' + endif + " + let cmd = join([g:fuf_buffertag_ctagsPath, + \ '-f - --sort=no --excmd=pattern --fields=nKs', + \ g:fuf_buffertag__{ft}, + \ shellescape(fnamemodify(bufname(a:bufNr), ':p'))]) + return cmd +endfunction + +" +function s:getTagItems(bufNr) + let cmd = s:makeCtagsCmd(a:bufNr) + if empty(cmd) + return [] + elseif !exists('s:tagItemsCache[cmd]') || + \ s:tagItemsCache[cmd].time < getftime(expand(bufname(a:bufNr))) + let items = split(system(cmd), "\n") + if v:shell_error + call fuf#echoError([cmd] + items) + throw "Command error" + endif + call map(items, 's:parseTagLine(v:val)') + call filter(items, '!empty(v:val)') + let s:tagItemsCache[cmd] = { + \ 'time' : localtime(), + \ 'items' : items, + \ } + endif + return s:tagItemsCache[cmd].items +endfunction + +" +function s:makeItem(tag, itemMap) + let menu = fnamemodify(a:itemMap[a:tag][0].fname, ':t') + \ . ' [' . a:itemMap[a:tag][0].kind . ']' + if len(a:itemMap[a:tag]) > 1 + let menu .= ' (' . len(a:itemMap[a:tag]) . ')' + endif + let item = fuf#makeNonPathItem(a:tag, menu) + return item +endfunction + +" +function s:getTagData(bufNrs) + let key = join([0] + sort(copy(a:bufNrs)), "\n") + let bufNames = map(copy(a:bufNrs), 'bufname(v:val)') + if !exists('s:tagDataCache[key]') || + \ fuf#countModifiedFiles(bufNames, s:tagDataCache[key].time) > 0 + let itemMap = {} + for item in l9#concat(map(copy(a:bufNrs), 's:getTagItems(v:val)')) + if !exists('itemMap[item.tag]') + let itemMap[item.tag] = [] + endif + call add(itemMap[item.tag], item) + endfor + let items = sort(keys(itemMap)) + call map(items, 's:makeItem(v:val, itemMap)') + call fuf#mapToSetSerialIndex(items, 1) + call map(items, 'fuf#setAbbrWithFormattedWord(v:val, 1)') + let s:tagDataCache[key] = { + \ 'time' : localtime(), + \ 'itemMap': itemMap, + \ 'items' : items, + \ } + endif + return [s:tagDataCache[key].items, s:tagDataCache[key].itemMap] +endfunction + +" +function s:jumpToTag(item, mode) + call fuf#openFile(a:item.fname, a:mode, g:fuf_reuseWindow) + call cursor(a:item.lnum, 1) + normal! zvzz +endfunction + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(g:fuf_buffertag_prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return 0 +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForNonPath', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + return [] +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return self.items +endfunction + +" +function s:handler.onOpen(word, mode) + if !exists('self.itemMap[a:word][0]') + call fuf#echoError('Definition not found:' . a:word) + return + elseif len(self.itemMap[a:word]) == 1 + let i = 0 + else + let list = map(fuf#mapToSetSerialIndex(copy(self.itemMap[a:word]), 1), + \ 'printf(" %2d: %s|%d| [%s] %s",v:val.index, fnamemodify(v:val.fname, ":~:."), v:val.lnum, v:val.kind, v:val.pattern)') + let i = inputlist(['Select a definition of "' . a:word . '":'] + list) - 1 + endif + if 0 <= i && i < len(self.itemMap[a:word]) + call s:jumpToTag(self.itemMap[a:word][i], a:mode) + endif +endfunction + +" +function s:handler.onModeEnterPre() +endfunction + +" +function s:handler.onModeEnterPost() + if g:fuf_buffertag_forAll + let bufNrs = filter(range(1, bufnr('$')), 'buflisted(v:val)') + else + let bufNrs = [self.bufNrPrev] + endif + let [self.items, self.itemMap] = s:getTagData(bufNrs) +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/callbackfile.vim b/autoload/fuf/callbackfile.vim new file mode 100644 index 0000000..fedf0cf --- /dev/null +++ b/autoload/fuf/callbackfile.vim @@ -0,0 +1,137 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#callbackfile#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#callbackfile#getSwitchOrder() + return -1 +endfunction + +" +function fuf#callbackfile#getEditableDataNames() + return [] +endfunction + +" +function fuf#callbackfile#renewCache() + let s:cache = {} +endfunction + +" +function fuf#callbackfile#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#callbackfile#onInit() +endfunction + +" +function fuf#callbackfile#launch(initialPattern, partialMatching, prompt, exclude, listener) + let s:prompt = (empty(a:prompt) ? '>' : a:prompt) + let s:exclude = a:exclude + let s:listener = a:listener + call fuf#launch(s:MODE_NAME, a:initialPattern, a:partialMatching) +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') + +" +function s:enumItems(dir) + let key = getcwd() . g:fuf_ignoreCase . s:exclude . "\n" . a:dir + if !exists('s:cache[key]') + let s:cache[key] = fuf#enumExpandedDirsEntries(a:dir, s:exclude) + if isdirectory(a:dir) + call insert(s:cache[key], fuf#makePathItem(a:dir . '.', '', 0)) + endif + call fuf#mapToSetSerialIndex(s:cache[key], 1) + call fuf#mapToSetAbbrWithSnippedWordAsPath(s:cache[key]) + endif + return s:cache[key] +endfunction + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(s:prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return g:fuf_previewHeight +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return a:enteredPattern =~# '[^/\\]$' +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForPathTail', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + return fuf#makePreviewLinesForFile(a:word, a:count, self.getPreviewHeight()) +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + let items = copy(s:enumItems(fuf#splitPath(a:patternPrimary).head)) + return filter(items, 'bufnr("^" . v:val.word . "$") != self.bufNrPrev') +endfunction + +" +function s:handler.onOpen(word, mode) + call s:listener.onComplete(a:word, a:mode) +endfunction + +" +function s:handler.onModeEnterPre() +endfunction + +" +function s:handler.onModeEnterPost() +endfunction + +" +function s:handler.onModeLeavePost(opened) + if !a:opened && exists('s:listener.onAbort()') + call s:listener.onAbort() + endif +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/callbackitem.vim b/autoload/fuf/callbackitem.vim new file mode 100644 index 0000000..118ee08 --- /dev/null +++ b/autoload/fuf/callbackitem.vim @@ -0,0 +1,139 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#callbackitem#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#callbackitem#getSwitchOrder() + return -1 +endfunction + +" +function fuf#callbackitem#getEditableDataNames() + return [] +endfunction + +" +function fuf#callbackitem#renewCache() +endfunction + +" +function fuf#callbackitem#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#callbackitem#onInit() +endfunction + +" +function fuf#callbackitem#launch(initialPattern, partialMatching, prompt, listener, items, forPath) + let s:prompt = (empty(a:prompt) ? '>' : a:prompt) + let s:listener = a:listener + let s:forPath = a:forPath + let s:items = copy(a:items) + if s:forPath + call map(s:items, 'fuf#makePathItem(v:val, "", 1)') + call fuf#mapToSetSerialIndex(s:items, 1) + call fuf#mapToSetAbbrWithSnippedWordAsPath(s:items) + else + call map(s:items, 'fuf#makeNonPathItem(v:val, "")') + call fuf#mapToSetSerialIndex(s:items, 1) + call map(s:items, 'fuf#setAbbrWithFormattedWord(v:val, 1)') + endif + call fuf#launch(s:MODE_NAME, a:initialPattern, a:partialMatching) +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(s:prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + if s:forPath + return g:fuf_previewHeight + endif + return 0 +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + let parser = (s:forPath + \ ? 's:interpretPrimaryPatternForPath' + \ : 's:interpretPrimaryPatternForNonPath') + return fuf#makePatternSet(a:patternBase, parser, self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + if s:forPath + return fuf#makePreviewLinesForFile(a:word, a:count, self.getPreviewHeight()) + endif + return [] +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return s:items +endfunction + +" +function s:handler.onOpen(word, mode) + call s:listener.onComplete(a:word, a:mode) +endfunction + +" +function s:handler.onModeEnterPre() +endfunction + +" +function s:handler.onModeEnterPost() +endfunction + +" +function s:handler.onModeLeavePost(opened) + if !a:opened && exists('s:listener.onAbort()') + call s:listener.onAbort() + endif +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/changelist.vim b/autoload/fuf/changelist.vim new file mode 100644 index 0000000..545f6ca --- /dev/null +++ b/autoload/fuf/changelist.vim @@ -0,0 +1,172 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#changelist#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#changelist#getSwitchOrder() + return g:fuf_changelist_switchOrder +endfunction + +" +function fuf#changelist#getEditableDataNames() + return [] +endfunction + +" +function fuf#changelist#renewCache() +endfunction + +" +function fuf#changelist#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#changelist#onInit() + call fuf#defineLaunchCommand('FufChangeList', s:MODE_NAME, '""', []) +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') + +" +function s:getChangesLines() + redir => result + :silent changes + redir END + return split(result, "\n") +endfunction + +" +function s:parseChangesLine(line) + " return matchlist(a:line, '^\(.\)\s\+\(\d\+\)\s\(.*\)$') + let elements = matchlist(a:line, '\v^(.)\s*(\d+)\s+(\d+)\s+(\d+)\s*(.*)$') + if empty(elements) + return {} + endif + return { + \ 'prefix': elements[1], + \ 'count' : elements[2], + \ 'lnum' : elements[3], + \ 'text' : printf('|%d:%d|%s', elements[3], elements[4], elements[5]), + \ } +endfunction + +" +function s:makeItem(line) + let parsed = s:parseChangesLine(a:line) + if empty(parsed) + return {} + endif + let item = fuf#makeNonPathItem(parsed.text, '') + let item.abbrPrefix = parsed.prefix + let item.lnum = parsed.lnum + return item +endfunction + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(g:fuf_changelist_prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return g:fuf_previewHeight +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForNonPath', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + let items = filter(copy(self.items), 'v:val.word ==# a:word') + if empty(items) + return [] + endif + let lines = fuf#getFileLines(self.bufNrPrev) + return fuf#makePreviewLinesAround( + \ lines, [items[0].lnum - 1], a:count, self.getPreviewHeight()) +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return self.items +endfunction + +" +function s:handler.onOpen(word, mode) + call fuf#prejump(a:mode) + let older = 0 + for line in reverse(s:getChangesLines()) + if stridx(line, '>') == 0 + let older = 1 + endif + let parsed = s:parseChangesLine(line) + if !empty(parsed) && parsed.text ==# a:word + if parsed.count != 0 + execute 'normal! ' . parsed.count . (older ? 'g;' : 'g,') . 'zvzz' + endif + break + endif + endfor +endfunction + +" +function s:handler.onModeEnterPre() + let self.items = s:getChangesLines() +endfunction + +" +function s:handler.onModeEnterPost() + call map(self.items, 's:makeItem(v:val)') + call filter(self.items, '!empty(v:val)') + call reverse(self.items) + call fuf#mapToSetSerialIndex(self.items, 1) + call map(self.items, 'fuf#setAbbrWithFormattedWord(v:val, 1)') +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: + diff --git a/autoload/fuf/coveragefile.vim b/autoload/fuf/coveragefile.vim new file mode 100644 index 0000000..1471ef8 --- /dev/null +++ b/autoload/fuf/coveragefile.vim @@ -0,0 +1,199 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#coveragefile#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#coveragefile#getSwitchOrder() + return g:fuf_coveragefile_switchOrder +endfunction + +" +function fuf#coveragefile#getEditableDataNames() + return ['coverages'] +endfunction + +" +function fuf#coveragefile#renewCache() + let s:cache = {} +endfunction + +" +function fuf#coveragefile#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#coveragefile#onInit() + call fuf#defineLaunchCommand('FufCoverageFile', s:MODE_NAME, '""', []) + call l9#defineVariableDefault('g:fuf_coveragefile_name', '') " private option + command! -bang -narg=0 FufCoverageFileRegister call s:registerCoverage() + command! -bang -narg=? FufCoverageFileChange call s:changeCoverage() +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') + +" +function s:enumItems() + let key = join([getcwd(), g:fuf_ignoreCase, g:fuf_coveragefile_exclude, + \ g:fuf_coveragefile_globPatterns], "\n") + if !exists('s:cache[key]') + let s:cache[key] = l9#concat(map(copy(g:fuf_coveragefile_globPatterns), + \ 'fuf#glob(v:val)')) + call filter(s:cache[key], 'filereadable(v:val)') " filter out directories + call map(s:cache[key], 'fuf#makePathItem(fnamemodify(v:val, ":~:."), "", 0)') + if len(g:fuf_coveragefile_exclude) + call filter(s:cache[key], 'v:val.word !~ g:fuf_coveragefile_exclude') + endif + call fuf#mapToSetSerialIndex(s:cache[key], 1) + call fuf#mapToSetAbbrWithSnippedWordAsPath(s:cache[key]) + endif + return s:cache[key] +endfunction + +" +function s:registerCoverage() + let patterns = [] + while 1 + let pattern = l9#inputHl('Question', '[fuf] Glob pattern for coverage ( and end):', + \ '', 'file') + if pattern !~ '\S' + break + endif + call add(patterns, pattern) + endwhile + if empty(patterns) + call fuf#echoWarning('Canceled') + return + endif + echo '[fuf] patterns: ' . string(patterns) + let name = l9#inputHl('Question', '[fuf] Coverage name:') + if name !~ '\S' + call fuf#echoWarning('Canceled') + return + endif + let coverages = fuf#loadDataFile(s:MODE_NAME, 'coverages') + call insert(coverages, {'name': name, 'patterns': patterns}) + call fuf#saveDataFile(s:MODE_NAME, 'coverages', coverages) +endfunction + +" +function s:createChangeCoverageListener() + let listener = {} + + function listener.onComplete(name, method) + call s:changeCoverage(a:name) + endfunction + + return listener +endfunction + +" +function s:changeCoverage(name) + let coverages = fuf#loadDataFile(s:MODE_NAME, 'coverages') + if a:name !~ '\S' + let names = map(copy(coverages), 'v:val.name') + call fuf#callbackitem#launch('', 0, '>Coverage>', s:createChangeCoverageListener(), names, 0) + return + else + let name = a:name + endif + call filter(coverages, 'v:val.name ==# name') + if empty(coverages) + call fuf#echoError('Coverage not found: ' . name) + return + endif + call fuf#setOneTimeVariables( + \ ['g:fuf_coveragefile_globPatterns', coverages[0].patterns], + \ ['g:fuf_coveragefile_name' , a:name] + \ ) + FufCoverageFile +endfunction + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + let nameString = (empty(g:fuf_coveragefile_name) ? '' + \ : '[' . g:fuf_coveragefile_name . ']') + return fuf#formatPrompt(g:fuf_coveragefile_prompt, self.partialMatching, + \ nameString) +endfunction + +" +function s:handler.getPreviewHeight() + return g:fuf_previewHeight +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForPath', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + return fuf#makePreviewLinesForFile(a:word, a:count, self.getPreviewHeight()) +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return self.items +endfunction + +" +function s:handler.onOpen(word, mode) + call fuf#openFile(a:word, a:mode, g:fuf_reuseWindow) +endfunction + +" +function s:handler.onModeEnterPre() +endfunction + +" +function s:handler.onModeEnterPost() + " NOTE: Comparing filenames is faster than bufnr('^' . fname . '$') + let bufNamePrev = fnamemodify(bufname(self.bufNrPrev), ':~:.') + let self.items = copy(s:enumItems()) + call filter(self.items, 'v:val.word !=# bufNamePrev') +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/dir.vim b/autoload/fuf/dir.vim new file mode 100644 index 0000000..5316093 --- /dev/null +++ b/autoload/fuf/dir.vim @@ -0,0 +1,132 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#dir#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#dir#getSwitchOrder() + return g:fuf_dir_switchOrder +endfunction + +" +function fuf#dir#getEditableDataNames() + return [] +endfunction + +" +function fuf#dir#renewCache() + let s:cache = {} +endfunction + +" +function fuf#dir#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#dir#onInit() + call fuf#defineLaunchCommand('FufDir' , s:MODE_NAME, '""', []) + call fuf#defineLaunchCommand('FufDirWithFullCwd' , s:MODE_NAME, 'fnamemodify(getcwd(), '':p'')', []) + call fuf#defineLaunchCommand('FufDirWithCurrentBufferDir', s:MODE_NAME, 'expand(''%:~:.'')[:-1-len(expand(''%:~:.:t''))]', []) +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') + +" +function s:enumItems(dir) + let key = getcwd() . g:fuf_ignoreCase . g:fuf_dir_exclude . "\n" . a:dir + if !exists('s:cache[key]') + let s:cache[key] = fuf#enumExpandedDirsEntries(a:dir, g:fuf_dir_exclude) + call filter(s:cache[key], 'v:val.word =~# ''[/\\]$''') + if isdirectory(a:dir) + call insert(s:cache[key], fuf#makePathItem(a:dir . '.', '', 0)) + endif + call fuf#mapToSetSerialIndex(s:cache[key], 1) + call fuf#mapToSetAbbrWithSnippedWordAsPath(s:cache[key]) + endif + return s:cache[key] +endfunction + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(g:fuf_dir_prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return g:fuf_previewHeight +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return a:enteredPattern =~# '[^/\\]$' +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForPathTail', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + return fuf#makePreviewLinesAround( + \ fuf#glob(fnamemodify(a:word, ':p') . '*'), + \ [], a:count, self.getPreviewHeight()) + return +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return s:enumItems(fuf#splitPath(a:patternPrimary).head) +endfunction + +" +function s:handler.onOpen(word, mode) + execute ':cd ' . fnameescape(a:word) +endfunction + +" +function s:handler.onModeEnterPre() +endfunction + +" +function s:handler.onModeEnterPost() +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/file.vim b/autoload/fuf/file.vim new file mode 100644 index 0000000..1569192 --- /dev/null +++ b/autoload/fuf/file.vim @@ -0,0 +1,139 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#file#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#file#getSwitchOrder() + return g:fuf_file_switchOrder +endfunction + +" +function fuf#file#getEditableDataNames() + return [] +endfunction + +" +function fuf#file#renewCache() + let s:cache = {} +endfunction + +" +function fuf#file#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#file#onInit() + call fuf#defineLaunchCommand('FufFile' , s:MODE_NAME, '""', []) + call fuf#defineLaunchCommand('FufFileWithFullCwd' , s:MODE_NAME, 'fnamemodify(getcwd(), '':p'')', []) + call fuf#defineLaunchCommand('FufFileWithCurrentBufferDir', s:MODE_NAME, 'expand(''%:~:.'')[:-1-len(expand(''%:~:.:t''))]', []) +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') + +" +function s:enumItems(dir) + let key = join([getcwd(), g:fuf_ignoreCase, g:fuf_file_exclude, a:dir], "\n") + if !exists('s:cache[key]') + let s:cache[key] = fuf#enumExpandedDirsEntries(a:dir, g:fuf_file_exclude) + call fuf#mapToSetSerialIndex(s:cache[key], 1) + call fuf#mapToSetAbbrWithSnippedWordAsPath(s:cache[key]) + endif + return s:cache[key] +endfunction + +" +function s:enumNonCurrentItems(dir, bufNrPrev, cache) + let key = a:dir . 'AVOIDING EMPTY KEY' + if !exists('a:cache[key]') + " NOTE: Comparing filenames is faster than bufnr('^' . fname . '$') + let bufNamePrev = bufname(a:bufNrPrev) + let a:cache[key] = + \ filter(copy(s:enumItems(a:dir)), 'v:val.word !=# bufNamePrev') + endif + return a:cache[key] +endfunction + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(g:fuf_file_prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return g:fuf_previewHeight +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return a:enteredPattern =~# '[^/\\]$' +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForPathTail', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + return fuf#makePreviewLinesForFile(a:word, a:count, self.getPreviewHeight()) +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return s:enumNonCurrentItems( + \ fuf#splitPath(a:patternPrimary).head, self.bufNrPrev, self.cache) +endfunction + +" +function s:handler.onOpen(word, mode) + call fuf#openFile(a:word, a:mode, g:fuf_reuseWindow) +endfunction + +" +function s:handler.onModeEnterPre() +endfunction + +" +function s:handler.onModeEnterPost() + let self.cache = {} +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/givencmd.vim b/autoload/fuf/givencmd.vim new file mode 100644 index 0000000..d59178c --- /dev/null +++ b/autoload/fuf/givencmd.vim @@ -0,0 +1,123 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#givencmd#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#givencmd#getSwitchOrder() + return -1 +endfunction + +" +function fuf#givencmd#getEditableDataNames() + return [] +endfunction + +" +function fuf#givencmd#renewCache() +endfunction + +" +function fuf#givencmd#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#givencmd#onInit() +endfunction + +" +function fuf#givencmd#launch(initialPattern, partialMatching, prompt, items) + let s:prompt = (empty(a:prompt) ? '>' : a:prompt) + let s:items = copy(a:items) + call map(s:items, 'fuf#makeNonPathItem(v:val, "")') + call fuf#mapToSetSerialIndex(s:items, 1) + call map(s:items, 'fuf#setAbbrWithFormattedWord(v:val, 1)') + call fuf#launch(s:MODE_NAME, a:initialPattern, a:partialMatching) +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(s:prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return 0 +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForNonPath', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + return [] +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return s:items +endfunction + +" +function s:handler.onOpen(word, mode) + if a:word[0] =~# '[:/?]' + call histadd(a:word[0], a:word[1:]) + endif + call feedkeys(a:word . "\", 'n') +endfunction + +" +function s:handler.onModeEnterPre() +endfunction + +" +function s:handler.onModeEnterPost() +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/givendir.vim b/autoload/fuf/givendir.vim new file mode 100644 index 0000000..e654d85 --- /dev/null +++ b/autoload/fuf/givendir.vim @@ -0,0 +1,123 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#givendir#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#givendir#getSwitchOrder() + return -1 +endfunction + +" +function fuf#givendir#getEditableDataNames() + return [] +endfunction + +" +function fuf#givendir#renewCache() +endfunction + +" +function fuf#givendir#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#givendir#onInit() +endfunction + +" +function fuf#givendir#launch(initialPattern, partialMatching, prompt, items) + let s:prompt = (empty(a:prompt) ? '>' : a:prompt) + let s:items = map(copy(a:items), 'substitute(v:val, ''[/\\]\?$'', "", "")') + let s:items = map(s:items, 'fuf#makePathItem(v:val, "", 0)') + call fuf#mapToSetSerialIndex(s:items, 1) + call fuf#mapToSetAbbrWithSnippedWordAsPath(s:items) + call fuf#launch(s:MODE_NAME, a:initialPattern, a:partialMatching) +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(s:prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return g:fuf_previewHeight +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForPath', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + return fuf#makePreviewLinesAround( + \ fuf#glob(fnamemodify(a:word, ':p') . '*'), + \ [], a:count, self.getPreviewHeight()) + return +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return s:items +endfunction + +" +function s:handler.onOpen(word, mode) + execute ':cd ' . fnameescape(a:word) +endfunction + +" +function s:handler.onModeEnterPre() +endfunction + +" +function s:handler.onModeEnterPost() +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/givenfile.vim b/autoload/fuf/givenfile.vim new file mode 100644 index 0000000..5419ff8 --- /dev/null +++ b/autoload/fuf/givenfile.vim @@ -0,0 +1,121 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#givenfile#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#givenfile#getSwitchOrder() + return -1 +endfunction + +" +function fuf#givenfile#getEditableDataNames() + return [] +endfunction + +" +function fuf#givenfile#renewCache() +endfunction + +" +function fuf#givenfile#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#givenfile#onInit() +endfunction + +" +function fuf#givenfile#launch(initialPattern, partialMatching, prompt, items) + let s:prompt = (empty(a:prompt) ? '>' : a:prompt) + let s:items = map(copy(a:items), 'fuf#makePathItem(v:val, "", 0)') + call fuf#mapToSetSerialIndex(s:items, 1) + call map(s:items, 'fuf#setAbbrWithFormattedWord(v:val, 1)') + call fuf#launch(s:MODE_NAME, a:initialPattern, a:partialMatching) +endfunction + + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(s:prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return g:fuf_previewHeight +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForPath', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + return fuf#makePreviewLinesForFile(a:word, a:count, self.getPreviewHeight()) +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return s:items +endfunction + +" +function s:handler.onOpen(word, mode) + call fuf#openFile(a:word, a:mode, g:fuf_reuseWindow) +endfunction + + +" +function s:handler.onModeEnterPre() +endfunction + +" +function s:handler.onModeEnterPost() +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/help.vim b/autoload/fuf/help.vim new file mode 100644 index 0000000..8f03e36 --- /dev/null +++ b/autoload/fuf/help.vim @@ -0,0 +1,198 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#help#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#help#getSwitchOrder() + return g:fuf_help_switchOrder +endfunction + +" +function fuf#help#getEditableDataNames() + return [] +endfunction + +" +function fuf#help#renewCache() + let s:cache = {} +endfunction + +" +function fuf#help#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#help#onInit() + call fuf#defineLaunchCommand('FufHelp' , s:MODE_NAME, '""', []) + call fuf#defineLaunchCommand('FufHelpWithCursorWord', s:MODE_NAME, 'expand('''')', []) +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') + +" +function s:getCurrentHelpTagFiles() + let prefix = 'doc' . l9#getPathSeparator() + let tagFiles = split(globpath(&runtimepath, prefix . 'tags' ), "\n") + \ + split(globpath(&runtimepath, prefix . 'tags-??'), "\n") + return sort(map(tagFiles, 'fnamemodify(v:val, ":p")')) +endfunction + +" +function s:parseHelpTagEntry(line, tagFile) + let elements = split(a:line, "\t") + if len(elements) != 3 || elements[0][0] ==# '!' + return {} + endif + let suffix = matchstr(a:tagFile, '-\zs..$') + if empty(suffix) + let suffix = '@en' + else + let suffix = '@' . suffix + endif + let dir = fnamemodify(a:tagFile, ':h') . l9#getPathSeparator() + return { + \ 'word' : elements[0] . suffix, + \ 'path' : dir . elements[1], + \ 'pattern': elements[2][1:], + \ } +endfunction + +" +function s:getHelpTagEntries(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) + let cacheName = 'cache-' . l9#hash224(a:key) + let cacheTime = fuf#getDataFileTime(s:MODE_NAME, cacheName) + if cacheTime != -1 && fuf#countModifiedFiles(a:tagFiles, cacheTime) == 0 + return fuf#loadDataFile(s:MODE_NAME, cacheName) + endif + let items = l9#unique(l9#concat(map(copy(a:tagFiles), 's:getHelpTagEntries(v:val)'))) + let items = map(items, 'extend(v:val, fuf#makeNonPathItem(v:val.word, ""))') + call fuf#mapToSetSerialIndex(items, 1) + let items = map(items, 'fuf#setAbbrWithFormattedWord(v:val, 1)') + call fuf#saveDataFile(s:MODE_NAME, cacheName, items) + return items +endfunction + +" +function s:enumHelpTags(tagFiles) + if !len(a:tagFiles) + return [] + endif + let key = join([g:fuf_ignoreCase] + a:tagFiles, "\n") + if !exists('s:cache[key]') || fuf#countModifiedFiles(a:tagFiles, s:cache[key].time) + let s:cache[key] = { + \ 'time' : localtime(), + \ 'items' : s:parseHelpTagFiles(a:tagFiles, key) + \ } + endif + return s:cache[key].items +endfunction + +" +function s:getMatchingIndex(lines, pattern) + if empty(a:pattern) + return -1 + endif + for i in range(len(a:lines)) + if stridx(a:lines[i], a:pattern) >= 0 + return i + endif + endfor + return -1 +endfunction + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(g:fuf_help_prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return g:fuf_previewHeight +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForNonPath', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + let items = filter(copy(s:enumHelpTags(self.tagFiles)), 'v:val.word ==# a:word') + if empty(items) + return [] + endif + let lines = fuf#getFileLines(items[0].path) + let index = s:getMatchingIndex(lines, items[0].pattern) + return [items[0].path . ':'] + fuf#makePreviewLinesAround( + \ lines, (index < 0 ? [] : [index]), a:count, self.getPreviewHeight() - 1) +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return s:enumHelpTags(self.tagFiles) +endfunction + +" +function s:handler.onOpen(word, mode) + call fuf#openHelp(a:word, a:mode) +endfunction + +" +function s:handler.onModeEnterPre() + let self.tagFiles = s:getCurrentHelpTagFiles() +endfunction + +" +function s:handler.onModeEnterPost() +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/jumplist.vim b/autoload/fuf/jumplist.vim new file mode 100644 index 0000000..ddbb1ab --- /dev/null +++ b/autoload/fuf/jumplist.vim @@ -0,0 +1,182 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#jumplist#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#jumplist#getSwitchOrder() + return g:fuf_jumplist_switchOrder +endfunction + +" +function fuf#jumplist#getEditableDataNames() + return [] +endfunction + +" +function fuf#jumplist#renewCache() +endfunction + +" +function fuf#jumplist#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#jumplist#onInit() + call fuf#defineLaunchCommand('FufJumpList', s:MODE_NAME, '""', []) +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') + +" +function s:getJumpsLines() + redir => result + :silent jumps + redir END + return split(result, "\n") +endfunction + +" +function s:parseJumpsLine(line, bufnrPrev) + "return matchlist(a:line, '^\(.\)\s\+\(\d\+\)\s\(.*\)$') + let elements = matchlist(a:line, '\v^(.)\s*(\d+)\s+(\d+)\s+(\d+)\s*(.*)$') + if empty(elements) + return {} + endif + let linePrevBuffer = join(getbufline(a:bufnrPrev, elements[3])) + if stridx(linePrevBuffer, elements[5]) >= 0 + let fname = bufname(a:bufnrPrev) + let text = elements[5] + else + let fname = elements[5] + let text = join(getbufline('^' . elements[5] . '$', elements[3])) + endif + return { + \ 'prefix': elements[1], + \ 'count' : elements[2], + \ 'lnum' : elements[3], + \ 'fname' : fname, + \ 'text' : printf('%s|%d:%d|%s', fname, elements[3], elements[4], text), + \ } +endfunction + +" +function s:makeItem(line, bufnrPrev) + let parsed = s:parseJumpsLine(a:line, a:bufnrPrev) + if empty(parsed) + return {} + endif + let item = fuf#makeNonPathItem(parsed.text, '') + let item.abbrPrefix = parsed.prefix + let item.lnum = parsed.lnum + let item.fname = parsed.fname + return item +endfunction + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(g:fuf_jumplist_prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return g:fuf_previewHeight +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForNonPath', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + let items = filter(copy(self.items), 'v:val.word ==# a:word') + if empty(items) + return [] + endif + let lines = fuf#getFileLines(items[0].fname) + return fuf#makePreviewLinesAround( + \ lines, [items[0].lnum - 1], a:count, self.getPreviewHeight()) +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return self.items +endfunction + +" +function s:handler.onOpen(word, mode) + call fuf#prejump(a:mode) + let older = 0 + for line in reverse(s:getJumpsLines()) + if stridx(line, '>') == 0 + let older = 1 + endif + let parsed = s:parseJumpsLine(line, self.bufNrPrev) + if !empty(parsed) && parsed.text ==# a:word + if parsed.count != 0 + execute 'normal! ' . parsed.count . (older ? "\" : "\") . 'zvzz' + endif + break + endif + endfor +endfunction + +" +function s:handler.onModeEnterPre() + let self.items = s:getJumpsLines() +endfunction + +" +function s:handler.onModeEnterPost() + call map(self.items, 's:makeItem(v:val, self.bufNrPrev)') + call filter(self.items, '!empty(v:val)') + call reverse(self.items) + call fuf#mapToSetSerialIndex(self.items, 1) + call map(self.items, 'fuf#setAbbrWithFormattedWord(v:val, 1)') +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: + diff --git a/autoload/fuf/line.vim b/autoload/fuf/line.vim new file mode 100644 index 0000000..60447b5 --- /dev/null +++ b/autoload/fuf/line.vim @@ -0,0 +1,135 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#line#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#line#getSwitchOrder() + return g:fuf_line_switchOrder +endfunction + +" +function fuf#line#getEditableDataNames() + return [] +endfunction + +" +function fuf#line#renewCache() +endfunction + +" +function fuf#line#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#line#onInit() + call fuf#defineLaunchCommand('FufLine', s:MODE_NAME, '""', []) +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') +let s:OPEN_TYPE_DELETE = -1 + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(g:fuf_line_prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return g:fuf_previewHeight +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForNonPath', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + let items = filter(copy(self.items), 'v:val.word ==# a:word') + if empty(items) + return [] + endif + let lines = fuf#getFileLines(self.bufNrPrev) + return fuf#makePreviewLinesAround( + \ lines, [items[0].index - 1], a:count, self.getPreviewHeight()) +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return self.items +endfunction + +" +function s:handler.onOpen(word, mode) + call fuf#prejump(a:mode) + call filter(self.items, 'v:val.word ==# a:word') + if empty(self.items) + return + execute 'cc ' . self.items[0].index + endif + call cursor(self.items[0].index, 0) + normal! zvzz +endfunction + +" +function s:handler.onModeEnterPre() +endfunction + +" +function s:handler.onModeEnterPost() + let tab = repeat(' ', getbufvar(self.bufNrPrev, '&tabstop')) + let self.items = getbufline(self.bufNrPrev, 1, '$') + let lnumFormat = '%' . len(string(len(self.items) + 1)) . 'd|' + for i in range(len(self.items)) + let self.items[i] = printf(lnumFormat, i + 1) + \ . substitute(self.items[i], "\t", tab, 'g') + endfor + call map(self.items, 'fuf#makeNonPathItem(v:val, "")') + call fuf#mapToSetSerialIndex(self.items, 1) + call map(self.items, 'fuf#setAbbrWithFormattedWord(v:val, 0)') +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/mrucmd.vim b/autoload/fuf/mrucmd.vim new file mode 100644 index 0000000..58632ce --- /dev/null +++ b/autoload/fuf/mrucmd.vim @@ -0,0 +1,134 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#mrucmd#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#mrucmd#getSwitchOrder() + return g:fuf_mrucmd_switchOrder +endfunction + +" +function fuf#mrucmd#getEditableDataNames() + return ['items'] +endfunction + +" +function fuf#mrucmd#renewCache() +endfunction + +" +function fuf#mrucmd#requiresOnCommandPre() + return 1 +endfunction + +" +function fuf#mrucmd#onInit() + call fuf#defineLaunchCommand('FufMruCmd', s:MODE_NAME, '""', []) +endfunction + +" +function fuf#mrucmd#onCommandPre(cmd) + if getcmdtype() =~# '^[:/?]' + call s:updateInfo(a:cmd) + endif +endfunction + + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') + +" +function s:updateInfo(cmd) + let items = fuf#loadDataFile(s:MODE_NAME, 'items') + let items = fuf#updateMruList( + \ items, { 'word' : a:cmd, 'time' : localtime() }, + \ g:fuf_mrucmd_maxItem, g:fuf_mrucmd_exclude) + call fuf#saveDataFile(s:MODE_NAME, 'items', items) +endfunction + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(g:fuf_mrucmd_prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return 0 +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForNonPath', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + return [] +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return self.items +endfunction + +" +function s:handler.onOpen(word, mode) + call s:updateInfo(a:word) + call histadd(a:word[0], a:word[1:]) + call feedkeys(a:word . "\", 'n') +endfunction + +" +function s:handler.onModeEnterPre() +endfunction + +" +function s:handler.onModeEnterPost() + let self.items = fuf#loadDataFile(s:MODE_NAME, 'items') + 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)') +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/mrufile.vim b/autoload/fuf/mrufile.vim new file mode 100644 index 0000000..f90b9e3 --- /dev/null +++ b/autoload/fuf/mrufile.vim @@ -0,0 +1,234 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#mrufile#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#mrufile#getSwitchOrder() + return g:fuf_mrufile_switchOrder +endfunction + +" +function fuf#mrufile#getEditableDataNames() + return ['items', 'itemdirs'] +endfunction + +" +function fuf#mrufile#renewCache() + let s:cache = {} + let s:aroundCache = {} +endfunction + +" +function fuf#mrufile#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#mrufile#onInit() + call fuf#defineLaunchCommand('FufMruFile', s:MODE_NAME, '""', []) + call fuf#defineLaunchCommand('FufMruFileInCwd', s:MODE_NAME, + \ '""', [['g:fuf_mrufile_underCwd', 1]]) + call l9#defineVariableDefault('g:fuf_mrufile_underCwd', 0) " private option + call l9#defineVariableDefault('g:fuf_mrufile_searchAroundLevel', -1) " private option + augroup fuf#mrufile + autocmd! + autocmd BufEnter * call s:updateData() + autocmd BufWritePost * call s:updateData() + augroup END +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') +let s:OPEN_TYPE_EXPAND = -1 + +" +function s:updateData() + if !empty(&buftype) || !filereadable(expand('%')) + return + endif + let items = fuf#loadDataFile(s:MODE_NAME, 'items') + let items = fuf#updateMruList( + \ items, { 'word' : expand('%:p'), 'time' : localtime() }, + \ g:fuf_mrufile_maxItem, g:fuf_mrufile_exclude) + call fuf#saveDataFile(s:MODE_NAME, 'items', items) + call s:removeItemFromCache(expand('%:p')) + let itemDirs = fuf#loadDataFile(s:MODE_NAME, 'itemdirs') + let itemDirs = fuf#updateMruList( + \ itemDirs, { 'word' : expand('%:p:h') }, + \ g:fuf_mrufile_maxItemDir, g:fuf_mrufile_exclude) + call fuf#saveDataFile(s:MODE_NAME, 'itemdirs', itemDirs) +endfunction + +" +function s:removeItemFromCache(word) + for items in values(s:cache) + if exists('items[a:word]') + unlet items[a:word] + endif + endfor +endfunction + +" returns empty value if invalid item +function s:formatItemUsingCache(item) + if a:item.word !~ '\S' + return {} + endif + if !exists('s:cache[a:item.word]') + if filereadable(a:item.word) + let s:cache[a:item.word] = fuf#makePathItem( + \ fnamemodify(a:item.word, ':p:~'), strftime(g:fuf_timeFormat, a:item.time), 0) + else + let s:cache[a:item.word] = {} + endif + endif + return s:cache[a:item.word] +endfunction + +" +function s:expandSearchDir(dir, level) + let dirs = [a:dir] + let dirPrev = a:dir + for i in range(a:level) + let dirPrev = l9#concatPaths([dirPrev, '*']) + call add(dirs, dirPrev) + endfor + let dirPrev = a:dir + for i in range(a:level) + let dirPrevPrev = dirPrev + let dirPrev = fnamemodify(dirPrev, ':h') + if dirPrevPrev ==# dirPrev + break + endif + call add(dirs, dirPrev) + endfor + return dirs +endfunction + +" +function s:listAroundFiles(dir) + if !exists('s:aroundCache[a:dir]') + let s:aroundCache[a:dir] = [a:dir] + + \ fuf#glob(l9#concatPaths([a:dir, '*' ])) + + \ fuf#glob(l9#concatPaths([a:dir, '.*'])) + call filter(s:aroundCache[a:dir], 'filereadable(v:val)') + call map(s:aroundCache[a:dir], 'fuf#makePathItem(fnamemodify(v:val, ":~"), "", 0)') + if len(g:fuf_mrufile_exclude) + call filter(s:aroundCache[a:dir], 'v:val.word !~ g:fuf_mrufile_exclude') + endif + endif + return s:aroundCache[a:dir] +endfunction + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + let cwdString = (g:fuf_mrufile_underCwd ? '[CWD]' : '') + let levelString = (g:fuf_mrufile_searchAroundLevel < 0 ? '' + \ : '[Around:' . g:fuf_mrufile_searchAroundLevel . ']') + return fuf#formatPrompt(g:fuf_mrufile_prompt, self.partialMatching, cwdString . levelString) +endfunction + +" +function s:handler.getPreviewHeight() + return g:fuf_previewHeight +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForPath', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + return fuf#makePreviewLinesForFile(a:word, a:count, self.getPreviewHeight()) +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return self.items +endfunction + +" +function s:handler.onOpen(word, mode) + if a:mode ==# s:OPEN_TYPE_EXPAND + let nextLevel = (self.searchAroundLevel < 0 ? 0 : self.searchAroundLevel + 1) + call fuf#setOneTimeVariables(['g:fuf_mrufile_searchAroundLevel', nextLevel]) + let self.reservedMode = self.getModeName() + return + else + call fuf#openFile(a:word, a:mode, g:fuf_reuseWindow) + endif +endfunction + +" +function s:handler.onModeEnterPre() +endfunction + +" +function s:handler.onModeEnterPost() + let self.searchAroundLevel = g:fuf_mrufile_searchAroundLevel + call fuf#defineKeyMappingInHandler(g:fuf_mrufile_keyExpand, + \ 'onCr(' . s:OPEN_TYPE_EXPAND . ')') + if self.searchAroundLevel < 0 + let self.items = fuf#loadDataFile(s:MODE_NAME, 'items') + call map(self.items, 's:formatItemUsingCache(v:val)') + else + let self.items = fuf#loadDataFile(s:MODE_NAME, 'itemdirs') + call map(self.items, 's:expandSearchDir(v:val.word, g:fuf_mrufile_searchAroundLevel)') + let self.items = l9#concat(self.items) + let self.items = l9#unique(self.items) + call map(self.items, 's:listAroundFiles(v:val)') + let self.items = l9#concat(self.items) + endif + " NOTE: Comparing filenames is faster than bufnr('^' . fname . '$') + let bufNamePrev = fnamemodify(bufname(self.bufNrPrev), ':p:~') + call filter(self.items, '!empty(v:val) && v:val.word !=# bufNamePrev') + if g:fuf_mrufile_underCwd + let cwd = fnamemodify(getcwd(), ':p:~') + call filter(self.items, 'stridx(v:val.word, cwd) == 0') + endif + call fuf#mapToSetSerialIndex(self.items, 1) + call fuf#mapToSetAbbrWithSnippedWordAsPath(self.items) +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/quickfix.vim b/autoload/fuf/quickfix.vim new file mode 100644 index 0000000..dd5d67c --- /dev/null +++ b/autoload/fuf/quickfix.vim @@ -0,0 +1,154 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#quickfix#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#quickfix#getSwitchOrder() + return g:fuf_quickfix_switchOrder +endfunction + +" +function fuf#quickfix#getEditableDataNames() + return [] +endfunction + +" +function fuf#quickfix#renewCache() +endfunction + +" +function fuf#quickfix#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#quickfix#onInit() + call fuf#defineLaunchCommand('FufQuickfix', s:MODE_NAME, '""', []) +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') + +" +function s:getJumpsLines() + redir => result + :silent jumps + redir END + return split(result, "\n") +endfunction + +" +function s:parseJumpsLine(line) + return matchlist(a:line, '^\(.\)\s\+\(\d\+\)\s\(.*\)$') +endfunction + +" +function s:makeItem(qfItem) + if !a:qfItem.valid + return {} + endif + let item = fuf#makeNonPathItem( + \ printf('%s|%d:%d|%s', bufname(a:qfItem.bufnr), a:qfItem.lnum, + \ a:qfItem.col, matchstr(a:qfItem.text, '\s*\zs.*\S')) + \ , '') + let item.bufnr = a:qfItem.bufnr + let item.lnum = a:qfItem.lnum + return item +endfunction + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(g:fuf_quickfix_prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return g:fuf_previewHeight +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForNonPath', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + let items = filter(copy(self.items), 'v:val.word ==# a:word') + if empty(items) + return [] + endif + let lines = fuf#getFileLines(items[0].bufnr) + return fuf#makePreviewLinesAround( + \ lines, [items[0].lnum - 1], a:count, self.getPreviewHeight()) +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return self.items +endfunction + +" +function s:handler.onOpen(word, mode) + call fuf#prejump(a:mode) + call filter(self.items, 'v:val.word ==# a:word') + if !empty(self.items) + execute 'cc ' . self.items[0].index + endif +endfunction + +" +function s:handler.onModeEnterPre() +endfunction + +" +function s:handler.onModeEnterPost() + let self.items = getqflist() + call map(self.items, 's:makeItem(v:val)') + call fuf#mapToSetSerialIndex(self.items, 1) + call filter(self.items, 'exists("v:val.word")') + call map(self.items, 'fuf#setAbbrWithFormattedWord(v:val, 1)') +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: + diff --git a/autoload/fuf/tag.vim b/autoload/fuf/tag.vim new file mode 100644 index 0000000..362cabf --- /dev/null +++ b/autoload/fuf/tag.vim @@ -0,0 +1,178 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#tag#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#tag#getSwitchOrder() + return g:fuf_tag_switchOrder +endfunction + +" +function fuf#tag#getEditableDataNames() + return [] +endfunction + +" +function fuf#tag#renewCache() + let s:cache = {} +endfunction + +" +function fuf#tag#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#tag#onInit() + call fuf#defineLaunchCommand('FufTag' , s:MODE_NAME, '""', []) + call fuf#defineLaunchCommand('FufTagWithCursorWord', s:MODE_NAME, 'expand('''')', []) +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') + +" +function s:getTagNames(tagFile) + let names = map(l9#readFile(a:tagFile), 'matchstr(v:val, ''^[^!\t][^\t]*'')') + return filter(names, 'v:val =~# ''\S''') +endfunction + +" +function s:parseTagFiles(tagFiles, key) + let cacheName = 'cache-' . l9#hash224(a:key) + let cacheTime = fuf#getDataFileTime(s:MODE_NAME, cacheName) + if cacheTime != -1 && fuf#countModifiedFiles(a:tagFiles, cacheTime) == 0 + return fuf#loadDataFile(s:MODE_NAME, cacheName) + endif + let items = l9#unique(l9#concat(map(copy(a:tagFiles), 's:getTagNames(v:val)'))) + let items = map(items, 'fuf#makeNonPathItem(v:val, "")') + call fuf#mapToSetSerialIndex(items, 1) + let items = map(items, 'fuf#setAbbrWithFormattedWord(v:val, 1)') + call fuf#saveDataFile(s:MODE_NAME, cacheName, items) + return items +endfunction + +" +function s:enumTags(tagFiles) + if !len(a:tagFiles) + return [] + endif + let key = join([g:fuf_ignoreCase] + a:tagFiles, "\n") + if !exists('s:cache[key]') || fuf#countModifiedFiles(a:tagFiles, s:cache[key].time) + let s:cache[key] = { + \ 'time' : localtime(), + \ 'items' : s:parseTagFiles(a:tagFiles, key) + \ } + endif + return s:cache[key].items +endfunction + +" +function s:getMatchingIndex(lines, cmd) + if a:cmd !~# '\D' + return str2nr(a:cmd) + endif + let pattern = matchstr(a:cmd, '^\/\^\zs.*\ze\$\/$') + if empty(pattern) + return -1 + endif + for i in range(len(a:lines)) + if a:lines[i] ==# pattern + return i + endif + endfor + return -1 +endfunction + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(g:fuf_tag_prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return g:fuf_previewHeight +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForNonPath', + \ self.partialMatching) +endfunction + +" 'cmd' is '/^hoge hoge$/' or line number +function s:handler.makePreviewLines(word, count) + let tags = taglist('^' . a:word . '$') + if empty(tags) + return [] + endif + let i = a:count % len(tags) + let title = printf('(%d/%d) %s', i + 1, len(tags), tags[i].filename) + let lines = fuf#getFileLines(tags[i].filename) + let index = s:getMatchingIndex(lines, tags[i].cmd) + return [title] + fuf#makePreviewLinesAround( + \ lines, (index < 0 ? [] : [index]), 0, self.getPreviewHeight() - 1) +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return s:enumTags(self.tagFiles) +endfunction + +" +function s:handler.onOpen(word, mode) + call fuf#openTag(a:word, a:mode) +endfunction + +" +function s:handler.onModeEnterPre() + let self.tagFiles = fuf#getCurrentTagFiles() +endfunction + +" +function s:handler.onModeEnterPost() + let &l:tags = join(self.tagFiles, ',') +endfunction + +" +function s:handler.onModeLeavePost(opened) + let &l:tags = '' +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: diff --git a/autoload/fuf/taggedfile.vim b/autoload/fuf/taggedfile.vim new file mode 100644 index 0000000..74652fc --- /dev/null +++ b/autoload/fuf/taggedfile.vim @@ -0,0 +1,159 @@ +"============================================================================= +" Copyright (c) 2007-2010 Takeshi NISHIDA +" +"============================================================================= +" LOAD GUARD {{{1 + +if !l9#guardScriptLoading(expand(':p'), 0, 0, []) + finish +endif + +" }}}1 +"============================================================================= +" GLOBAL FUNCTIONS {{{1 + +" +function fuf#taggedfile#createHandler(base) + return a:base.concretize(copy(s:handler)) +endfunction + +" +function fuf#taggedfile#getSwitchOrder() + return g:fuf_taggedfile_switchOrder +endfunction + +" +function fuf#taggedfile#getEditableDataNames() + return [] +endfunction + +" +function fuf#taggedfile#renewCache() + let s:cache = {} +endfunction + +" +function fuf#taggedfile#requiresOnCommandPre() + return 0 +endfunction + +" +function fuf#taggedfile#onInit() + call fuf#defineLaunchCommand('FufTaggedFile', s:MODE_NAME, '""', []) +endfunction + +" }}}1 +"============================================================================= +" LOCAL FUNCTIONS/VARIABLES {{{1 + +let s:MODE_NAME = expand(':t:r') + +" +function s:getTaggedFileList(tagfile) + execute 'cd ' . fnamemodify(a:tagfile, ':h') + 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(l9#readFile(a:tagfile), 'fnamemodify(v:val, ":~:.")') + return filter(result, 'v:val =~# ''[^/\\ ]$''') +endfunction + +" +function s:parseTagFiles(tagFiles, key) + let cacheName = 'cache-' . l9#hash224(a:key) + let cacheTime = fuf#getDataFileTime(s:MODE_NAME, cacheName) + if cacheTime != -1 && fuf#countModifiedFiles(a:tagFiles, cacheTime) == 0 + return fuf#loadDataFile(s:MODE_NAME, cacheName) + endif + let items = l9#unique(l9#concat(map(copy(a:tagFiles), 's:getTaggedFileList(v:val)'))) + call map(items, 'fuf#makePathItem(v:val, "", 0)') + call fuf#mapToSetSerialIndex(items, 1) + call fuf#mapToSetAbbrWithSnippedWordAsPath(items) + call fuf#saveDataFile(s:MODE_NAME, cacheName, items) + return items +endfunction + +" +function s:enumTaggedFiles(tagFiles) + if !len(a:tagFiles) + return [] + endif + let key = join([getcwd(), g:fuf_ignoreCase] + a:tagFiles, "\n") + if !exists('s:cache[key]') || fuf#countModifiedFiles(a:tagFiles, s:cache[key].time) + let s:cache[key] = { + \ 'time' : localtime(), + \ 'items' : s:parseTagFiles(a:tagFiles, key) + \ } + endif + return s:cache[key].items +endfunction + +" }}}1 +"============================================================================= +" s:handler {{{1 + +let s:handler = {} + +" +function s:handler.getModeName() + return s:MODE_NAME +endfunction + +" +function s:handler.getPrompt() + return fuf#formatPrompt(g:fuf_taggedfile_prompt, self.partialMatching, '') +endfunction + +" +function s:handler.getPreviewHeight() + return g:fuf_previewHeight +endfunction + +" +function s:handler.isOpenable(enteredPattern) + return 1 +endfunction + +" +function s:handler.makePatternSet(patternBase) + return fuf#makePatternSet(a:patternBase, 's:interpretPrimaryPatternForPath', + \ self.partialMatching) +endfunction + +" +function s:handler.makePreviewLines(word, count) + return fuf#makePreviewLinesForFile(a:word, a:count, self.getPreviewHeight()) +endfunction + +" +function s:handler.getCompleteItems(patternPrimary) + return self.items +endfunction + +" +function s:handler.onOpen(word, mode) + call fuf#openFile(a:word, a:mode, g:fuf_reuseWindow) +endfunction + +" +function s:handler.onModeEnterPre() + let self.tagFiles = fuf#getCurrentTagFiles() +endfunction + +" +function s:handler.onModeEnterPost() + " NOTE: Comparing filenames is faster than bufnr('^' . fname . '$') + let bufNamePrev = fnamemodify(bufname(self.bufNrPrev), ':p:~:.') + " NOTE: Don't do this in onModeEnterPre() + " because that should return in a short time. + let self.items = copy(s:enumTaggedFiles(self.tagFiles)) + call filter(self.items, 'v:val.word !=# bufNamePrev') +endfunction + +" +function s:handler.onModeLeavePost(opened) +endfunction + +" }}}1 +"============================================================================= +" vim: set fdm=marker: -- cgit v1.2.3