首先安装最新的模糊查找器脚本。然后...
配置
调整 .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