24

http://www.vim.org/scripts/script.php?script_id=1984

您可以通过以下命令启动 FuzzyFinder:

     Command           Mode ~
    |:FufBuffer|     - Buffer mode (|fuf-buffer-mode|)
    |:FufFile|       - File mode (|fuf-file-mode|)
    |:FufDir|        - Directory mode (|fuf-dir-mode|)
    |:FufMruFile|    - MRU-File mode (|fuf-mrufile-mode|)
    |:FufMruCmd|     - MRU-Command mode (|fuf-mrucmd-mode|)
    |:FufBookmark|   - Bookmark mode (|fuf-bookmark-mode|)
    |:FufTag|        - Tag mode (|fuf-tag-mode|)
    |:FufTaggedFile| - Tagged-File mode (|fuf-taggedfile-mode|)
    |:FufJumpList|   - Jump-List mode (|fuf-jumplist-mode|)
    |:FufChangeList| - Change-List mode (|fuf-changelist-mode|)
    |:FufQuickfix|   - Quickfix mode (|fuf-quickfix-mode|)
    |:FufLine|       - Line mode (|fuf-line-mode|)
    |:FufHelp|       - Help mode (|fuf-help-mode|)

所以我最近才发现了 FuzzyFinder。对于已经使用了很长时间的任何人,您能否演示一下您如何实际组合使用这些命令、您所做的任何映射以及在使用它时应该知道的任何问题?

4

6 回答 6

13

FuzzyFinder 本身对我来说毫无用处。我将它与 FuzzyFinder-TextMate 和一个遍历所有文件和子目录以查找文件的 Ruby 库结合使用,就像 Mac 上 TextMate 的 Cmd+T 选项一样。您可以在这里看到它的实际效果。

不幸的是,由于原作者停止维护脚本,因此需要付出一些努力才能使其正常工作。尽管如此,仍有一些人定期向 github 发布更新。您将需要两个脚本fuzzyfinder_textmate.vimfuzzy_file_finder.rb.

最新版本与 Vim FuzzyFinder 2.22.3 结合使用没有问题。你的 Vim 必须用 Ruby 支持编译,否则它将无法工作。原作者的博客包含有关如何正确使用它的更多信息。或者,查看我的Vim 设置以了解如何使用它。该设置定义了两个键映射,s,并,e分别模糊查找文件并在新窗口或当前窗口中打开它:

function IdeFindTextMate()
  let g:FuzzyFinderOptions.Base.key_open = '<CR>'
  let g:FuzzyFinderOptions.Base.key_open_split = '<C-j>'
  exe "FuzzyFinderTextMate"
endfunction

function IdeSplitFindTextMate()
  let g:FuzzyFinderOptions.Base.key_open = '<C-j>'
  let g:FuzzyFinderOptions.Base.key_open_split = '<CR>'
  exe "FuzzyFinderTextMate"
endfunction

let mapleader = ","
map <silent> <leader>e :call IdeFindTextMate()<CR>
map <silent> <leader>s :call IdeSplitFindTextMate()<CR>

更新:

现在我使用出色的Command-T 插件而不是 FuzzyFinder。看看我的这个超级用户回答的原因。

于 2009-12-13T17:13:12.067 回答
10

聚会有点晚了,但我想补充一点,最新版本的 FuzzyFinder 有一个新命令::FufCoverageFile,它完全符合您的要求,即:

>CoverageFile>appcontr
  20: app/controllers/application_controller.rb
  22: app/views/layouts/application.html.erb
于 2011-09-18T19:54:53.017 回答
7

除了 Kris 的回答之外,您可能还想立即在 .vimrc 文件中映射 '**/',如下所示:

map ,f :FufFile **/<CR>

所以你只需要输入:

,fTest 

在所有子目录中查找 Test 的所有匹配项!

高温高压

于 2012-02-08T21:46:22.920 回答
6

