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