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

med*_*iev 24 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|)
Run Code Online (Sandbox Code Playgroud)

所以我最近才发现了关于FuzzyFinder的问题.对于那些已经使用了很长时间的人来说,你能说明你实际上如何组合使用这些命令,你做出的任何映射,以及使用它时应该知道的任何问题吗?

Ton*_*vel 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>
Run Code Online (Sandbox Code Playgroud)

更新:

现在我使用优秀的Command-T插件而不是FuzzyFinder.看看我的这个超级用户的回答是出于什么原因.


Fel*_*lix 10

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

>CoverageFile>appcontr
  20: app/controllers/application_controller.rb
  22: app/views/layouts/application.html.erb
Run Code Online (Sandbox Code Playgroud)

  • 另外值得注意的是g:fuf_coveragefile_globPatterns变量可以更新为包含要使用FufCoverageFile搜索的路径/模式.我几乎每分钟都使用FufCoverageFile和FufBuffer;) (2认同)

Ste*_*ane 7

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

map ,f :FufFile **/<CR>
Run Code Online (Sandbox Code Playgroud)

所以你只需要输入:

,fTest 
Run Code Online (Sandbox Code Playgroud)

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

HTH


Kri*_*ris 6

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

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

例如

,b
**/doc
    13: app/models/document.rb
    75: test/fixtures/documents.yml
    82: test/unit/document_test.rb
Run Code Online (Sandbox Code Playgroud)


Jon*_*ley 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
Run Code Online (Sandbox Code Playgroud)

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

nnoremap <Leader>f :FufFile **/<cr>
nnoremap <Leader>b :FufBuffer<cr>
nnoremap <Leader>t :FufTag<cr>
Run Code Online (Sandbox Code Playgroud)

并重新启动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>
Run Code Online (Sandbox Code Playgroud)

或在Windows上:

noremap <f12> :!start /min ctags -R --languages=python .<cr>:FufRenewCache<cr>
Run Code Online (Sandbox Code Playgroud)

(/ min是一种特定于Windows的方法,可以在后台运行命令,以便在为非常大的项目编制索引时Vim不会锁定)

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

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

陷阱

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

--python-kinds=-i
--exclude=build
--exclude=dist
Run Code Online (Sandbox Code Playgroud)

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

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

autocmd VimEnter * nunmap <Leader>bd
Run Code Online (Sandbox Code Playgroud)

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