季承成 | CHENGCHENG JI

季承成 | CHENGCHENG JI

计算机科学与信息技术 博士 | Ph.D. in Computer Science and Information Technology

使用Vim写Markdown
(编译,语法高亮和浏览器预览)


概要

使用Node.js的模块来编译md文件到html和pdf文件。
并使用vim脚本来绑定该编译功能到Vim编辑器。
添加vim对md文件的语法高亮支持。
支持一键编译,预览md文件。

编译Markdown文件

  1. 使用Node.js包管理工具npm安装编译md文件所需的模块gulp
//全局安装
$ npm -g i gulp
//依赖安装
$ npm i gulp --save-dev
  1. 安装两个模块,一个用来输出html (github格式),另一个用来输出pdf
//在项目文件夹下
$ npm i gulp-markdown-github-style
$ npm i gulp-markdown-pdf
  1. 写入gulp任务文件
    在项目文件夹下新建名为gulpfile.js的文件:
//载入模块
var gulp = require("gulp");
var markdown = require('gulp-markdown-github-style');
var mdpdf = require('gulp-markdown-pdf');

//接收外部参数,将--file后的参数写入变量file中,和vim宏绑定使用
var file, i = process.argv.indexOf("--file");
if(i>-1) {
    	file = process.argv[i+1];
}
//调用html模块输出, 使用file参数来定位文件源,输出到note_html文件夹中
gulp.task("compileMDToHtml", () =>
    gulp.src(file)
        .pipe(markdown())
        .pipe(gulp.dest('note_html'))
);
//调用pdf模块输出, 同上
gulp.task("compileMDToPdf", () =>
    gulp.src(file)
        .pipe(mdpdf())
        .pipe(gulp.dest('note_pdf'))
);
//安排任务同步进行,此处的回调函数done()为必须
gulp.task("default", gulp.parallel("compileMDToHtml", "compileMDToPdf", function(done) {
  done();
}));

Vim脚本绑定快捷键

.vimrc文件中加入编译部分,该配置文件可在~/.vimrc找到(或新建一个)。

"按F2编译运行,必须打开类型检测
map <F2> :call CompileRunGcc()<CR>
imap <F2> <ESC>:call CompileRunGcc()<CR>
func! CompileRunGcc()
    exec "w" 
    if &filetype == 'c' 
        exec "!g++ % -o %<"
        exec "! ./%<"
    elseif &filetype == 'cpp'
        exec "!g++ % -o %<"
        exec "! ./%<"
    elseif &filetype == 'java' 
        exec "!javac %" 
        exec "!java %<"
    elseif &filetype == 'sh'
        :!./%
    elseif &filetype == 'markdown'
        exec "!gulp --file %"
    endif
endfunc
" 开启文件类型检测
filetype plugin indent on  
" 添加markdown文件类型
autocmd BufNewFile,BufRead *.md set filetype=markdown

添加Markdown语法高亮

添加markdown文件语法高亮
觉得比较好的能在terminal使用的语法高亮文件https://github.com/plasticboy/vim-markdown
syntax/markdown.vim拷贝到 ~/.vim/下,并在.vimrc中加入

" 添加markdown文件语法文件
au! Syntax markdown source ~/.vim/markdown.vim

虽然在terminal下,强调和斜体存在一些问题,不过并不影响使用,毕竟已经可以用网页和pdf来看效果啦。

增加开启浏览器预览功能

既然已经把编译也加进去了,那么再加个自动打开编译后的html来预览的功能吧。
思路是获取生成的html的文件名然后调用默认浏览器打开。
查阅帮助手册:help expand,发现在vim脚本中对当前文件标示符%有如下的扩展:

Modifiers:
                        :p              expand to full path
                        :h              head (last path component removed)
                        :t              tail (last path component only)
                        :r              root (one extension removed)
                        :e              extension only

举一些用法上的例子:

" 假设完整文件路径为: /A/B/C/file.md
%					file.md
%:p					/A/B/C/file.md
%:p:h					/A/B/C/
%:p:t					file.md
%:p:r					/A/B/C/file
%:p:t:r					file
%:r					file
%:e					md

于是我们只要在配置文件.vimrc中,在编译之后加入自动打开该文件的部分即可:

elseif &filetype == 'markdown'
    " 这里改成仅编译html,会更快一些,当然如果喜欢预览pdf也可以自行修改
    exec "!gulp compileMDToHtml --file %"
    " 浏览器开启html预览
    exec "!open ./note_html/%:r.html"
endif

至此使用Vim写markdown,编辑,编译,预览一条龙,撒花。