VIM:FuzzyFinder用法,提示,陷阱 - 如何使用这个插件?

时间:2009-12-12 20:29:49

标签: vim fuzzyfinder

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的内容。对于那些已经使用了很长时间的人,你能说明你实际上如何组合使用这些命令,你做出的任何映射,以及使用它时应该知道的任何问题吗?

6 个答案:

答案 0 :(得分:13)

模糊探测器本身对我来说是无用的。我将它与FuzzyFinder-TextMate和遍历所有文件和子目录的Ruby库结合使用来查找文件,就像Mac上的TextMate的Cmd + T选项一样。您可以在行动here中看到它。

不幸的是,由于原作者停止维护脚本,因此需要花费一些精力才能使其工作。仍有一些人经常向github发布更新。您需要两个脚本fuzzyfinder_textmate.vimfuzzy_file_finder.rb

最新版本与Vim FuzzyFinder 2.22.3结合使用时没有任何问题。你的Vim必须用Ruby支持编译,否则它将无法工作。原作者的blog包含有关如何正确使用它的更多信息。或者,查看我的Vim setup以了解如何使用它。设置定义了两个键映射,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 plugin代替FuzzyFinder。请查看我的this超级用户回答。

答案 1 :(得分:10)

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

>CoverageFile>appcontr
  20: app/controllers/application_controller.rb
  22: app/views/layouts/application.html.erb

答案 2 :(得分:7)

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

map ,f :FufFile **/<CR>

所以你只需输入:

,fTest 

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

HTH

答案 3 :(得分:6)

我使用:FufFile映射到,b,然后键入** /后跟我正在寻找的字符串的前几个字符开始。

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

e.g

,b
**/doc
    13: app/models/document.rb
    75: test/fixtures/documents.yml
    82: test/unit/document_test.rb

答案 4 :(得分: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配置。

查找文件/缓冲区

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

同样,当您打开一些缓冲区时,按&lt; leader&gt; 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解析许多编程语言。输出转到名为“tags”的文件。在项目根目录中运行它是有意义的(使用Vim:pwd和:cd以确保它在你所在的位置),以便标记文件包含项目中的所有内容。

现在您可以按&lt; leader&gt; t查看项目中所有类,函数,方法等的列表。如上所述,开始键入,列表将被过滤到与您键入的内容匹配的列表。使用游标并输入以选择一个,Vim将转到定义该标记的文件/行。

陷阱

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

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

更改源代码时,您的代码文件将过期。如果你创建新的类/函数/方法/等然后跳转到它们,你将不得不重新运行ctags,如上所示。令人惊讶的是,这种情况很少发生。

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

autocmd VimEnter * nunmap <Leader>bd
顺便说一句,既然你正在为你的项目生成标签文件,那么你也很容易通过按键来对文本光标下的符号进行“定义”。请参阅我的博客文章:https://www.tartley.com/go-to-definition-in-vim-for-python-using-ctags-on-windows

答案 5 :(得分: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浏览文件/目录