代码之家  ›  专栏  ›  技术社区  ›  meder omuraliev

VIM:FuzzyFinder的用法、提示、问题-如何使用这个插件?

  •  24
  • meder omuraliev  · 技术社区  · 15 年前

    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 回复  |  直到 15 年前
        1
  •  13
  •   Community CDub    8 年前

    FuzzyFinder本身对我来说毫无用处。我将它与FuzzyFinder TextMate和一个Ruby库结合使用,该库遍历所有文件和文件 子目录 here

    不幸的是,由于最初的作者停止了对脚本的维护,因此需要一些努力才能使其正常工作。但仍有一些人定期向github发布更新。您将需要两个脚本, fuzzyfinder_textmate.vim fuzzy_file_finder.rb

    最新版本与Vim FuzzyFinder 2.22.3结合使用时不会出现问题。必须使用Ruby支持编译Vim,否则它将无法工作。这个 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 this 超级用户回答我的原因。

        2
  •  10
  •   Felix    13 年前

    派对有点晚了,但我想补充一点,最新版本的FuzzyFinder有一个新命令: :FufCoverageFile

    >CoverageFile>appcontr
      20: app/controllers/application_controller.rb
      22: app/views/layouts/application.html.erb
    
        3
  •  7
  •   Stephane    13 年前

    map ,f :FufFile **/<CR>
    

    因此,您只需键入:

    ,fTest 
    

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

        4
  •  6
  •   Kris    14 年前

    例如

    ,b
    **/doc
        13: app/models/document.rb
        75: test/fixtures/documents.yml
        82: test/unit/document_test.rb
    
        5
  •  5
  •   Jonathan Hartley Zombie    6 年前

    在.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查看当前目录和子目录中的文件列表。开始键入,列表将被筛选为仅与键入内容(模糊)匹配的列表。使用光标键选择匹配项,然后按enter键打开该文件。第一次在一个非常大的新项目中激活它时,可能需要一秒钟来缓存文件名。

    类似地,当有几个缓冲区打开时,按<领导者>b从打开的缓冲区列表中选择。

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

    如果您不习惯为文件添加标签,那么手动添加标签可能会很麻烦。请注意,许多工具都使用标记文件,例如Vim本身将读取这些文件以启用“转到定义”,请参见本答案末尾的链接,因此了解它们可能比您预期的更有价值。

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

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

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

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

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

    戈查斯

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

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

    我发现<领导者>b在工作前会停顿片刻,这很烦人。原来原因是为<定义了另一个映射;领导者>bd由我的BClose插件定义,Vim在决定调用哪个键映射之前,一直在等待我是否按下了后续的d。我从来没有使用过它,所以我在.vimrc中使用它禁用了它:

    autocmd VimEnter * nunmap <Leader>bd
    

    https://www.tartley.com/go-to-definition-in-vim-for-python-using-ctags-on-windows

        6
  •  4
  •   Drasill    13 年前

    以下是我使用的映射(它们不是我的,尽管我现在已经习惯了):

    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插件)