使用 vimwiki 写博客
vimwiki 是 Vim 的一个插件,它可以在 Vim 里写 wiki,它还有日记的功能,还可以直接在 Vim 里生成 html。
普通模式下 \ww
可以进入 wiki 的主页, \w\w
可以写当天的日记,它会在 wiki 的目录下生成一个 diary/yyyy-MM-dd.wiki 的文件,\wi
可以跳转到日记的索引,不过这个索引没什么用,不用管它。我只需要在写博客的时候用\w\w
写当天的日记,然后通过一个脚本根据日记文件的内容生成 wiki 的主页面,也就是 \ww
所在的页面,再生成 html ,把它发布到主机上,或者提交到 github 上就万事大吉。
这就是我写的脚本:
" use vimwiki to blog
" load only once
if exists("g:loaded_vimwiki_blog_auto") || &cp
finish
endif
let g:loaded_vimwiki_blog_auto = 1
"
" 根据日记生成 wiki 的主页面
function! vimwiki#blog#BuildIndex() "
let files = s:allDiaryFiles()
let list = ['%template index', '']
for file in files
let info = s:getFileInfo(expand(file))
let lines = s:getIndexLines(info)
call extend(list, lines)
call add(list, '')
endfor
call s:buildIndex(list)
endfunction "
" 生成 wiki 的主页面,同时也生成 html
function! vimwiki#blog#BuildAll() "
call vimwiki#blog#BuildIndex()
call vimwiki#html#WikiAll2HTML(expand(VimwikiGet('path_html')))
endfunction "
" 获取日记文件,并按时间先后排序,最新的排在前面
function! s:allDiaryFiles() "
let path = expand(VimwikiGet('path'))
let files = split(glob(path . VimwikiGet('diary_rel_path') . "[[:digit:]]*" . VimwikiGet('ext')), '\n')
call sort(files)
call reverse(files)
return files
endfunction "
" 获取日记文件的信息:
" date : 日期(文件名)
" title : 标题(文件内前 5 行指定的 title,没有指定的话就是文件名)
function! s:getFileInfo(path) "
let result = {}
let result.date = fnamemodify(a:path, ':t:r')
let result.title = result.date
let lines = readfile(a:path, '', 5)
for line in lines
if line =~ '^%title '
let result.title = strpart(line, strlen('%title '))
break
endif
endfor
return result
endfunction "
" 根据日记文件的信息生成主页面的行
function! s:getIndexLines(info) "
let result = []
call add(result, "== [[" . VimwikiGet('diary_rel_path') . a:info.date . "|" . a:info.title . "]] ==")
call add(result, a:info.date)
return result
endfunction "
" 将拼好的列表写入主页面
function! s:buildIndex(list) "
let path = expand(VimwikiGet('path'))
let file = path . VimwikiGet('index') . VimwikiGet('ext')
call writefile(a:list, file)
endfunction "
把它放到 ~/.vim/autoload/vimwiki/blog.vim
。
然后在 ~/.vimrc
中加入两行:
nnoremap <Leader>wbi :call vimwiki#blog#BuildIndex()<CR>
nnoremap <Leader>wba :call vimwiki#blog#BuildAll()<CR>
用 \w\w
写完博客,只需要在前五行包含 %title
,就可以使用 \wbi
生成 wiki 的主页面,这时候用 \ww
就可以看到刚才写的文章了,再用 \wba
生成 html 了,发布出去就可以了。