我使用 :FufFile 映射到 ,b 并首先键入 **/ 后跟我要查找的字符串的前几个字符。

这提供了包含您的字符串的所有匹配文件的列表。

例如

,b
**/doc
    13: app/models/document.rb
    75: test/fixtures/documents.yml
    82: test/unit/document_test.rb
于 2011-04-01T22:33:33.563 回答
5

首先安装最新的模糊查找器脚本。然后...

配置

调整 .vimrc 中的一些配置:

" Truth be told, I don't remember what these do, but I must have
" found them necessary back when I installed fuzzyfinder years ago
let s:slash = '[/\\]'
let s:startname = '(^|'.s:slash.')'
let s:endname = '($|'.s:slash.')'

" directories and extensions to ignore when listing files
" these contain a lot of Python-isms, yours will probably vary
let s:extension = '\.bak|\.dll|\.exe|\.o|\.pyc|\.pyo|\.swp|\.swo'
let s:dirname = 'build|deploy|dist|vms|\.bzr|\.git|\.hg|\.svn|.+\.egg-info'
let g:fuf_file_exclude = '\v'.'('.s:startname.'('.s:dirname.')'.s:endname.')|(('.s:extension.')$)'
let g:fuf_dir_exclude = '\v'.s:startname.'('.s:dirname.')'.s:endname

" limit number of displayed matches
" (makes response instant even on huge source trees)
let g:fuf_enumeratingLimit = 60

我定义了一些快捷键来激活它:

nnoremap <Leader>f :FufFile **/<cr>
nnoremap <Leader>b :FufBuffer<cr>
nnoremap <Leader>t :FufTag<cr>

并重新启动 Vim 以重新读取 .vimrc 配置。

查找文件/缓冲区

现在我可以按 <leader>f 查看当前目录和子目录中的文件列表。开始输入,列表将被过滤为仅与您输入的内容(模糊)匹配的列表。使用光标键选择匹配项并输入以打开该文件。第一次在一个非常大的新项目中激活它时,可能需要一秒钟来缓存文件名。

同样,当您打开几个缓冲区时,按 <leader>b 从打开的缓冲区列表中进行选择。

查找标签

最重要的是标签匹配(即转到函数、类、方法等)。首先我们必须生成一个标签文件。

如果您不习惯标记文件,则必须手动执行此操作似乎很麻烦。请注意,许多工具使用标签文件,例如 Vim 本身会读取它们以启用“转到定义”,请参阅此答案末尾的链接,因此了解它们可能比您预期的更有价值。

