【问题标题】:VIM: FuzzyFinder usage, tips, gotchas - how can one make use of this plugin?VIM:FuzzyFinder 的使用、技巧、陷阱——如何使用这个插件?
【发布时间】:2009-12-12 20:29:49
【问题描述】:

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。对于已经使用了很长时间的任何人,您能否演示一下您如何实际组合使用这些命令、您所做的任何映射、使用此工具时应该知道的任何问题?

【问题讨论】:

    标签: vim fuzzyfinder


    【解决方案1】:

    FuzzyFinder 本身对我来说毫无用处。我将它与 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 superuser 回答的原因。

    【讨论】:

    • 我希望有这样的脚本没有 ruby​​ 要求(即 python)
    • FuzzyFinder 一直为我处理子目录。这是配置问题,还是我误解了@Ton 引用的不足?
    • 在我检查时(三年前),您需要键入部分路径才能到达子目录中的文件。也许从那以后情况发生了变化?
    • @TonvandenHeuvel 你真的改善了我的生活
    • 您与“this”的链接已成为 SO 过分热心的“删除任何不符合我们预期的内容”警察的牺牲品。我最近也丢失​​了我写的一些全面的答案,大概是因为它们是为了回答后来被删除的问题。我的同情。
    【解决方案2】:

    聚会有点晚了,但我想补充一点,最新版本的 FuzzyFinder 有一个新命令::FufCoverageFile,这正是你想要的,即:

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

    【讨论】:

    • 另外值得注意的是 g:fuf_coveragefile_globPatterns 变量可以更新为包含您想要使用 FufCoverageFile 搜索的路径/模式。我几乎每分钟都使用 FufCoverageFile 和 FufBuffer ;)
    • 如何在结果之间导航?我不想使用箭头,标签似乎没有向前导航
    【解决方案3】:

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

    map ,f :FufFile **/<CR>
    

    所以你只需要输入:

    ,fTest 
    

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

    HTH

    【讨论】:

      【解决方案4】:

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

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

      例如

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

      【讨论】:

      • 我还要补充一点,我个人认为 Command-T 插件更容易使用,因为您只需输入 t 并开始输入字符。 git.wincent.com/command-t.git/blob_plain/HEAD:/README.txt
      • 使用模糊查找器,我只需按 t 并开始输入字符。几年前安装它时,我可能不得不调整配置​​。 (翻找...)是的,我的 .vimrc 有类似“nnoremap f :FufFile **/”的行。对于我使用的每个模糊查找模式(文件、缓冲区、标签),我都有这样的一行
      【解决方案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 配置。

      查找文件/缓冲区

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

      同样,当您打开几个缓冲区时,按 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 来确保您所在的位置),以便标签文件包含您项目中的所有内容。

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

      陷阱

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

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

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

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

      autocmd VimEnter * nunmap <Leader>bd
      

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

      【讨论】:

        【解决方案6】:

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

        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 浏览文件/目录

        【讨论】:

        • 感谢您的映射。 对我来说是几个 pagedown 键之一,但最好以此为起点。
        • 这可能不是这个地方,但现在我已经切换到 Unite.vim 和 FZF,它们都非常好。
        【解决方案7】:

        好的,在使用 vim fuf 12 年多之后,我终于找到了答案:“如何在 node_module 文件夹之间搜索文件时排除文件夹”: (从@Jonathan复制的答案)

        " 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
        

        【讨论】:

          猜你喜欢
          • 2011-01-11
          • 1970-01-01
          • 2010-10-20
          • 1970-01-01
          • 2021-10-22
          • 2010-09-16
          • 2011-03-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多