使用Vim寫博客

| Comments

VimRepress是Vim寫博客的插件中較新的一個,是久未更新的Vimpress的一個衍生版。

雖然不是所有此類插件中功能最多的一個,但VimRepress非常實用,除包含最常用的幾個功能外,還支持Markdown。但是當前版本的VimRepress在轉換Markdown格式的字符串到HTML時,是通過直接調用外部命令markdown來實現的,這顯然只是針對Linux(及其它類UNIX)系統設計的。

為了使VimRepress支持在Windows下使用Markdown寫文章,可以對它做一些改進。

修改VimRepress的源文件blog.vim,在if __name__ == "__main__":這一行的上方加入如下兩個函數:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
def markdown_preview2():
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    import markdown2 as mkd

    global vimpress_temp_dir
    if vimpress_temp_dir == '':
        vimpress_temp_dir = tempfile.mkdtemp(suffix="vimpress")
    temp_htm = os.path.join(vimpress_temp_dir, "vimpress_temp.htm")
    html_heads = \
"""<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
"""
    tmp_file = open(temp_htm, 'w')
    tmp_file.write(html_heads)
    txt = "\n".join(vim.current.buffer[:])
    #txt = unicode(txt,'cp936')
    tmp_file.write(mkd.markdown(txt))
    #tmp_file.write(mkd.markdown("\n".join(vim.current.buffer[:])))
    tmp_file.close()

    webbrowser.open("file://%s" % temp_htm)

def markdown_newpost2():
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    import markdown2 as mkd

    global vimpress_temp_dir
    if vimpress_temp_dir == '':
        vimpress_temp_dir = tempfile.mkdtemp(suffix="vimpress")
    temp_htm = os.path.join(vimpress_temp_dir, "vimpress_post.htm")

    title = ""
    title_s = 0
    try:
        while title_s < 10:
            if vim.current.buffer[title_s].startswith("#"):
                title = vim.current.buffer[title_s].strip('#')
                break
            title_s += 1
    except IndexError:
        pass

    cur_file = vim.eval('expand("%:p")')
    if cur_file is None:
        cur_file = os.path.join(vimpress_temp_dir, "tmp_vimpress.mkd")
        sys.stdout.write("\n\nCurrent buffer saved to %s\n\n" % cur_file)
    vim.command(":w! %s" % cur_file)
    tmp_file = open(temp_htm, 'w')
    tmp_file.write(mkd.markdown("\n".join(vim.current.buffer[:])))
    tmp_file.close()
    sys.stdout.write("Press ENTER to continue.")
    vim.command(":bdelete")
    vim.command(":r %s" % temp_htm)
    blog_new_post(title = title)

這兩個函數修改自原有的markdownpreview()markdownnewpost(),由調用外部的markdown命令改為調用Python的markdown2模塊來實現格式轉換。

然後,修改blog.vim中的命令映射,使VimRepress的:MarkDownPreview:MarkDownNewPost命令在Windows下自動調用上述兩個函數:

1
2
3
4
5
6
7
if has("win32")
    command! -nargs=0 MarkDownPreview exec('py markdown_preview2()')
    command! -nargs=0 MarkDownNewPost exec('py markdown_newpost2()')
else
    command! -nargs=0 MarkDownPreview exec('py markdown_preview()')
    command! -nargs=0 MarkDownNewPost exec('py markdown_newpost()')
endif

最後,只須安裝Python的markdown2模塊就可以用了。

2011-03-23更新:

pentie已合并這些功能到新版本的VimRepress。

2011-04-04更新:

作為Markdown寫博的重度患者,我覺得Vim的其它相關插件都缺乏對Markdown源碼的有效管理,所以我幹脆寫了個新的插件UltraBlog

Comments