安装最新的 ctags ( http://ctags.sourceforge.net/ ) 并确保它在您的 PATH 中,以便您可以从命令行调用它。对于 Python 等语言,最近的版本有了很大改进。然后在 .vimrc 中定义一个击键,以便在你的项目上轻松地重新运行它,同时吹走fuzzyfinder的缓存:

noremap <f12> :silent !ctags -R --languages=python .<cr>:FufRenewCache<cr>

或在 Windows 上:

noremap <f12> :!start /min ctags -R --languages=python .<cr>:FufRenewCache<cr>

(/min 是 Windows 特定的在后台运行命令的方式,这样 Vim 在索引非常大的项目时不会锁定)

重新启动 vim,然后按 f12 现在将扫描当前目录和子目录中的每个文件,并创建所有已定义函数、类等的索引。ctags 解析许多编程语言。输出到一个名为“标签”的文件。在您的项目根目录中运行它是有意义的(使用 Vim 的 :pwd 和 :cd 来确保您所在的位置),以便标签文件包含您项目中的所有内容。

所以现在你可以按 <leader>t 来查看项目中所有类、函数、方法等的列表。如上所述,开始输入,列表会被过滤到与您输入的内容匹配的列表。使用光标并回车选择一个,Vim 将转到定义该标签的文件/行。

陷阱

如果在您的项目中多次定义了一个标签(例如,一个与函数同名的类),那么fuzzyfinder 将提供一个菜单,以便您选择要跳转到的菜单。这可能有点烦人,因为默认情况下,ctags 会为 Python 文件生成太多标签定义。它不仅列出了类、方法和函数的定义,还列出了任何符号在源文件中定义的所有位置。这包括创建变量,以及从其他地方导入符号的位置。这意味着在一个文件中定义并在第二个文件中导入的符号将有两个定义位置,这意味着您将始终看到一个菜单,而不是简单地直接跳转到类定义。您可以通过在 ~/.ctags 中创建一个 ctags 选项文件来解决此问题,

--python-kinds=-i
--exclude=build
--exclude=dist

当您更改源代码时,您的标签文件将过期。如果您创建新的类/函数/方法/等然后跳转到它们,您将不得不重新运行 ctags,如上所示。令人惊讶的是,这并不常见。

我发现 <leader>b 会在工作前暂停一秒钟,这很烦人。原来原因是我的 BClose 插件为 <leader>bd 定义了另一个映射,并且 Vim 在决定调用哪个键映射之前等待查看我是否按下了随后的 d。我从不使用它,所以我在我的 .vimrc 中使用它禁用了它:

autocmd VimEnter * nunmap <Leader>bd

顺便说一句,既然您正在为您的项目生成标记文件,那么也很容易启用击键来“转到定义”文本光标下的符号。请参阅我的博客文章:https ://www.tartley.com/go-to-definition-in-vim-for-python-using-ctags-on-windows

于 2013-06-24T13:43:15.043 回答
4

这是我使用的映射(它们不是我的,虽然我现在真的习惯了):

let g:fuf_modesDisable = []
let g:fuf_mrufile_maxItem = 1000
let g:fuf_mrucmd_maxItem = 400
let g:fuf_mrufile_exclude = '\v\~$|\.(bak|sw[po])$|^(\/\/|\\\\|\/mnt\/)'
nnoremap <silent> <C-n>      :FufBuffer<CR>
nnoremap <silent> <C-p>      :FufFileWithCurrentBufferDir<CR>
nnoremap <silent> <C-f><C-p> :FufFileWithFullCwd<CR>
nnoremap <silent> <C-f>p     :FufFile<CR>
nnoremap <silent> <C-f><C-d> :FufDirWithCurrentBufferDir<CR>
nnoremap <silent> <C-f>d     :FufDirWithFullCwd<CR>
nnoremap <silent> <C-f>D     :FufDir<CR>
nnoremap <silent> <C-j>      :FufMruFile<CR>
nnoremap <silent> <C-k>      :FufMruCmd<CR>
nnoremap <silent> <C-b>      :FufBookmarkDir<CR>
nnoremap <silent> <C-f><C-t> :FufTag<CR>
nnoremap <silent> <C-f>t     :FufTag!<CR>
noremap  <silent> g]         :FufTagWithCursorWord!<CR>
nnoremap <silent> <C-f><C-f> :FufTaggedFile<CR>
nnoremap <silent> <C-f><C-j> :FufJumpList<CR>
nnoremap <silent> <C-f><C-g> :FufChangeList<CR>
nnoremap <silent> <C-f><C-q> :FufQuickfix<CR>
nnoremap <silent> <C-f><C-l> :FufLine<CR>
nnoremap <silent> <C-f><C-h> :FufHelp<CR>
nnoremap <silent> <C-f><C-b> :FufAddBookmark<CR>
vnoremap <silent> <C-f><C-b> :FufAddBookmarkAsSelectedText<CR>
nnoremap <silent> <C-f><C-e> :FufEditInfo<CR>
nnoremap <silent> <C-f><C-r> :FufRenewCache<CR>

我主要使用:对于上次打开的文件来更改缓冲区(并且我删除了所有 buxexplorer 插件)p 来浏览文件/目录

于 2011-09-19T07:32:50.260 回答