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