概述

今天完成了博客新的标签引擎的第一步,vim下markdown文件扩展属性信息.
主要是在vim下保存文件时,自动更新创建日期和修改日期,同时考虑到文章标签方便修改,使用了比较直观的标记模式
主要实现原理还是依赖vim的autocmd功能,在缓冲区保存时触发自定义函数补全必要信息.

"更新markdown信息
function! UpdateMarkdownInfo()
    "如果当前文件的地址不是vimwiki的子文件夹,直接退出
    if stridx(fnamemodify(expand("%:p"),":h"),g:wiki1.path) != 0
        return 
    endif

    let l:filename = expand('%:t:r')
    if l:filename == 'index'
        return
    endif
    let l:title = ''
    let l:create = strftime("%Y-%m-%d_%H:%M:%S")
    let l:change = strftime("%Y-%m-%d_%H:%M:%S")
    let l:tag = []
    let l:ignore = 'false'
    let l:noteInfoLineNumber = -1
    let l:noteInfo=getline('$')
    if stridx(tolower(l:noteInfo),';noteinfo') == 0
        let l:noteInfoLineNumber = line('$')
        let l:arr=split(l:noteInfo)[1:]         "拆分整行为各个属性的键值对
        for i in l:arr                          "遍历键值对
            let l:pair = split(i,'=')           "键值对继续拆分成键和值
            if len(l:pair) == 2
                if l:pair[0] ==? 'create'
                    let l:create = l:pair[1]
                elseif l:pair[0] ==? 'tag'
                    let l:tag = split(l:pair[1],",")
                elseif l:pair[0] ==? 'ignore'
                    let l:ignore = l:pair[1]
                elseif l:pair[0] ==? 'title'
                    let l:title = l:pair[1]
                endif
            endif
        endfor
    endif

    let temp=';NoteInfo' .' title=' . l:title . ' tag=' . join(l:tag,',') . ' create=' . l:create . ' change=' . l:change . ' ignore=' . l:ignore

    if l:noteInfoLineNumber < 0
        let l:noteInfoLineNumber = line("$") + 1
    endif
    call setline(l:noteInfoLineNumber,temp)
endfunction
autocmd BufWrite *.md exec ":call UpdateMarkdownInfo()"

上面代码中必要信息已经添加注释,最终实现的效果,在执行:w保存操作,自动在最后一行追加文件属性信息,如果文件属性信息已存在,则更新文件修改日期.
效果如下:

;NoteInfo title=博客标题 tag= create=2018-04-16_23:12:18 change= ignore=false

之所以单独存储文件的创建日期和修改日期,也是考虑到文件可能在多个计算机上进行分发复制操作,文件级别的日期信息可能会被覆盖掉.
有别于ignore的作用是在web端进行索引时忽略这个文件,这里忽略index就不会在文件末尾追加noteinfo了,同时web端也做了忽略index文件的设计.

2018-04-25

另外,我在每个项目的说明文件里也都有readme.md文件,这个markdown文件是不需要添加noteinfo的…所以这个函数最开始要判断markdown文件是否是vimwiki的子目录