# 使用Vim写博客

VimRepress是Vim写博客的插件中较新的一个,是久未更新的Vimpress的一个衍生版。

虽然不是所有此类插件中功能最多的一个,但VimRepress非常实用,除包含最常用的几个功能外,还支持Markdown。但是当前版本的VimRepress在转换Markdown格式的字符串到HTML时,是通过直接调用外部命令markdown来实现的,这显然只是针对Linux(及其它类UNIX)系统设计的。

为了使VimRepress支持在Windows下使用Markdown写文章,可以对它做一些改进。

修改VimRepress的源文件blog.vim,在if __name__ == "__main__":这一行的上方加入如下两个函数:

```python 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 = \ """ """ 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下自动调用上述两个函数:

```vim 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