在neovim/vim中搜索所有的markdown标题
这件事, 从我渐渐用nvim取代了obsidian, 就盼望有一天, 能像obsidian的某一个插件能做到的, 在vim中搜索所有的markdown headings, 这也是我觉得nvim体验不如obsidian几个地方之一(另一个当然是preview, 再另一个是创建link没那么方便, 虽然写了插件, 但还是需要先跳转到那个文件才能创建, 而不是obsidian自动提示补全).
现在, 我好像做到了这件事. 在2个极其好用的插件的帮助下(可能某一天我会觉得不再好用, 但是, 当下它就是最好用的, 先享受吧).
一个, 是fzf.vim, 一个是gutentags.vim.
大概来说这两个插件各做了什么事, 以达到这个目的.
fzf.vim提供了:Tags命令, 可以查找所有的tag.
而ctags, 支持markdown, 能生成heading的tag.
这样我们就能查找标题.
但有一个问题, 使得这种方案不太可行. ctags并非增量式的, 一个vault可能很大, 我只不过有几百个markdown文件, 执行ctags就感觉要几十秒. 这样, 重新生成tags就需要很久. gutentags, 是增量式的, 而且默默帮你生成好tags, 不需要自己再执行ctags命令. gugentags唯一需要注意的设置, 只有g:gutentags_project_root
.
gutentags并非没有缺点, 我感觉, 由于它是纯vimscript实现, 速度比较慢, 这个问题倒不大, 由于是异步的, 一般不会有什么感觉. 如果用lua改写, 可能速度会快不少.
作为一个善良的人, 把config也贴出来:
let g:gutentags_add_default_project_roots = 0
let g:gutentags_project_root = ['.gutentags_markdown', '.gutentags']
let g:gutentags_file_list_command = {
\ 'markers': {
\ '.gutentags_markdown': 'ls *.md',
\ },
\ }
let g:gutentags_cache_dir = "填你想给的目录, 不想暴露本人电脑信息"
不过你可能会对gutentags有点困惑, 要是有困惑, 看看这个链接.
还是忍不住想展示一下这个功能有多么好用:
这是在单个文件.
所有文件是:
更棒的是, 这个预览还可以往下滑动.
如果之前的两个功能最多只能和obsidian算平手, 预览这一点, 就可以说这种方法已经胜过obsidian了.