You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nerdtree自定义树形显示:实现Vim日志文件层级内容展示

完全可以实现你的需求,无需改用Emacs

下面是具体的实现方案,基于Nerdtree的自定义文件插件功能,解析你的日志格式并生成层级结构:

1. 编写Nerdtree自定义解析插件

在Vim的Nerdtree插件目录下创建一个解析脚本,用来识别月度日志文件中的层级结构:

在~/.vim/nerdtree_plugin/路径下新建文件diary_parser.vim,写入以下内容:

" ~/.vim/nerdtree_plugin/diary_parser.vim
call NERDTreeCreateFilePlugin('txt')

function! NERDTreeFilePlugin_txt_GetChildren()
    let children = []
    let path = b:NERDTreeFile.path.str()
    let current_date_node = {}

    " 读取目标日志文件的所有行
    let lines = readfile(path)
    for i in range(len(lines))
        let line = lines[i]
        let line_num = i + 1  " Vim行号从1开始计数

        " 匹配一级条目:* 日期格式(如* SUNDAY 28)
        if line =~ '^\* .\+'
            let date_text = substitute(line, '^\* ', '', '')
            let date_node = {
                \ 'text': date_text,
                \ 'path': path,
                \ 'line': line_num,
                \ 'isOpen': 0,
                \ 'children': []
                \ }
            call add(children, date_node)
            let current_date_node = date_node
        " 匹配二级条目:** 事件描述(如** Did thing A),需关联到最近的日期节点
        elseif line =~ '^\*\* .\+' && !empty(current_date_node)
            let event_text = substitute(line, '^\*\* ', '', '')
            let event_node = {
                \ 'text': event_text,
                \ 'path': path,
                \ 'line': line_num,
                \ 'isOpen': 0
                \ }
            call add(current_date_node['children'], event_node)
        endif
    endfor

    return children
endfunction

" 定义节点点击动作:打开对应日志文件并定位到目标行
function! NERDTreeFilePlugin_txt_Action(node)
    if has_key(a:node, 'line')
        execute 'edit ' . fnameescape(a:node.path) . ' +' . a:node.line
    else
        execute 'edit ' . fnameescape(a:node.path)
    endif
endfunction

2. 验证功能

重启Vim后,打开Nerdtree并导航到2024文件夹:

  • 点击月度TXT文件左侧的箭头,会展开该文件下的所有日期节点(*开头的行)
  • 点击日期节点左侧的箭头,会展开该日期下的所有事件短描述节点(**开头的行)
  • 点击任意日期或事件节点,右侧窗口会自动打开对应月度文件,并定位到目标行,展示完整的日志内容

注意事项

  • 请严格遵循日志格式:* 后跟日期、** 后跟事件描述,符号与内容之间必须有空格,否则解析脚本无法识别
  • 如果同一份月度文件中有多个事件条目,都会被归类到最近的日期节点下
  • Nerdtree默认支持节点的折叠/展开操作,可通过箭头或快捷键(如o)控制层级显示

内容的提问来源于stack exchange,提问作者Huagru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 08:47:28